[6922] Whitespace and newline fixes
[getmangos.git] / src / game / Chat.cpp
blob64e4cd0288c10f21a3c8ac8ea4e42cbabe3115f4
1 /*
2 * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include "Common.h"
20 #include "Language.h"
21 #include "Database/DatabaseEnv.h"
22 #include "WorldPacket.h"
23 #include "WorldSession.h"
24 #include "Opcodes.h"
25 #include "Log.h"
26 #include "World.h"
27 #include "ObjectMgr.h"
28 #include "Player.h"
29 #include "UpdateMask.h"
30 #include "Chat.h"
31 #include "MapManager.h"
32 #include "GridNotifiersImpl.h"
33 #include "CellImpl.h"
35 bool ChatHandler::load_command_table = true;
37 ChatCommand * ChatHandler::getCommandTable()
39 static ChatCommand accountSetCommandTable[] =
41 { "addon", SEC_ADMINISTRATOR, true, &ChatHandler::HandleAccountSetAddonCommand, "", NULL },
42 { "gmlevel", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetGmLevelCommand, "", NULL },
43 { "password", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetPasswordCommand, "", NULL },
44 { NULL, 0, false, NULL, "", NULL }
47 static ChatCommand accountCommandTable[] =
49 { "create", SEC_CONSOLE, true, &ChatHandler::HandleAccountCreateCommand, "", NULL },
50 { "delete", SEC_CONSOLE, true, &ChatHandler::HandleAccountDeleteCommand, "", NULL },
51 { "onlinelist", SEC_CONSOLE, true, &ChatHandler::HandleAccountOnlineListCommand, "", NULL },
52 { "set", SEC_ADMINISTRATOR, true, NULL, "", accountSetCommandTable },
53 { "", SEC_PLAYER, false, &ChatHandler::HandleAccountCommand, "", NULL },
54 { NULL, 0, false, NULL, "", NULL }
57 static ChatCommand serverSetCommandTable[] =
59 { "loglevel", SEC_CONSOLE, true, &ChatHandler::HandleServerSetLogLevelCommand, "", NULL },
60 { "motd", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerSetMotdCommand, "", NULL },
61 { NULL, 0, false, NULL, "", NULL }
64 static ChatCommand serverIdleRestartCommandTable[] =
66 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
67 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerIdleRestartCommand, "", NULL },
68 { NULL, 0, false, NULL, "", NULL }
71 static ChatCommand serverIdleShutdownCommandTable[] =
73 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
74 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerIdleShutDownCommand, "", NULL },
75 { NULL, 0, false, NULL, "", NULL }
78 static ChatCommand serverRestartCommandTable[] =
80 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
81 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerRestartCommand, "", NULL },
82 { NULL, 0, false, NULL, "", NULL }
85 static ChatCommand serverShutdownCommandTable[] =
87 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
88 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCommand, "", NULL },
89 { NULL, 0, false, NULL, "", NULL }
92 static ChatCommand serverCommandTable[] =
94 { "corpses", SEC_GAMEMASTER, true, &ChatHandler::HandleServerCorpsesCommand, "", NULL },
95 { "exit", SEC_CONSOLE, true, &ChatHandler::HandleServerExitCommand, "", NULL },
96 { "idlerestart", SEC_ADMINISTRATOR, true, NULL, "", serverIdleRestartCommandTable },
97 { "idleshutdown", SEC_ADMINISTRATOR, true, NULL, "", serverShutdownCommandTable },
98 { "info", SEC_PLAYER, true, &ChatHandler::HandleServerInfoCommand, "", NULL },
99 { "motd", SEC_PLAYER, true, &ChatHandler::HandleServerMotdCommand, "", NULL },
100 { "restart", SEC_ADMINISTRATOR, true, NULL, "", serverRestartCommandTable },
101 { "shutdown", SEC_ADMINISTRATOR, true, NULL, "", serverShutdownCommandTable },
102 { "set", SEC_ADMINISTRATOR, true, NULL, "", serverSetCommandTable },
103 { NULL, 0, false, NULL, "", NULL }
106 static ChatCommand modifyCommandTable[] =
108 { "hp", SEC_MODERATOR, false, &ChatHandler::HandleModifyHPCommand, "", NULL },
109 { "mana", SEC_MODERATOR, false, &ChatHandler::HandleModifyManaCommand, "", NULL },
110 { "rage", SEC_MODERATOR, false, &ChatHandler::HandleModifyRageCommand, "", NULL },
111 { "energy", SEC_MODERATOR, false, &ChatHandler::HandleModifyEnergyCommand, "", NULL },
112 { "money", SEC_MODERATOR, false, &ChatHandler::HandleModifyMoneyCommand, "", NULL },
113 { "speed", SEC_MODERATOR, false, &ChatHandler::HandleModifySpeedCommand, "", NULL },
114 { "swim", SEC_MODERATOR, false, &ChatHandler::HandleModifySwimCommand, "", NULL },
115 { "scale", SEC_MODERATOR, false, &ChatHandler::HandleModifyScaleCommand, "", NULL },
116 { "bit", SEC_MODERATOR, false, &ChatHandler::HandleModifyBitCommand, "", NULL },
117 { "bwalk", SEC_MODERATOR, false, &ChatHandler::HandleModifyBWalkCommand, "", NULL },
118 { "fly", SEC_MODERATOR, false, &ChatHandler::HandleModifyFlyCommand, "", NULL },
119 { "aspeed", SEC_MODERATOR, false, &ChatHandler::HandleModifyASpeedCommand, "", NULL },
120 { "faction", SEC_MODERATOR, false, &ChatHandler::HandleModifyFactionCommand, "", NULL },
121 { "spell", SEC_MODERATOR, false, &ChatHandler::HandleModifySpellCommand, "", NULL },
122 { "tp", SEC_MODERATOR, false, &ChatHandler::HandleModifyTalentCommand, "", NULL },
123 { "titles", SEC_MODERATOR, false, &ChatHandler::HandleModifyKnownTitlesCommand, "", NULL },
124 { "mount", SEC_MODERATOR, false, &ChatHandler::HandleModifyMountCommand, "", NULL },
125 { "honor", SEC_MODERATOR, false, &ChatHandler::HandleModifyHonorCommand, "", NULL },
126 { "rep", SEC_MODERATOR, false, &ChatHandler::HandleModifyRepCommand, "", NULL },
127 { "arena", SEC_MODERATOR, false, &ChatHandler::HandleModifyArenaCommand, "", NULL },
128 { "drunk", SEC_MODERATOR, false, &ChatHandler::HandleDrunkCommand, "", NULL },
129 { "standstate", SEC_GAMEMASTER, false, &ChatHandler::HandleStandStateCommand, "", NULL },
130 { "morph", SEC_GAMEMASTER, false, &ChatHandler::HandleMorphCommand, "", NULL },
131 { "gender", SEC_ADMINISTRATOR, false, &ChatHandler::HandleModifyGenderCommand, "", NULL },
132 { NULL, 0, false, NULL, "", NULL }
135 static ChatCommand wpCommandTable[] =
137 { "show", SEC_GAMEMASTER, false, &ChatHandler::HandleWpShowCommand, "", NULL },
138 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleWpAddCommand, "", NULL },
139 { "modify", SEC_GAMEMASTER, false, &ChatHandler::HandleWpModifyCommand, "", NULL },
140 { "export", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpExportCommand, "", NULL },
141 { "import", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpImportCommand, "", NULL },
142 { NULL, 0, false, NULL, "", NULL }
145 static ChatCommand banCommandTable[] =
147 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanAccountCommand, "", NULL },
148 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanCharacterCommand, "", NULL },
149 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanIPCommand, "", NULL },
150 { NULL, 0, false, NULL, "", NULL }
153 static ChatCommand baninfoCommandTable[] =
155 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoAccountCommand, "", NULL },
156 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoCharacterCommand, "", NULL },
157 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoIPCommand, "", NULL },
158 { NULL, 0, false, NULL, "", NULL }
161 static ChatCommand banlistCommandTable[] =
163 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListAccountCommand, "", NULL },
164 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListCharacterCommand, "", NULL },
165 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListIPCommand, "", NULL },
166 { NULL, 0, false, NULL, "", NULL }
169 static ChatCommand unbanCommandTable[] =
171 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanAccountCommand, "", NULL },
172 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanCharacterCommand, "", NULL },
173 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanIPCommand, "", NULL },
174 { NULL, 0, false, NULL, "", NULL }
177 static ChatCommand debugCommandTable[] =
179 { "inarc", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugInArcCommand, "", NULL },
180 { "spellfail", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSpellFailCommand, "", NULL },
181 { "setpoi", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetPoiCommand, "", NULL },
182 { "qpartymsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendQuestPartyMsgCommand, "", NULL },
183 { "qinvalidmsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL },
184 { "equiperr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleEquipErrorCommand, "", NULL },
185 { "sellerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSellErrorCommand, "", NULL },
186 { "buyerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBuyErrorCommand, "", NULL },
187 { "sendopcode", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendOpcodeCommand, "", NULL },
188 { "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdateWorldStateCommand, "", NULL },
189 { "ps", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlaySound2Command, "", NULL },
190 { "scn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChannelNotifyCommand, "", NULL },
191 { "scm", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChatMsgCommand, "", NULL },
192 { "getitemstate", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetItemState, "", NULL },
193 { "playsound", SEC_MODERATOR, false, &ChatHandler::HandlePlaySoundCommand, "", NULL },
194 { "update", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdate, "", NULL },
195 { "setvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetValue, "", NULL },
196 { "getvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetValue, "", NULL },
197 { "Mod32Value", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMod32Value, "", NULL },
198 { "anim", SEC_GAMEMASTER, false, &ChatHandler::HandleAnimCommand, "", NULL },
199 { "lootrecipient", SEC_GAMEMASTER, false, &ChatHandler::HandleGetLootRecipient, "", NULL },
200 { "arena", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugArenaCommand, "", NULL },
201 { NULL, 0, false, NULL, "", NULL }
204 static ChatCommand eventCommandTable[] =
206 { "activelist", SEC_GAMEMASTER, true, &ChatHandler::HandleEventActiveListCommand, "", NULL },
207 { "start", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStartCommand, "", NULL },
208 { "stop", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStopCommand, "", NULL },
209 { "", SEC_GAMEMASTER, true, &ChatHandler::HandleEventInfoCommand, "", NULL },
210 { NULL, 0, false, NULL, "", NULL }
213 static ChatCommand learnCommandTable[] =
215 { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllCommand, "", NULL },
216 { "all_gm", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllGMCommand, "", NULL },
217 { "all_crafts", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllCraftsCommand, "", NULL },
218 { "all_default", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL },
219 { "all_lang", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllLangCommand, "", NULL },
220 { "all_myclass", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL },
221 { "all_myspells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL },
222 { "all_mytalents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL },
223 { "all_recipes", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL },
224 { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnCommand, "", NULL },
225 { NULL, 0, false, NULL, "", NULL }
228 static ChatCommand reloadCommandTable[] =
230 { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllCommand, "", NULL },
231 { "all_loot", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLootCommand, "", NULL },
232 { "all_npc", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllNpcCommand, "", NULL },
233 { "all_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllQuestCommand, "", NULL },
234 { "all_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL },
235 { "all_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllSpellCommand, "", NULL },
236 { "all_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllItemCommand, "", NULL },
237 { "all_locales", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL },
239 { "config", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadConfigCommand, "", NULL },
241 { "areatrigger_tavern", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL },
242 { "areatrigger_teleport", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL },
243 { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL },
244 { "event_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL },
245 { "command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommandCommand, "", NULL },
246 { "creature_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL },
247 { "creature_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL },
248 { "creature_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL },
249 { "db_script_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadDbScriptStringCommand, "", NULL },
250 { "disenchant_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL },
251 { "fishing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL },
252 { "game_graveyard_zone", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL },
253 { "game_tele", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameTeleCommand, "", NULL },
254 { "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL },
255 { "gameobject_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL },
256 { "gameobject_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL },
257 { "gameobject_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL },
258 { "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
259 { "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
260 { "mangos_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadMangosStringCommand, "", NULL },
261 { "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
262 { "npc_option", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcOptionCommand, "", NULL },
263 { "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
264 { "npc_vendor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL },
265 { "page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPageTextsCommand, "", NULL },
266 { "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
267 { "prospecting_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
268 { "quest_mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL },
269 { "quest_end_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL },
270 { "quest_start_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL },
271 { "quest_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL },
272 { "reference_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL },
273 { "reserved_name", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadReservedNameCommand, "", NULL },
274 { "skill_discovery_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
275 { "skill_extra_item_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL },
276 { "skill_fishing_base_level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL },
277 { "skinning_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL },
278 { "spell_affect", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL },
279 { "spell_chain", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellChainCommand, "", NULL },
280 { "spell_elixir", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL },
281 { "spell_learn_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL },
282 { "spell_pet_auras", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL },
283 { "spell_proc_event", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL },
284 { "spell_script_target", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL },
285 { "spell_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL },
286 { "spell_target_position", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL },
287 { "spell_threats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL },
288 { "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
289 { "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
290 { "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
291 { "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
292 { "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
293 { "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
295 { "", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommand, "", NULL },
296 { NULL, 0, false, NULL, "", NULL }
299 static ChatCommand honorCommandTable[] =
301 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleAddHonorCommand, "", NULL },
302 { "addkill", SEC_GAMEMASTER, false, &ChatHandler::HandleHonorAddKillCommand, "", NULL },
303 { "update", SEC_GAMEMASTER, false, &ChatHandler::HandleUpdateHonorFieldsCommand, "", NULL },
304 { NULL, 0, false, NULL, "", NULL }
307 static ChatCommand guildCommandTable[] =
309 { "create", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildCreateCommand, "", NULL },
310 { "delete", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildDeleteCommand, "", NULL },
311 { "invite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildInviteCommand, "", NULL },
312 { "uninvite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildUninviteCommand, "", NULL },
313 { "rank", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildRankCommand, "", NULL },
314 { NULL, 0, false, NULL, "", NULL }
317 static ChatCommand lookupPlayerCommandTable[] =
319 { "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
320 { "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL },
321 { "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL },
322 { NULL, 0, false, NULL, "", NULL }
325 static ChatCommand lookupCommandTable[] =
327 { "area", SEC_MODERATOR, true, &ChatHandler::HandleLookupAreaCommand, "", NULL },
328 { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupCreatureCommand, "", NULL },
329 { "event", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupEventCommand, "", NULL },
330 { "faction", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupFactionCommand, "", NULL },
331 { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemCommand, "", NULL },
332 { "itemset", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemSetCommand, "", NULL },
333 { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupObjectCommand, "", NULL },
334 { "quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupQuestCommand, "", NULL },
335 { "player", SEC_GAMEMASTER, true, NULL, "", lookupPlayerCommandTable },
336 { "skill", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSkillCommand, "", NULL },
337 { "spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSpellCommand, "", NULL },
338 { "tele", SEC_MODERATOR, true, &ChatHandler::HandleLookupTeleCommand, "", NULL },
339 { NULL, 0, false, NULL, "", NULL }
342 static ChatCommand resetCommandTable[] =
344 { "honor", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetHonorCommand, "", NULL },
345 { "level", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetLevelCommand, "", NULL },
346 { "spells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetSpellsCommand, "", NULL },
347 { "stats", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetStatsCommand, "", NULL },
348 { "talents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetTalentsCommand, "", NULL },
349 { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetAllCommand, "", NULL },
350 { NULL, 0, false, NULL, "", NULL }
353 static ChatCommand castCommandTable[] =
355 { "back", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastBackCommand, "", NULL },
356 { "dist", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastDistCommand, "", NULL },
357 { "self", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastSelfCommand, "", NULL },
358 { "target", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastTargetCommand, "", NULL },
359 { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastCommand, "", NULL },
360 { NULL, 0, false, NULL, "", NULL }
363 static ChatCommand pdumpCommandTable[] =
365 { "load", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadPDumpCommand, "", NULL },
366 { "write", SEC_ADMINISTRATOR, true, &ChatHandler::HandleWritePDumpCommand, "", NULL },
367 { NULL, 0, false, NULL, "", NULL }
370 static ChatCommand listCommandTable[] =
372 { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListCreatureCommand, "", NULL },
373 { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListItemCommand, "", NULL },
374 { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListObjectCommand, "", NULL },
375 { "auras", SEC_ADMINISTRATOR, false, &ChatHandler::HandleListAurasCommand, "", NULL },
376 { NULL, 0, false, NULL, "", NULL }
379 static ChatCommand teleCommandTable[] =
381 { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddTeleCommand, "", NULL },
382 { "del", SEC_ADMINISTRATOR, true, &ChatHandler::HandleDelTeleCommand, "", NULL },
383 { "name", SEC_MODERATOR, true, &ChatHandler::HandleNameTeleCommand, "", NULL },
384 { "group", SEC_MODERATOR, false, &ChatHandler::HandleGroupTeleCommand, "", NULL },
385 { "", SEC_MODERATOR, false, &ChatHandler::HandleTeleCommand, "", NULL },
386 { NULL, 0, false, NULL, "", NULL }
389 static ChatCommand npcCommandTable[] =
391 { "say", SEC_MODERATOR, false, &ChatHandler::HandleNpcSayCommand, "", NULL },
392 { "textemote", SEC_MODERATOR, false, &ChatHandler::HandleNpcTextEmoteCommand, "", NULL },
393 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcAddCommand, "", NULL },
394 { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcDeleteCommand, "", NULL },
395 { "spawndist", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSpawnDistCommand, "", NULL },
396 { "spawntime", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSpawnTimeCommand, "", NULL },
397 { "factionid", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFactionIdCommand, "", NULL },
398 { "addmove", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcAddMoveCommand, "", NULL },
399 { "setmovetype", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetMoveTypeCommand, "", NULL },
400 { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcMoveCommand, "", NULL },
401 { "changelevel", SEC_GAMEMASTER, false, &ChatHandler::HandleChangeLevelCommand, "", NULL },
402 { "setmodel", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetModelCommand, "", NULL },
403 { "additem", SEC_GAMEMASTER, false, &ChatHandler::HandleAddVendorItemCommand, "", NULL },
404 { "delitem", SEC_GAMEMASTER, false, &ChatHandler::HandleDelVendorItemCommand, "", NULL },
405 { "flag", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFlagCommand, "", NULL },
406 { "changeentry", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcChangeEntryCommand, "", NULL },
407 { "info", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcInfoCommand, "", NULL },
408 { "playemote", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcPlayEmoteCommand, "", NULL },
409 { "follow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFollowCommand, "", NULL },
410 { "unfollow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcUnFollowCommand, "", NULL },
411 { "whisper", SEC_MODERATOR, false, &ChatHandler::HandleNpcWhisperCommand, "", NULL },
412 { "yell", SEC_MODERATOR, false, &ChatHandler::HandleNpcYellCommand, "", NULL },
413 { "tame", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcTameCommand, "", NULL },
415 //{ TODO: fix or remove this commands
416 { "name", SEC_GAMEMASTER, false, &ChatHandler::HandleNameCommand, "", NULL },
417 { "subname", SEC_GAMEMASTER, false, &ChatHandler::HandleSubNameCommand, "", NULL },
418 { "addweapon", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddWeaponCommand, "", NULL },
421 { NULL, 0, false, NULL, "", NULL }
424 static ChatCommand goCommandTable[] =
426 { "grid", SEC_MODERATOR, false, &ChatHandler::HandleGoGridCommand, "", NULL },
427 { "creature", SEC_GAMEMASTER, false, &ChatHandler::HandleGoCreatureCommand, "", NULL },
428 { "object", SEC_GAMEMASTER, false, &ChatHandler::HandleGoObjectCommand, "", NULL },
429 { "trigger", SEC_GAMEMASTER, false, &ChatHandler::HandleGoTriggerCommand, "", NULL },
430 { "graveyard", SEC_GAMEMASTER, false, &ChatHandler::HandleGoGraveyardCommand, "", NULL },
431 { "zonexy", SEC_MODERATOR, false, &ChatHandler::HandleGoZoneXYCommand, "", NULL },
432 { "xy", SEC_MODERATOR, false, &ChatHandler::HandleGoXYCommand, "", NULL },
433 { "xyz", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL },
434 { "", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL },
435 { NULL, 0, false, NULL, "", NULL }
438 static ChatCommand gobjectCommandTable[] =
440 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectCommand, "", NULL },
441 { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleDelObjectCommand, "", NULL },
442 { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleTargetObjectCommand, "", NULL },
443 { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleTurnObjectCommand, "", NULL },
444 { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleMoveObjectCommand, "", NULL },
445 { "near", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearObjectCommand, "", NULL },
446 { NULL, 0, false, NULL, "", NULL }
449 static ChatCommand questCommandTable[] =
451 { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddQuest, "", NULL },
452 { "complete", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCompleteQuest, "", NULL },
453 { "remove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRemoveQuest, "", NULL },
454 { NULL, 0, false, NULL, "", NULL }
457 static ChatCommand gmCommandTable[] =
459 { "chat", SEC_MODERATOR, false, &ChatHandler::HandleGMChatCommand, "", NULL },
460 { "ingame", SEC_PLAYER, true, &ChatHandler::HandleGMListIngameCommand, "", NULL },
461 { "list", SEC_ADMINISTRATOR, true, &ChatHandler::HandleGMListFullCommand, "", NULL },
462 { "visible", SEC_MODERATOR, false, &ChatHandler::HandleVisibleCommand, "", NULL },
463 { "fly", SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlyModeCommand, "", NULL },
464 { "", SEC_MODERATOR, false, &ChatHandler::HandleGMmodeCommand, "", NULL },
465 { NULL, 0, false, NULL, "", NULL }
468 static ChatCommand instanceCommandTable[] =
470 { "listbinds", SEC_MODERATOR, false, &ChatHandler::HandleInstanceListBindsCommand, "", NULL },
471 { "unbind", SEC_MODERATOR, false, &ChatHandler::HandleInstanceUnbindCommand, "", NULL },
472 { "stats", SEC_MODERATOR, true, &ChatHandler::HandleInstanceStatsCommand, "", NULL },
473 { "savedata", SEC_MODERATOR, false, &ChatHandler::HandleInstanceSaveDataCommand, "", NULL },
474 { NULL, 0, false, NULL, "", NULL }
477 static ChatCommand commandTable[] =
479 { "account", SEC_PLAYER, true, NULL, "", accountCommandTable },
480 { "gm", SEC_MODERATOR, true, NULL, "", gmCommandTable },
481 { "npc", SEC_MODERATOR, false, NULL, "", npcCommandTable },
482 { "go", SEC_MODERATOR, false, NULL, "", goCommandTable },
483 { "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable },
484 { "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable },
485 { "debug", SEC_MODERATOR, false, NULL, "", debugCommandTable },
486 { "tele", SEC_MODERATOR, true, NULL, "", teleCommandTable },
487 { "event", SEC_GAMEMASTER, false, NULL, "", eventCommandTable },
488 { "gobject", SEC_GAMEMASTER, false, NULL, "", gobjectCommandTable },
489 { "honor", SEC_GAMEMASTER, false, NULL, "", honorCommandTable },
490 { "wp", SEC_GAMEMASTER, false, NULL, "", wpCommandTable },
491 { "quest", SEC_ADMINISTRATOR, false, NULL, "", questCommandTable },
492 { "reload", SEC_ADMINISTRATOR, true, NULL, "", reloadCommandTable },
493 { "list", SEC_ADMINISTRATOR, true, NULL, "", listCommandTable },
494 { "lookup", SEC_ADMINISTRATOR, true, NULL, "", lookupCommandTable },
495 { "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable },
496 { "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable },
497 { "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable },
498 { "reset", SEC_ADMINISTRATOR, false, NULL, "", resetCommandTable },
499 { "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable },
500 { "server", SEC_ADMINISTRATOR, true, NULL, "", serverCommandTable },
502 { "aura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAuraCommand, "", NULL },
503 { "unaura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnAuraCommand, "", NULL },
504 { "announce", SEC_MODERATOR, true, &ChatHandler::HandleAnnounceCommand, "", NULL },
505 { "notify", SEC_MODERATOR, true, &ChatHandler::HandleNotifyCommand, "", NULL },
506 { "goname", SEC_MODERATOR, false, &ChatHandler::HandleGonameCommand, "", NULL },
507 { "namego", SEC_MODERATOR, false, &ChatHandler::HandleNamegoCommand, "", NULL },
508 { "groupgo", SEC_MODERATOR, false, &ChatHandler::HandleGroupgoCommand, "", NULL },
509 { "commands", SEC_PLAYER, true, &ChatHandler::HandleCommandsCommand, "", NULL },
510 { "demorph", SEC_GAMEMASTER, false, &ChatHandler::HandleDeMorphCommand, "", NULL },
511 { "die", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDieCommand, "", NULL },
512 { "revive", SEC_ADMINISTRATOR, false, &ChatHandler::HandleReviveCommand, "", NULL },
513 { "dismount", SEC_PLAYER, false, &ChatHandler::HandleDismountCommand, "", NULL },
514 { "gps", SEC_MODERATOR, false, &ChatHandler::HandleGPSCommand, "", NULL },
515 { "guid", SEC_GAMEMASTER, false, &ChatHandler::HandleGUIDCommand, "", NULL },
516 { "help", SEC_PLAYER, true, &ChatHandler::HandleHelpCommand, "", NULL },
517 { "itemmove", SEC_GAMEMASTER, false, &ChatHandler::HandleItemMoveCommand, "", NULL },
518 { "cooldown", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCooldownCommand, "", NULL },
519 { "unlearn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnLearnCommand, "", NULL },
520 { "distance", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetDistanceCommand, "", NULL },
521 { "recall", SEC_MODERATOR, false, &ChatHandler::HandleRecallCommand, "", NULL },
522 { "save", SEC_PLAYER, false, &ChatHandler::HandleSaveCommand, "", NULL },
523 { "saveall", SEC_MODERATOR, true, &ChatHandler::HandleSaveAllCommand, "", NULL },
524 { "kick", SEC_GAMEMASTER, true, &ChatHandler::HandleKickPlayerCommand, "", NULL },
525 { "ban", SEC_ADMINISTRATOR, true, NULL, "", banCommandTable },
526 { "unban", SEC_ADMINISTRATOR, true, NULL, "", unbanCommandTable },
527 { "baninfo", SEC_ADMINISTRATOR, false, NULL, "", baninfoCommandTable },
528 { "banlist", SEC_ADMINISTRATOR, true, NULL, "", banlistCommandTable },
529 { "plimit", SEC_ADMINISTRATOR, true, &ChatHandler::HandlePLimitCommand, "", NULL },
530 { "start", SEC_PLAYER, false, &ChatHandler::HandleStartCommand, "", NULL },
531 { "taxicheat", SEC_MODERATOR, false, &ChatHandler::HandleTaxiCheatCommand, "", NULL },
532 { "allowmove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAllowMovementCommand, "", NULL },
533 { "linkgrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLinkGraveCommand, "", NULL },
534 { "neargrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearGraveCommand, "", NULL },
535 { "explorecheat", SEC_ADMINISTRATOR, false, &ChatHandler::HandleExploreCheatCommand, "", NULL },
536 { "hover", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHoverCommand, "", NULL },
537 { "levelup", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLevelUpCommand, "", NULL },
538 { "showarea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleShowAreaCommand, "", NULL },
539 { "hidearea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHideAreaCommand, "", NULL },
540 { "additem", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemCommand, "", NULL },
541 { "additemset", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemSetCommand, "", NULL },
542 { "bank", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBankCommand, "", NULL },
543 { "wchange", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeWeather, "", NULL },
544 { "ticket", SEC_GAMEMASTER, true, &ChatHandler::HandleTicketCommand, "", NULL },
545 { "delticket", SEC_GAMEMASTER, true, &ChatHandler::HandleDelTicketCommand, "", NULL },
546 { "maxskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMaxSkillCommand, "", NULL },
547 { "setskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetSkillCommand, "", NULL },
548 { "whispers", SEC_MODERATOR, false, &ChatHandler::HandleWhispersCommand, "", NULL },
549 { "pinfo", SEC_GAMEMASTER, true, &ChatHandler::HandlePInfoCommand, "", NULL },
550 { "password", SEC_PLAYER, false, &ChatHandler::HandlePasswordCommand, "", NULL },
551 { "lockaccount", SEC_PLAYER, false, &ChatHandler::HandleLockAccountCommand, "", NULL },
552 { "respawn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRespawnCommand, "", NULL },
553 { "senditems", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendItemsCommand, "", NULL },
554 { "sendmail", SEC_MODERATOR, true, &ChatHandler::HandleSendMailCommand, "", NULL },
555 { "sendmoney", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMoneyCommand, "", NULL },
556 { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleRenameCommand, "", NULL },
557 { "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL },
558 { "mute", SEC_GAMEMASTER, true, &ChatHandler::HandleMuteCommand, "", NULL },
559 { "unmute", SEC_GAMEMASTER, true, &ChatHandler::HandleUnmuteCommand, "", NULL },
560 { "movegens", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMovegensCommand, "", NULL },
561 { "cometome", SEC_ADMINISTRATOR, false, &ChatHandler::HandleComeToMeCommand, "", NULL },
562 { "damage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDamageCommand, "", NULL },
563 { "combatstop", SEC_GAMEMASTER, false, &ChatHandler::HandleCombatStopCommand, "", NULL },
564 { "flusharenapoints", SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL },
565 { "chardelete", SEC_CONSOLE, true, &ChatHandler::HandleCharacterDeleteCommand, "", NULL },
566 { "sendmessage", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMessageCommand, "", NULL },
567 { "repairitems", SEC_GAMEMASTER, false, &ChatHandler::HandleRepairitemsCommand, "", NULL },
568 { "waterwalk", SEC_GAMEMASTER, false, &ChatHandler::HandleWaterwalkCommand, "", NULL },
570 { NULL, 0, false, NULL, "", NULL }
573 if(load_command_table)
575 load_command_table = false;
577 QueryResult *result = WorldDatabase.Query("SELECT name,security,help FROM command");
578 if (result)
582 Field *fields = result->Fetch();
583 std::string name = fields[0].GetCppString();
584 for(uint32 i = 0; commandTable[i].Name != NULL; i++)
586 if (name == commandTable[i].Name)
588 commandTable[i].SecurityLevel = (uint16)fields[1].GetUInt16();
589 commandTable[i].Help = fields[2].GetCppString();
591 if(commandTable[i].ChildCommands != NULL)
593 ChatCommand *ptable = commandTable[i].ChildCommands;
594 for(uint32 j = 0; ptable[j].Name != NULL; j++)
596 // first case for "" named subcommand
597 if (ptable[j].Name[0]=='\0' && name == commandTable[i].Name ||
598 name == fmtstring("%s %s", commandTable[i].Name, ptable[j].Name) )
600 ptable[j].SecurityLevel = (uint16)fields[1].GetUInt16();
601 ptable[j].Help = fields[2].GetCppString();
606 } while(result->NextRow());
607 delete result;
611 return commandTable;
614 const char *ChatHandler::GetMangosString(int32 entry) const
616 return m_session->GetMangosString(entry);
619 bool ChatHandler::isAvailable(ChatCommand const& cmd) const
621 // check security level only for simple command (without child commands)
622 return m_session->GetSecurity() >= cmd.SecurityLevel;
625 bool ChatHandler::hasStringAbbr(const char* name, const char* part)
627 // non "" command
628 if( *name )
630 // "" part from non-"" command
631 if( !*part )
632 return false;
634 for(;;)
636 if( !*part )
637 return true;
638 else if( !*name )
639 return false;
640 else if( tolower( *name ) != tolower( *part ) )
641 return false;
642 ++name; ++part;
645 // allow with any for ""
647 return true;
650 void ChatHandler::SendSysMessage(const char *str)
652 WorldPacket data;
654 // need copy to prevent corruption by strtok call in LineFromMessage original string
655 char* buf = strdup(str);
656 char* pos = buf;
658 while(char* line = LineFromMessage(pos))
660 FillSystemMessageData(&data, line);
661 m_session->SendPacket(&data);
664 free(buf);
667 void ChatHandler::SendGlobalSysMessage(const char *str)
669 // Chat output
670 WorldPacket data;
672 // need copy to prevent corruption by strtok call in LineFromMessage original string
673 char* buf = strdup(str);
674 char* pos = buf;
676 while(char* line = LineFromMessage(pos))
678 FillSystemMessageData(&data, line);
679 sWorld.SendGlobalMessage(&data);
682 free(buf);
685 void ChatHandler::SendSysMessage(int32 entry)
687 SendSysMessage(GetMangosString(entry));
690 void ChatHandler::PSendSysMessage(int32 entry, ...)
692 const char *format = GetMangosString(entry);
693 va_list ap;
694 char str [1024];
695 va_start(ap, entry);
696 vsnprintf(str,1024,format, ap );
697 va_end(ap);
698 SendSysMessage(str);
701 void ChatHandler::PSendSysMessage(const char *format, ...)
703 va_list ap;
704 char str [1024];
705 va_start(ap, format);
706 vsnprintf(str,1024,format, ap );
707 va_end(ap);
708 SendSysMessage(str);
711 bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, const std::string& fullcmd)
713 char const* oldtext = text;
714 std::string cmd = "";
716 while (*text != ' ' && *text != '\0')
718 cmd += *text;
719 ++text;
722 while (*text == ' ') ++text;
724 for(uint32 i = 0; table[i].Name != NULL; i++)
726 if( !hasStringAbbr(table[i].Name, cmd.c_str()) )
727 continue;
729 // select subcommand from child commands list
730 if(table[i].ChildCommands != NULL)
732 if(!ExecuteCommandInTable(table[i].ChildCommands, text, fullcmd))
734 if(text && text[0] != '\0')
735 SendSysMessage(LANG_NO_SUBCMD);
736 else
737 SendSysMessage(LANG_CMD_SYNTAX);
739 ShowHelpForCommand(table[i].ChildCommands,text);
742 return true;
745 // must be available and have handler
746 if(!table[i].Handler || !isAvailable(table[i]))
747 continue;
749 SetSentErrorMessage(false);
750 // table[i].Name == "" is special case: send original command to handler
751 if((this->*(table[i].Handler))(strlen(table[i].Name)!=0 ? text : oldtext))
753 if(table[i].SecurityLevel > SEC_PLAYER)
755 // chat case
756 if(m_session)
758 Player* p = m_session->GetPlayer();
759 uint64 sel_guid = p->GetSelection();
760 sLog.outCommand(m_session->GetAccountId(),"Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
761 fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
762 GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
766 // some commands have custom error messages. Don't send the default one in these cases.
767 else if(!sentErrorMessage)
769 if(!table[i].Help.empty())
770 SendSysMessage(table[i].Help.c_str());
771 else
772 SendSysMessage(LANG_CMD_SYNTAX);
775 return true;
778 return false;
781 int ChatHandler::ParseCommands(const char* text)
783 ASSERT(text);
784 ASSERT(*text);
786 //if(m_session->GetSecurity() == 0)
787 // return 0;
789 /// chat case (.command or !command format)
790 if(m_session)
792 if(text[0] != '!' && text[0] != '.')
793 return 0;
796 /// ignore single . and ! in line
797 if(strlen(text) < 2)
798 return 0;
800 /// ignore messages staring from many dots.
801 if(text[0] == '.' && text[1] == '.' || text[0] == '!' && text[1] == '!')
802 return 0;
804 /// skip first . or ! (in console allowed use command with . and ! and without its)
805 if(text[0] == '!' || text[0] == '.')
806 ++text;
808 std::string fullcmd = text; // original `text` can't be used. It content destroyed in command code processing.
810 if(!ExecuteCommandInTable(getCommandTable(), text, fullcmd))
811 SendSysMessage(LANG_NO_CMD);
813 return 1;
816 bool ChatHandler::ShowHelpForSubCommands(ChatCommand *table, char const* cmd, char const* subcmd)
818 std::string list;
819 for(uint32 i = 0; table[i].Name != NULL; ++i)
821 // must be available (ignore handler existence for show command with possibe avalable subcomands
822 if(!isAvailable(table[i]))
823 continue;
825 /// for empty subcmd show all available
826 if( *subcmd && !hasStringAbbr(table[i].Name, subcmd))
827 continue;
829 if(m_session)
830 list += "\n ";
831 else
832 list += "\n\r ";
834 list += table[i].Name;
836 if(table[i].ChildCommands)
837 list += " ...";
840 if(list.empty())
841 return false;
843 if(table==getCommandTable())
845 SendSysMessage(LANG_AVIABLE_CMD);
846 PSendSysMessage("%s",list.c_str());
848 else
849 PSendSysMessage(LANG_SUBCMDS_LIST,cmd,list.c_str());
851 return true;
854 bool ChatHandler::ShowHelpForCommand(ChatCommand *table, const char* cmd)
856 if(*cmd)
858 for(uint32 i = 0; table[i].Name != NULL; ++i)
860 // must be available (ignore handler existence for show command with possibe avalable subcomands
861 if(!isAvailable(table[i]))
862 continue;
864 if( !hasStringAbbr(table[i].Name, cmd) )
865 continue;
867 // have subcommand
868 char const* subcmd = (*cmd) ? strtok(NULL, " ") : "";
870 if(table[i].ChildCommands && subcmd && *subcmd)
872 if(ShowHelpForCommand(table[i].ChildCommands, subcmd))
873 return true;
876 if(!table[i].Help.empty())
877 SendSysMessage(table[i].Help.c_str());
879 if(table[i].ChildCommands)
880 if(ShowHelpForSubCommands(table[i].ChildCommands,table[i].Name,subcmd ? subcmd : ""))
881 return true;
883 return !table[i].Help.empty();
886 else
888 for(uint32 i = 0; table[i].Name != NULL; ++i)
890 // must be available (ignore handler existence for show command with possibe avalable subcomands
891 if(!isAvailable(table[i]))
892 continue;
894 if(strlen(table[i].Name))
895 continue;
897 if(!table[i].Help.empty())
898 SendSysMessage(table[i].Help.c_str());
900 if(table[i].ChildCommands)
901 if(ShowHelpForSubCommands(table[i].ChildCommands,"",""))
902 return true;
904 return !table[i].Help.empty();
908 return ShowHelpForSubCommands(table,"",cmd);
911 //Note: target_guid used only in CHAT_MSG_WHISPER_INFORM mode (in this case channelName ignored)
912 void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit *speaker)
914 uint32 messageLength = (message ? strlen(message) : 0) + 1;
916 data->Initialize(SMSG_MESSAGECHAT, 100); // guess size
917 *data << uint8(type);
918 if ((type != CHAT_MSG_CHANNEL && type != CHAT_MSG_WHISPER) || language == LANG_ADDON)
919 *data << uint32(language);
920 else
921 *data << uint32(LANG_UNIVERSAL);
923 switch(type)
925 case CHAT_MSG_SAY:
926 case CHAT_MSG_PARTY:
927 case CHAT_MSG_RAID:
928 case CHAT_MSG_GUILD:
929 case CHAT_MSG_OFFICER:
930 case CHAT_MSG_YELL:
931 case CHAT_MSG_WHISPER:
932 case CHAT_MSG_CHANNEL:
933 case CHAT_MSG_RAID_LEADER:
934 case CHAT_MSG_RAID_WARNING:
935 case CHAT_MSG_BG_SYSTEM_NEUTRAL:
936 case CHAT_MSG_BG_SYSTEM_ALLIANCE:
937 case CHAT_MSG_BG_SYSTEM_HORDE:
938 case CHAT_MSG_BATTLEGROUND:
939 case CHAT_MSG_BATTLEGROUND_LEADER:
940 target_guid = session ? session->GetPlayer()->GetGUID() : 0;
941 break;
942 case CHAT_MSG_MONSTER_SAY:
943 case CHAT_MSG_MONSTER_PARTY:
944 case CHAT_MSG_MONSTER_YELL:
945 case CHAT_MSG_MONSTER_WHISPER:
946 case CHAT_MSG_MONSTER_EMOTE:
947 case CHAT_MSG_RAID_BOSS_WHISPER:
948 case CHAT_MSG_RAID_BOSS_EMOTE:
950 *data << uint64(speaker->GetGUID());
951 *data << uint32(0); // 2.1.0
952 *data << uint32(strlen(speaker->GetName()) + 1);
953 *data << speaker->GetName();
954 uint64 listener_guid = 0;
955 *data << uint64(listener_guid);
956 if(listener_guid && !IS_PLAYER_GUID(listener_guid))
958 *data << uint32(1); // string listener_name_length
959 *data << uint8(0); // string listener_name
961 *data << uint32(messageLength);
962 *data << message;
963 *data << uint8(0);
964 return;
966 default:
967 if (type != CHAT_MSG_REPLY && type != CHAT_MSG_IGNORED && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
968 target_guid = 0; // only for CHAT_MSG_WHISPER_INFORM used original value target_guid
969 break;
972 *data << uint64(target_guid); // there 0 for BG messages
973 *data << uint32(0); // can be chat msg group or something
975 if (type == CHAT_MSG_CHANNEL)
977 ASSERT(channelName);
978 *data << channelName;
981 *data << uint64(target_guid);
982 *data << uint32(messageLength);
983 *data << message;
984 if(session != 0 && type != CHAT_MSG_REPLY && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
985 *data << uint8(session->GetPlayer()->chatTag());
986 else
987 *data << uint8(0);
990 Player * ChatHandler::getSelectedPlayer()
992 if(!m_session)
993 return NULL;
995 uint64 guid = m_session->GetPlayer()->GetSelection();
997 if (guid == 0)
998 return m_session->GetPlayer();
1000 return objmgr.GetPlayer(guid);
1003 Unit* ChatHandler::getSelectedUnit()
1005 if(!m_session)
1006 return NULL;
1008 uint64 guid = m_session->GetPlayer()->GetSelection();
1010 if (guid == 0)
1011 return m_session->GetPlayer();
1013 return ObjectAccessor::GetUnit(*m_session->GetPlayer(),guid);
1016 Creature* ChatHandler::getSelectedCreature()
1018 if(!m_session)
1019 return NULL;
1021 return ObjectAccessor::GetCreatureOrPet(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection());
1024 char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1)
1026 // skip empty
1027 if(!text)
1028 return NULL;
1030 // skip speces
1031 while(*text==' '||*text=='\t'||*text=='\b')
1032 ++text;
1034 if(!*text)
1035 return NULL;
1037 // return non link case
1038 if(text[0]!='|')
1039 return strtok(text, " ");
1041 // [name] Shift-click form |color|linkType:key|h[name]|h|r
1042 // or
1043 // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r
1045 char* check = strtok(text, "|"); // skip color
1046 if(!check)
1047 return NULL; // end of data
1049 char* cLinkType = strtok(NULL, ":"); // linktype
1050 if(!cLinkType)
1051 return NULL; // end of data
1053 if(strcmp(cLinkType,linkType) != 0)
1055 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after retturn from function
1056 SendSysMessage(LANG_WRONG_LINK_TYPE);
1057 return NULL;
1060 char* cKeys = strtok(NULL, "|"); // extract keys and values
1061 char* cKeysTail = strtok(NULL, "");
1063 char* cKey = strtok(cKeys, ":|"); // extract key
1064 if(something1)
1065 *something1 = strtok(NULL, ":|"); // extract something
1067 strtok(cKeysTail, "]"); // restart scan tail and skip name with possible spaces
1068 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after retturn from function
1069 return cKey;
1072 char* ChatHandler::extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1)
1074 // skip empty
1075 if(!text)
1076 return NULL;
1078 // skip speces
1079 while(*text==' '||*text=='\t'||*text=='\b')
1080 ++text;
1082 if(!*text)
1083 return NULL;
1085 // return non link case
1086 if(text[0]!='|')
1087 return strtok(text, " ");
1089 // [name] Shift-click form |color|linkType:key|h[name]|h|r
1090 // or
1091 // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r
1093 char* check = strtok(text, "|"); // skip color
1094 if(!check)
1095 return NULL; // end of data
1097 char* cLinkType = strtok(NULL, ":"); // linktype
1098 if(!cLinkType)
1099 return NULL; // end of data
1101 for(int i = 0; linkTypes[i]; ++i)
1103 if(strcmp(cLinkType,linkTypes[i]) == 0)
1105 char* cKeys = strtok(NULL, "|"); // extract keys and values
1106 char* cKeysTail = strtok(NULL, "");
1108 char* cKey = strtok(cKeys, ":|"); // extract key
1109 if(something1)
1110 *something1 = strtok(NULL, ":|"); // extract something
1112 strtok(cKeysTail, "]"); // restart scan tail and skip name with possible spaces
1113 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function
1114 if(found_idx)
1115 *found_idx = i;
1116 return cKey;
1120 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function
1121 SendSysMessage(LANG_WRONG_LINK_TYPE);
1122 return NULL;
1125 char const *fmtstring( char const *format, ... )
1127 va_list argptr;
1128 #define MAX_FMT_STRING 32000
1129 static char temp_buffer[MAX_FMT_STRING];
1130 static char string[MAX_FMT_STRING];
1131 static int index = 0;
1132 char *buf;
1133 int len;
1135 va_start(argptr, format);
1136 vsnprintf(temp_buffer,MAX_FMT_STRING, format, argptr);
1137 va_end(argptr);
1139 len = strlen(temp_buffer);
1141 if( len >= MAX_FMT_STRING )
1142 return "ERROR";
1144 if (len + index >= MAX_FMT_STRING-1)
1146 index = 0;
1149 buf = &string[index];
1150 memcpy( buf, temp_buffer, len+1 );
1152 index += len + 1;
1154 return buf;
1157 GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry)
1159 if(!m_session)
1160 return NULL;
1162 Player* pl = m_session->GetPlayer();
1164 GameObject* obj = ObjectAccessor::GetGameObject(*pl, MAKE_NEW_GUID(lowguid, entry, HIGHGUID_GAMEOBJECT));
1166 if(!obj && objmgr.GetGOData(lowguid)) // guid is DB guid of object
1168 // search near player then
1169 CellPair p(MaNGOS::ComputeCellPair(pl->GetPositionX(), pl->GetPositionY()));
1170 Cell cell(p);
1171 cell.data.Part.reserved = ALL_DISTRICT;
1173 MaNGOS::GameObjectWithDbGUIDCheck go_check(*pl,lowguid);
1174 MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(obj,go_check);
1176 TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
1177 CellLock<GridReadGuard> cell_lock(cell, p);
1178 cell_lock->Visit(cell_lock, object_checker, *pl->GetMap());
1181 return obj;
1184 static char const* const spellTalentKeys[] = {
1185 "Hspell",
1186 "Htalent",
1190 uint32 ChatHandler::extractSpellIdFromLink(char* text)
1192 // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r
1193 // number or [name] Shift-click form |color|Htalent:talent_id,rank|h[name]|h|r
1194 int type = 0;
1195 char* rankS = NULL;
1196 char* idS = extractKeyFromLink(text,spellTalentKeys,&type,&rankS);
1197 if(!idS)
1198 return 0;
1200 uint32 id = (uint32)atol(idS);
1202 // spell
1203 if(type==0)
1204 return id;
1206 // talent
1207 TalentEntry const* talentEntry = sTalentStore.LookupEntry(id);
1208 if(!talentEntry)
1209 return 0;
1211 int32 rank = rankS ? (uint32)atol(rankS) : 0;
1212 if(rank >= 5)
1213 return 0;
1215 if(rank < 0)
1216 rank = 0;
1218 return talentEntry->RankID[rank];
1221 GameTele const* ChatHandler::extractGameTeleFromLink(char* text)
1223 // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
1224 char* cId = extractKeyFromLink(text,"Htele");
1225 if(!cId)
1226 return false;
1228 // id case (explicit or from shift link)
1229 if(cId[0] >= '0' || cId[0] >= '9')
1230 if(uint32 id = atoi(cId))
1231 return objmgr.GetGameTele(id);
1233 return objmgr.GetGameTele(cId);
1236 const char *ChatHandler::GetName() const
1238 return m_session->GetPlayer()->GetName();
1241 bool ChatHandler::needReportToTarget(Player* chr) const
1243 Player* pl = m_session->GetPlayer();
1244 return pl != chr && pl->IsVisibleGloballyFor(chr);
1247 const char *CliHandler::GetMangosString(int32 entry) const
1249 return objmgr.GetMangosStringForDBCLocale(entry);
1252 bool CliHandler::isAvailable(ChatCommand const& cmd) const
1254 // skip non-console commands in console case
1255 return cmd.AllowConsole;
1258 void CliHandler::SendSysMessage(const char *str)
1260 m_print(str);
1261 m_print("\r\n");
1264 const char *CliHandler::GetName() const
1266 return GetMangosString(LANG_CONSOLE_COMMAND);
1269 bool CliHandler::needReportToTarget(Player* /*chr*/) const
1271 return true;