[7918] Improve portability in work with uint64 string format specifiers and in code...
[getmangos.git] / src / game / Chat.cpp
blob78b5741bab5fb144803c66d7801a7ba6365fe668
1 /*
2 * Copyright (C) 2005-2009 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 "GridNotifiersImpl.h"
32 #include "CellImpl.h"
33 #include "AccountMgr.h"
35 // Supported shift-links (client generated and server side)
36 // |color|Harea:area_id|h[name]|h|r
37 // |color|Hcreature:creature_guid|h[name]|h|r
38 // |color|Hcreature_entry:creature_id|h[name]|h|r
39 // |color|Hgameevent:id|h[name]|h|r
40 // |color|Hgameobject:go_guid|h[name]|h|r
41 // |color|Hgameobject_entry:go_id|h[name]|h|r
42 // |color|Hitem:item_id:perm_ench_id:0:0|h[name]|h|r
43 // |color|Hitemset:itemset_id|h[name]|h|r
44 // |color|Hplayer:name|h[name]|h|r - client, in some messages, at click copy only name instead link
45 // |color|Hquest:quest_id|h[name]|h|r
46 // |color|Hskill:skill_id|h[name]|h|r
47 // |color|Hspell:spell_id|h[name]|h|r - client, spellbook spell icon shift-click
48 // |color|Htalent:talent_id,rank|h[name]|h|r - client, talent icon shift-click
49 // |color|Htaxinode:id|h[name]|h|r
50 // |color|Htele:id|h[name]|h|r
51 // |color|Htrade:spell_id,cur_value,max_value,unk3int,unk3str|h[name]|h|r - client, spellbook profession icon shift-click
53 bool ChatHandler::load_command_table = true;
55 ChatCommand * ChatHandler::getCommandTable()
57 static ChatCommand accountSetCommandTable[] =
59 { "addon", SEC_ADMINISTRATOR, true, &ChatHandler::HandleAccountSetAddonCommand, "", NULL },
60 { "gmlevel", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetGmLevelCommand, "", NULL },
61 { "password", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetPasswordCommand, "", NULL },
62 { NULL, 0, false, NULL, "", NULL }
65 static ChatCommand accountCommandTable[] =
67 { "create", SEC_CONSOLE, true, &ChatHandler::HandleAccountCreateCommand, "", NULL },
68 { "delete", SEC_CONSOLE, true, &ChatHandler::HandleAccountDeleteCommand, "", NULL },
69 { "onlinelist", SEC_CONSOLE, true, &ChatHandler::HandleAccountOnlineListCommand, "", NULL },
70 { "lock", SEC_PLAYER, false, &ChatHandler::HandleAccountLockCommand, "", NULL },
71 { "set", SEC_ADMINISTRATOR, true, NULL, "", accountSetCommandTable },
72 { "password", SEC_PLAYER, false, &ChatHandler::HandleAccountPasswordCommand, "", NULL },
73 { "", SEC_PLAYER, false, &ChatHandler::HandleAccountCommand, "", NULL },
74 { NULL, 0, false, NULL, "", NULL }
77 static ChatCommand banCommandTable[] =
79 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanAccountCommand, "", NULL },
80 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanCharacterCommand, "", NULL },
81 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanIPCommand, "", NULL },
82 { NULL, 0, false, NULL, "", NULL }
85 static ChatCommand baninfoCommandTable[] =
87 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoAccountCommand, "", NULL },
88 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoCharacterCommand, "", NULL },
89 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoIPCommand, "", NULL },
90 { NULL, 0, false, NULL, "", NULL }
93 static ChatCommand banlistCommandTable[] =
95 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListAccountCommand, "", NULL },
96 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListCharacterCommand, "", NULL },
97 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListIPCommand, "", NULL },
98 { NULL, 0, false, NULL, "", NULL }
101 static ChatCommand castCommandTable[] =
103 { "back", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastBackCommand, "", NULL },
104 { "dist", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastDistCommand, "", NULL },
105 { "self", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastSelfCommand, "", NULL },
106 { "target", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastTargetCommand, "", NULL },
107 { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastCommand, "", NULL },
108 { NULL, 0, false, NULL, "", NULL }
111 static ChatCommand characterCommandTable[] =
113 { "customize", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterCustomizeCommand, "", NULL },
114 { "delete", SEC_CONSOLE, true, &ChatHandler::HandleCharacterDeleteCommand, "", NULL },
115 { "level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleCharacterLevelCommand, "", NULL },
116 { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterRenameCommand, "", NULL },
117 { "reputation", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterReputationCommand, "", NULL },
118 { NULL, 0, false, NULL, "", NULL }
121 static ChatCommand debugPlayCommandTable[] =
123 { "cinematic", SEC_MODERATOR, false, &ChatHandler::HandleDebugPlayCinematicCommand, "", NULL },
124 { "movie", SEC_MODERATOR, false, &ChatHandler::HandleDebugPlayMovieCommand, "", NULL },
125 { "sound", SEC_MODERATOR, false, &ChatHandler::HandleDebugPlaySoundCommand, "", NULL },
126 { NULL, 0, false, NULL, "", NULL }
129 static ChatCommand debugSendCommandTable[] =
131 { "buyerror", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendBuyErrorCommand, "", NULL },
132 { "channelnotify", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendChannelNotifyCommand, "", NULL },
133 { "chatmmessage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendChatMsgCommand, "", NULL },
134 { "equiperror", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendEquipErrorCommand, "", NULL },
135 { "largepacket", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendLargePacketCommand, "", NULL },
136 { "opcode", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendOpcodeCommand, "", NULL },
137 { "poi", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendPoiCommand, "", NULL },
138 { "qpartymsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendQuestPartyMsgCommand, "", NULL },
139 { "qinvalidmsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendQuestInvalidMsgCommand, "", NULL },
140 { "sellerror", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendSellErrorCommand, "", NULL },
141 { "setphaseshift", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendSetPhaseShiftCommand, "", NULL },
142 { "spellfail", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSendSpellFailCommand, "", NULL },
143 { NULL, 0, false, NULL, "", NULL }
146 static ChatCommand debugCommandTable[] =
148 { "anim", SEC_GAMEMASTER, false, &ChatHandler::HandleDebugAnimCommand, "", NULL },
149 { "arena", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugArenaCommand, "", NULL },
150 { "bg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugBattlegroundCommand, "", NULL },
151 { "getitemstate", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugGetItemState, "", NULL },
152 { "lootrecipient", SEC_GAMEMASTER, false, &ChatHandler::HandleDebugGetLootRecipient, "", NULL },
153 { "getvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugGetValue, "", NULL },
154 { "Mod32Value", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugMod32Value, "", NULL },
155 { "play", SEC_MODERATOR, false, NULL, "", debugPlayCommandTable },
156 { "send", SEC_ADMINISTRATOR, false, NULL, "", debugSendCommandTable },
157 { "setitemflag", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSetItemFlagCommand, "", NULL },
158 { "setvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSetValue, "", NULL },
159 { "spawnvehicle", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSpawnVehicle, "", NULL },
160 { "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugUpdateWorldStateCommand, "", NULL },
161 { "update", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugUpdate, "", NULL },
162 { NULL, 0, false, NULL, "", NULL }
165 static ChatCommand eventCommandTable[] =
167 { "activelist", SEC_GAMEMASTER, true, &ChatHandler::HandleEventActiveListCommand, "", NULL },
168 { "start", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStartCommand, "", NULL },
169 { "stop", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStopCommand, "", NULL },
170 { "", SEC_GAMEMASTER, true, &ChatHandler::HandleEventInfoCommand, "", NULL },
171 { NULL, 0, false, NULL, "", NULL }
174 static ChatCommand gmCommandTable[] =
176 { "chat", SEC_MODERATOR, false, &ChatHandler::HandleGMChatCommand, "", NULL },
177 { "fly", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGMFlyCommand, "", NULL },
178 { "ingame", SEC_PLAYER, true, &ChatHandler::HandleGMListIngameCommand, "", NULL },
179 { "list", SEC_ADMINISTRATOR, true, &ChatHandler::HandleGMListFullCommand, "", NULL },
180 { "visible", SEC_MODERATOR, false, &ChatHandler::HandleGMVisibleCommand, "", NULL },
181 { "", SEC_MODERATOR, false, &ChatHandler::HandleGMCommand, "", NULL },
182 { NULL, 0, false, NULL, "", NULL }
185 static ChatCommand goCommandTable[] =
187 { "creature", SEC_MODERATOR, false, &ChatHandler::HandleGoCreatureCommand, "", NULL },
188 { "graveyard", SEC_MODERATOR, false, &ChatHandler::HandleGoGraveyardCommand, "", NULL },
189 { "grid", SEC_MODERATOR, false, &ChatHandler::HandleGoGridCommand, "", NULL },
190 { "object", SEC_MODERATOR, false, &ChatHandler::HandleGoObjectCommand, "", NULL },
191 { "taxinode", SEC_MODERATOR, false, &ChatHandler::HandleGoTaxinodeCommand, "", NULL },
192 { "trigger", SEC_MODERATOR, false, &ChatHandler::HandleGoTriggerCommand, "", NULL },
193 { "zonexy", SEC_MODERATOR, false, &ChatHandler::HandleGoZoneXYCommand, "", NULL },
194 { "xy", SEC_MODERATOR, false, &ChatHandler::HandleGoXYCommand, "", NULL },
195 { "xyz", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL },
196 { "", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL },
197 { NULL, 0, false, NULL, "", NULL }
200 static ChatCommand gobjectCommandTable[] =
202 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectAddCommand, "", NULL },
203 { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectDeleteCommand, "", NULL },
204 { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectMoveCommand, "", NULL },
205 { "near", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectNearCommand, "", NULL },
206 { "setphase", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectPhaseCommand, "", NULL },
207 { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectTargetCommand, "", NULL },
208 { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectTurnCommand, "", NULL },
209 { NULL, 0, false, NULL, "", NULL }
212 static ChatCommand guildCommandTable[] =
214 { "create", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildCreateCommand, "", NULL },
215 { "delete", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildDeleteCommand, "", NULL },
216 { "invite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildInviteCommand, "", NULL },
217 { "uninvite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildUninviteCommand, "", NULL },
218 { "rank", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildRankCommand, "", NULL },
219 { NULL, 0, false, NULL, "", NULL }
222 static ChatCommand honorCommandTable[] =
224 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleHonorAddCommand, "", NULL },
225 { "addkill", SEC_GAMEMASTER, false, &ChatHandler::HandleHonorAddKillCommand, "", NULL },
226 { "update", SEC_GAMEMASTER, false, &ChatHandler::HandleHonorUpdateCommand, "", NULL },
227 { NULL, 0, false, NULL, "", NULL }
230 static ChatCommand instanceCommandTable[] =
232 { "listbinds", SEC_ADMINISTRATOR, false, &ChatHandler::HandleInstanceListBindsCommand, "", NULL },
233 { "unbind", SEC_ADMINISTRATOR, false, &ChatHandler::HandleInstanceUnbindCommand, "", NULL },
234 { "stats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleInstanceStatsCommand, "", NULL },
235 { "savedata", SEC_ADMINISTRATOR, false, &ChatHandler::HandleInstanceSaveDataCommand, "", NULL },
236 { NULL, 0, false, NULL, "", NULL }
239 static ChatCommand learnCommandTable[] =
241 { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllCommand, "", NULL },
242 { "all_gm", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllGMCommand, "", NULL },
243 { "all_crafts", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllCraftsCommand, "", NULL },
244 { "all_default", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL },
245 { "all_lang", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllLangCommand, "", NULL },
246 { "all_myclass", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL },
247 { "all_mypettalents",SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyPetTalentsCommand,"", NULL },
248 { "all_myspells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL },
249 { "all_mytalents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL },
250 { "all_recipes", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL },
251 { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnCommand, "", NULL },
252 { NULL, 0, false, NULL, "", NULL }
255 static ChatCommand listCommandTable[] =
257 { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListCreatureCommand, "", NULL },
258 { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListItemCommand, "", NULL },
259 { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListObjectCommand, "", NULL },
260 { "auras", SEC_ADMINISTRATOR, false, &ChatHandler::HandleListAurasCommand, "", NULL },
261 { NULL, 0, false, NULL, "", NULL }
264 static ChatCommand lookupPlayerCommandTable[] =
266 { "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
267 { "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL },
268 { "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL },
269 { NULL, 0, false, NULL, "", NULL }
272 static ChatCommand lookupCommandTable[] =
274 { "area", SEC_MODERATOR, true, &ChatHandler::HandleLookupAreaCommand, "", NULL },
275 { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupCreatureCommand, "", NULL },
276 { "event", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupEventCommand, "", NULL },
277 { "faction", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupFactionCommand, "", NULL },
278 { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemCommand, "", NULL },
279 { "itemset", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemSetCommand, "", NULL },
280 { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupObjectCommand, "", NULL },
281 { "quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupQuestCommand, "", NULL },
282 { "player", SEC_GAMEMASTER, true, NULL, "", lookupPlayerCommandTable },
283 { "skill", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSkillCommand, "", NULL },
284 { "spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSpellCommand, "", NULL },
285 { "taxinode", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupTaxiNodeCommand, "", NULL },
286 { "tele", SEC_MODERATOR, true, &ChatHandler::HandleLookupTeleCommand, "", NULL },
287 { NULL, 0, false, NULL, "", NULL }
290 static ChatCommand modifyCommandTable[] =
292 { "hp", SEC_MODERATOR, false, &ChatHandler::HandleModifyHPCommand, "", NULL },
293 { "mana", SEC_MODERATOR, false, &ChatHandler::HandleModifyManaCommand, "", NULL },
294 { "rage", SEC_MODERATOR, false, &ChatHandler::HandleModifyRageCommand, "", NULL },
295 { "runicpower", SEC_MODERATOR, false, &ChatHandler::HandleModifyRunicPowerCommand, "", NULL },
296 { "energy", SEC_MODERATOR, false, &ChatHandler::HandleModifyEnergyCommand, "", NULL },
297 { "money", SEC_MODERATOR, false, &ChatHandler::HandleModifyMoneyCommand, "", NULL },
298 { "speed", SEC_MODERATOR, false, &ChatHandler::HandleModifySpeedCommand, "", NULL },
299 { "swim", SEC_MODERATOR, false, &ChatHandler::HandleModifySwimCommand, "", NULL },
300 { "scale", SEC_MODERATOR, false, &ChatHandler::HandleModifyScaleCommand, "", NULL },
301 { "bit", SEC_MODERATOR, false, &ChatHandler::HandleModifyBitCommand, "", NULL },
302 { "bwalk", SEC_MODERATOR, false, &ChatHandler::HandleModifyBWalkCommand, "", NULL },
303 { "fly", SEC_MODERATOR, false, &ChatHandler::HandleModifyFlyCommand, "", NULL },
304 { "aspeed", SEC_MODERATOR, false, &ChatHandler::HandleModifyASpeedCommand, "", NULL },
305 { "faction", SEC_MODERATOR, false, &ChatHandler::HandleModifyFactionCommand, "", NULL },
306 { "spell", SEC_MODERATOR, false, &ChatHandler::HandleModifySpellCommand, "", NULL },
307 { "tp", SEC_MODERATOR, false, &ChatHandler::HandleModifyTalentCommand, "", NULL },
308 { "titles", SEC_MODERATOR, false, &ChatHandler::HandleModifyKnownTitlesCommand, "", NULL },
309 { "mount", SEC_MODERATOR, false, &ChatHandler::HandleModifyMountCommand, "", NULL },
310 { "honor", SEC_MODERATOR, false, &ChatHandler::HandleModifyHonorCommand, "", NULL },
311 { "rep", SEC_GAMEMASTER, false, &ChatHandler::HandleModifyRepCommand, "", NULL },
312 { "arena", SEC_MODERATOR, false, &ChatHandler::HandleModifyArenaCommand, "", NULL },
313 { "drunk", SEC_MODERATOR, false, &ChatHandler::HandleModifyDrunkCommand, "", NULL },
314 { "standstate", SEC_GAMEMASTER, false, &ChatHandler::HandleModifyStandStateCommand, "", NULL },
315 { "morph", SEC_GAMEMASTER, false, &ChatHandler::HandleModifyMorphCommand, "", NULL },
316 { "phase", SEC_ADMINISTRATOR, false, &ChatHandler::HandleModifyPhaseCommand, "", NULL },
317 { "gender", SEC_GAMEMASTER, false, &ChatHandler::HandleModifyGenderCommand, "", NULL },
318 { NULL, 0, false, NULL, "", NULL }
321 static ChatCommand npcCommandTable[] =
323 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcAddCommand, "", NULL },
324 { "additem", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcAddVendorItemCommand, "", NULL },
325 { "addmove", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcAddMoveCommand, "", NULL },
326 { "allowmove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcAllowMovementCommand, "", NULL },
327 { "changeentry", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcChangeEntryCommand, "", NULL },
328 { "changelevel", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcChangeLevelCommand, "", NULL },
329 { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcDeleteCommand, "", NULL },
330 { "delitem", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcDelVendorItemCommand, "", NULL },
331 { "factionid", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFactionIdCommand, "", NULL },
332 { "flag", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFlagCommand, "", NULL },
333 { "follow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcFollowCommand, "", NULL },
334 { "info", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcInfoCommand, "", NULL },
335 { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcMoveCommand, "", NULL },
336 { "playemote", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcPlayEmoteCommand, "", NULL },
337 { "setmodel", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetModelCommand, "", NULL },
338 { "setmovetype", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetMoveTypeCommand, "", NULL },
339 { "setphase", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetPhaseCommand, "", NULL },
340 { "spawndist", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSpawnDistCommand, "", NULL },
341 { "spawntime", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSpawnTimeCommand, "", NULL },
342 { "say", SEC_MODERATOR, false, &ChatHandler::HandleNpcSayCommand, "", NULL },
343 { "textemote", SEC_MODERATOR, false, &ChatHandler::HandleNpcTextEmoteCommand, "", NULL },
344 { "unfollow", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcUnFollowCommand, "", NULL },
345 { "whisper", SEC_MODERATOR, false, &ChatHandler::HandleNpcWhisperCommand, "", NULL },
346 { "yell", SEC_MODERATOR, false, &ChatHandler::HandleNpcYellCommand, "", NULL },
347 { "tame", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcTameCommand, "", NULL },
348 { "setdeathstate", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSetDeathStateCommand, "", NULL },
350 //{ TODO: fix or remove this commands
351 { "addweapon", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcAddWeaponCommand, "", NULL },
352 { "name", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcNameCommand, "", NULL },
353 { "subname", SEC_GAMEMASTER, false, &ChatHandler::HandleNpcSubNameCommand, "", NULL },
356 { NULL, 0, false, NULL, "", NULL }
359 static ChatCommand pdumpCommandTable[] =
361 { "load", SEC_ADMINISTRATOR, true, &ChatHandler::HandlePDumpLoadCommand, "", NULL },
362 { "write", SEC_ADMINISTRATOR, true, &ChatHandler::HandlePDumpWriteCommand, "", NULL },
363 { NULL, 0, false, NULL, "", NULL }
366 static ChatCommand questCommandTable[] =
368 { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleQuestAdd, "", NULL },
369 { "complete", SEC_ADMINISTRATOR, false, &ChatHandler::HandleQuestComplete, "", NULL },
370 { "remove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleQuestRemove, "", NULL },
371 { NULL, 0, false, NULL, "", NULL }
374 static ChatCommand reloadCommandTable[] =
376 { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllCommand, "", NULL },
377 { "all_achievement",SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllAchievementCommand,"", NULL },
378 { "all_area", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllAreaCommand, "", NULL },
379 { "all_eventai", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllEventAICommand, "", NULL },
380 { "all_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllItemCommand, "", NULL },
381 { "all_locales", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL },
382 { "all_loot", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLootCommand, "", NULL },
383 { "all_npc", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllNpcCommand, "", NULL },
384 { "all_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllQuestCommand, "", NULL },
385 { "all_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL },
386 { "all_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllSpellCommand, "", NULL },
388 { "config", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadConfigCommand, "", NULL },
390 { "achievement_criteria_data", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAchievementCriteriaDataCommand, "", NULL },
391 { "achievement_reward", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAchievementRewardCommand, "", NULL },
392 { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL },
393 { "areatrigger_tavern", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL },
394 { "areatrigger_teleport", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL },
395 { "command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommandCommand, "", NULL },
396 { "creature_ai_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventAIScriptsCommand, "", NULL },
397 { "creature_ai_summons", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventAISummonsCommand, "", NULL },
398 { "creature_ai_texts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventAITextsCommand, "", NULL },
399 { "creature_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL },
400 { "creature_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL },
401 { "creature_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL },
402 { "db_script_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadDbScriptStringCommand, "", NULL },
403 { "disenchant_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL },
404 { "event_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL },
405 { "fishing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL },
406 { "game_graveyard_zone", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL },
407 { "game_tele", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameTeleCommand, "", NULL },
408 { "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL },
409 { "gameobject_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL },
410 { "gameobject_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL },
411 { "gameobject_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL },
412 { "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
413 { "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
414 { "locales_achievement_reward", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesAchievementRewardCommand,"", NULL },
415 { "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
416 { "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
417 { "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
418 { "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
419 { "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
420 { "locales_points_of_interest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPointsOfInterestCommand, "", NULL },
421 { "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
422 { "mangos_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadMangosStringCommand, "", NULL },
423 { "milling_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesMillingCommand, "", NULL },
424 { "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
425 { "npc_option", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcOptionCommand, "", NULL },
426 { "npc_spellclick_spells", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellClickSpellsCommand, "",NULL},
427 { "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
428 { "npc_vendor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL },
429 { "page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPageTextsCommand, "", NULL },
430 { "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
431 { "points_of_interest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPointsOfInterestCommand, "",NULL},
432 { "prospecting_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
433 { "quest_end_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL },
434 { "quest_mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL },
435 { "quest_start_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL },
436 { "quest_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL },
437 { "reference_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL },
438 { "reserved_name", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadReservedNameCommand, "", NULL },
439 { "skill_discovery_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
440 { "skill_extra_item_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL },
441 { "skill_fishing_base_level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL },
442 { "skinning_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL },
443 { "spell_affect", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL },
444 { "spell_area", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellAreaCommand, "", NULL },
445 { "spell_bonus_data", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellBonusesCommand, "", NULL },
446 { "spell_chain", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellChainCommand, "", NULL },
447 { "spell_elixir", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL },
448 { "spell_learn_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL },
449 { "spell_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSpellCommand, "", NULL },
450 { "spell_pet_auras", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL },
451 { "spell_proc_event", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL },
452 { "spell_script_target", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL },
453 { "spell_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL },
454 { "spell_target_position", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL },
455 { "spell_threats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL },
457 { NULL, 0, false, NULL, "", NULL }
460 static ChatCommand resetCommandTable[] =
462 { "achievements", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetAchievementsCommand, "", NULL },
463 { "honor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetHonorCommand, "", NULL },
464 { "level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetLevelCommand, "", NULL },
465 { "spells", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetSpellsCommand, "", NULL },
466 { "stats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetStatsCommand, "", NULL },
467 { "talents", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetTalentsCommand, "", NULL },
468 { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleResetAllCommand, "", NULL },
469 { NULL, 0, false, NULL, "", NULL }
472 static ChatCommand sendCommandTable[] =
474 { "items", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendItemsCommand, "", NULL },
475 { "mail", SEC_MODERATOR, true, &ChatHandler::HandleSendMailCommand, "", NULL },
476 { "message", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMessageCommand, "", NULL },
477 { "money", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMoneyCommand, "", NULL },
478 { NULL, 0, false, NULL, "", NULL }
481 static ChatCommand serverIdleRestartCommandTable[] =
483 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
484 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerIdleRestartCommand, "", NULL },
485 { NULL, 0, false, NULL, "", NULL }
488 static ChatCommand serverIdleShutdownCommandTable[] =
490 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
491 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerIdleShutDownCommand, "", NULL },
492 { NULL, 0, false, NULL, "", NULL }
495 static ChatCommand serverRestartCommandTable[] =
497 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
498 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerRestartCommand, "", NULL },
499 { NULL, 0, false, NULL, "", NULL }
502 static ChatCommand serverShutdownCommandTable[] =
504 { "cancel", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCancelCommand,"", NULL },
505 { "" , SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerShutDownCommand, "", NULL },
506 { NULL, 0, false, NULL, "", NULL }
509 static ChatCommand serverSetCommandTable[] =
511 { "loglevel", SEC_CONSOLE, true, &ChatHandler::HandleServerSetLogLevelCommand, "", NULL },
512 { "motd", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerSetMotdCommand, "", NULL },
513 { NULL, 0, false, NULL, "", NULL }
516 static ChatCommand serverCommandTable[] =
518 { "corpses", SEC_GAMEMASTER, true, &ChatHandler::HandleServerCorpsesCommand, "", NULL },
519 { "exit", SEC_CONSOLE, true, &ChatHandler::HandleServerExitCommand, "", NULL },
520 { "idlerestart", SEC_ADMINISTRATOR, true, NULL, "", serverIdleRestartCommandTable },
521 { "idleshutdown", SEC_ADMINISTRATOR, true, NULL, "", serverShutdownCommandTable },
522 { "info", SEC_PLAYER, true, &ChatHandler::HandleServerInfoCommand, "", NULL },
523 { "motd", SEC_PLAYER, true, &ChatHandler::HandleServerMotdCommand, "", NULL },
524 { "plimit", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerPLimitCommand, "", NULL },
525 { "restart", SEC_ADMINISTRATOR, true, NULL, "", serverRestartCommandTable },
526 { "shutdown", SEC_ADMINISTRATOR, true, NULL, "", serverShutdownCommandTable },
527 { "set", SEC_ADMINISTRATOR, true, NULL, "", serverSetCommandTable },
528 { NULL, 0, false, NULL, "", NULL }
531 static ChatCommand teleCommandTable[] =
533 { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleTeleAddCommand, "", NULL },
534 { "del", SEC_ADMINISTRATOR, true, &ChatHandler::HandleTeleDelCommand, "", NULL },
535 { "name", SEC_MODERATOR, true, &ChatHandler::HandleTeleNameCommand, "", NULL },
536 { "group", SEC_MODERATOR, false, &ChatHandler::HandleTeleGroupCommand, "", NULL },
537 { "", SEC_MODERATOR, false, &ChatHandler::HandleTeleCommand, "", NULL },
538 { NULL, 0, false, NULL, "", NULL }
541 static ChatCommand unbanCommandTable[] =
543 { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanAccountCommand, "", NULL },
544 { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanCharacterCommand, "", NULL },
545 { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanIPCommand, "", NULL },
546 { NULL, 0, false, NULL, "", NULL }
549 static ChatCommand wpCommandTable[] =
551 { "show", SEC_GAMEMASTER, false, &ChatHandler::HandleWpShowCommand, "", NULL },
552 { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleWpAddCommand, "", NULL },
553 { "modify", SEC_GAMEMASTER, false, &ChatHandler::HandleWpModifyCommand, "", NULL },
554 { "export", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpExportCommand, "", NULL },
555 { "import", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpImportCommand, "", NULL },
556 { NULL, 0, false, NULL, "", NULL }
559 static ChatCommand commandTable[] =
561 { "account", SEC_PLAYER, true, NULL, "", accountCommandTable },
562 { "gm", SEC_MODERATOR, true, NULL, "", gmCommandTable },
563 { "npc", SEC_MODERATOR, false, NULL, "", npcCommandTable },
564 { "go", SEC_MODERATOR, false, NULL, "", goCommandTable },
565 { "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable },
566 { "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable },
567 { "debug", SEC_MODERATOR, false, NULL, "", debugCommandTable },
568 { "tele", SEC_MODERATOR, true, NULL, "", teleCommandTable },
569 { "character", SEC_GAMEMASTER, false, NULL, "", characterCommandTable},
570 { "event", SEC_GAMEMASTER, false, NULL, "", eventCommandTable },
571 { "gobject", SEC_GAMEMASTER, false, NULL, "", gobjectCommandTable },
572 { "honor", SEC_GAMEMASTER, false, NULL, "", honorCommandTable },
573 { "wp", SEC_GAMEMASTER, false, NULL, "", wpCommandTable },
574 { "quest", SEC_ADMINISTRATOR, false, NULL, "", questCommandTable },
575 { "reload", SEC_ADMINISTRATOR, true, NULL, "", reloadCommandTable },
576 { "list", SEC_ADMINISTRATOR, true, NULL, "", listCommandTable },
577 { "lookup", SEC_ADMINISTRATOR, true, NULL, "", lookupCommandTable },
578 { "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable },
579 { "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable },
580 { "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable },
581 { "reset", SEC_ADMINISTRATOR, true, NULL, "", resetCommandTable },
582 { "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable },
583 { "server", SEC_ADMINISTRATOR, true, NULL, "", serverCommandTable },
585 { "aura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAuraCommand, "", NULL },
586 { "unaura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnAuraCommand, "", NULL },
587 { "announce", SEC_MODERATOR, true, &ChatHandler::HandleAnnounceCommand, "", NULL },
588 { "notify", SEC_MODERATOR, true, &ChatHandler::HandleNotifyCommand, "", NULL },
589 { "goname", SEC_MODERATOR, false, &ChatHandler::HandleGonameCommand, "", NULL },
590 { "namego", SEC_MODERATOR, false, &ChatHandler::HandleNamegoCommand, "", NULL },
591 { "groupgo", SEC_MODERATOR, false, &ChatHandler::HandleGroupgoCommand, "", NULL },
592 { "commands", SEC_PLAYER, true, &ChatHandler::HandleCommandsCommand, "", NULL },
593 { "demorph", SEC_GAMEMASTER, false, &ChatHandler::HandleDeMorphCommand, "", NULL },
594 { "die", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDieCommand, "", NULL },
595 { "revive", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReviveCommand, "", NULL },
596 { "dismount", SEC_PLAYER, false, &ChatHandler::HandleDismountCommand, "", NULL },
597 { "gps", SEC_MODERATOR, false, &ChatHandler::HandleGPSCommand, "", NULL },
598 { "guid", SEC_GAMEMASTER, false, &ChatHandler::HandleGUIDCommand, "", NULL },
599 { "help", SEC_PLAYER, true, &ChatHandler::HandleHelpCommand, "", NULL },
600 { "itemmove", SEC_GAMEMASTER, false, &ChatHandler::HandleItemMoveCommand, "", NULL },
601 { "cooldown", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCooldownCommand, "", NULL },
602 { "unlearn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnLearnCommand, "", NULL },
603 { "distance", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetDistanceCommand, "", NULL },
604 { "recall", SEC_MODERATOR, false, &ChatHandler::HandleRecallCommand, "", NULL },
605 { "save", SEC_PLAYER, false, &ChatHandler::HandleSaveCommand, "", NULL },
606 { "saveall", SEC_MODERATOR, true, &ChatHandler::HandleSaveAllCommand, "", NULL },
607 { "kick", SEC_GAMEMASTER, true, &ChatHandler::HandleKickPlayerCommand, "", NULL },
608 { "ban", SEC_ADMINISTRATOR, true, NULL, "", banCommandTable },
609 { "unban", SEC_ADMINISTRATOR, true, NULL, "", unbanCommandTable },
610 { "baninfo", SEC_ADMINISTRATOR, false, NULL, "", baninfoCommandTable },
611 { "banlist", SEC_ADMINISTRATOR, true, NULL, "", banlistCommandTable },
612 { "start", SEC_PLAYER, false, &ChatHandler::HandleStartCommand, "", NULL },
613 { "taxicheat", SEC_MODERATOR, false, &ChatHandler::HandleTaxiCheatCommand, "", NULL },
614 { "linkgrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLinkGraveCommand, "", NULL },
615 { "neargrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearGraveCommand, "", NULL },
616 { "explorecheat", SEC_ADMINISTRATOR, false, &ChatHandler::HandleExploreCheatCommand, "", NULL },
617 { "hover", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHoverCommand, "", NULL },
618 { "levelup", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLevelUpCommand, "", NULL },
619 { "showarea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleShowAreaCommand, "", NULL },
620 { "hidearea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHideAreaCommand, "", NULL },
621 { "additem", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemCommand, "", NULL },
622 { "additemset", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemSetCommand, "", NULL },
623 { "bank", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBankCommand, "", NULL },
624 { "wchange", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeWeather, "", NULL },
625 { "ticket", SEC_GAMEMASTER, true, &ChatHandler::HandleTicketCommand, "", NULL },
626 { "delticket", SEC_GAMEMASTER, true, &ChatHandler::HandleDelTicketCommand, "", NULL },
627 { "maxskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMaxSkillCommand, "", NULL },
628 { "setskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetSkillCommand, "", NULL },
629 { "whispers", SEC_MODERATOR, false, &ChatHandler::HandleWhispersCommand, "", NULL },
630 { "pinfo", SEC_GAMEMASTER, true, &ChatHandler::HandlePInfoCommand, "", NULL },
631 { "respawn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRespawnCommand, "", NULL },
632 { "send", SEC_MODERATOR, true, NULL, "", sendCommandTable },
633 { "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL },
634 { "mute", SEC_MODERATOR, true, &ChatHandler::HandleMuteCommand, "", NULL },
635 { "unmute", SEC_MODERATOR, true, &ChatHandler::HandleUnmuteCommand, "", NULL },
636 { "movegens", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMovegensCommand, "", NULL },
637 { "cometome", SEC_ADMINISTRATOR, false, &ChatHandler::HandleComeToMeCommand, "", NULL },
638 { "damage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDamageCommand, "", NULL },
639 { "combatstop", SEC_GAMEMASTER, false, &ChatHandler::HandleCombatStopCommand, "", NULL },
640 { "flusharenapoints",SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL },
641 { "repairitems", SEC_GAMEMASTER, true, &ChatHandler::HandleRepairitemsCommand, "", NULL },
642 { "waterwalk", SEC_GAMEMASTER, false, &ChatHandler::HandleWaterwalkCommand, "", NULL },
644 { NULL, 0, false, NULL, "", NULL }
647 if(load_command_table)
649 load_command_table = false;
651 QueryResult *result = WorldDatabase.Query("SELECT name,security,help FROM command");
652 if (result)
656 Field *fields = result->Fetch();
657 std::string name = fields[0].GetCppString();
659 SetDataForCommandInTable(commandTable, name.c_str(), fields[1].GetUInt16(), fields[2].GetCppString(), name);
661 } while(result->NextRow());
662 delete result;
666 return commandTable;
669 const char *ChatHandler::GetMangosString(int32 entry) const
671 return m_session->GetMangosString(entry);
674 bool ChatHandler::isAvailable(ChatCommand const& cmd) const
676 // check security level only for simple command (without child commands)
677 return m_session->GetSecurity() >= cmd.SecurityLevel;
680 bool ChatHandler::HasLowerSecurity(Player* target, uint64 guid, bool strong)
682 WorldSession* target_session = NULL;
683 uint32 target_account = 0;
685 if (target)
686 target_session = target->GetSession();
687 else if (guid)
688 target_account = objmgr.GetPlayerAccountIdByGUID(guid);
690 if(!target_session && !target_account)
692 SendSysMessage(LANG_PLAYER_NOT_FOUND);
693 SetSentErrorMessage(true);
694 return true;
697 return HasLowerSecurityAccount(target_session,target_account,strong);
700 bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_account, bool strong)
702 uint32 target_sec;
704 // allow everything from console and RA console
705 if (!m_session)
706 return false;
708 // ignore only for non-players for non strong checks (when allow apply command at least to same sec level)
709 if (m_session->GetSecurity() > SEC_PLAYER && !strong && !sWorld.getConfig(CONFIG_GM_LOWER_SECURITY))
710 return false;
712 if (target)
713 target_sec = target->GetSecurity();
714 else if (target_account)
715 target_sec = accmgr.GetSecurity(target_account);
716 else
717 return true; // caller must report error for (target==NULL && target_account==0)
719 if (m_session->GetSecurity() < target_sec || (strong && m_session->GetSecurity() <= target_sec))
721 SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
722 SetSentErrorMessage(true);
723 return true;
726 return false;
729 bool ChatHandler::hasStringAbbr(const char* name, const char* part)
731 // non "" command
732 if( *name )
734 // "" part from non-"" command
735 if( !*part )
736 return false;
738 for(;;)
740 if( !*part )
741 return true;
742 else if( !*name )
743 return false;
744 else if( tolower( *name ) != tolower( *part ) )
745 return false;
746 ++name; ++part;
749 // allow with any for ""
751 return true;
754 void ChatHandler::SendSysMessage(const char *str)
756 WorldPacket data;
758 // need copy to prevent corruption by strtok call in LineFromMessage original string
759 char* buf = strdup(str);
760 char* pos = buf;
762 while(char* line = LineFromMessage(pos))
764 FillSystemMessageData(&data, line);
765 m_session->SendPacket(&data);
768 free(buf);
771 void ChatHandler::SendGlobalSysMessage(const char *str)
773 // Chat output
774 WorldPacket data;
776 // need copy to prevent corruption by strtok call in LineFromMessage original string
777 char* buf = strdup(str);
778 char* pos = buf;
780 while(char* line = LineFromMessage(pos))
782 FillSystemMessageData(&data, line);
783 sWorld.SendGlobalMessage(&data);
786 free(buf);
789 void ChatHandler::SendSysMessage(int32 entry)
791 SendSysMessage(GetMangosString(entry));
794 void ChatHandler::PSendSysMessage(int32 entry, ...)
796 const char *format = GetMangosString(entry);
797 va_list ap;
798 char str [2048];
799 va_start(ap, entry);
800 vsnprintf(str,2048,format, ap );
801 va_end(ap);
802 SendSysMessage(str);
805 void ChatHandler::PSendSysMessage(const char *format, ...)
807 va_list ap;
808 char str [2048];
809 va_start(ap, format);
810 vsnprintf(str,2048,format, ap );
811 va_end(ap);
812 SendSysMessage(str);
815 bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, const std::string& fullcmd)
817 char const* oldtext = text;
818 std::string cmd = "";
820 while (*text != ' ' && *text != '\0')
822 cmd += *text;
823 ++text;
826 while (*text == ' ') ++text;
828 for(uint32 i = 0; table[i].Name != NULL; ++i)
830 if( !hasStringAbbr(table[i].Name, cmd.c_str()) )
831 continue;
833 // select subcommand from child commands list
834 if(table[i].ChildCommands != NULL)
836 if(!ExecuteCommandInTable(table[i].ChildCommands, text, fullcmd))
838 if(text && text[0] != '\0')
839 SendSysMessage(LANG_NO_SUBCMD);
840 else
841 SendSysMessage(LANG_CMD_SYNTAX);
843 ShowHelpForCommand(table[i].ChildCommands,text);
846 return true;
849 // must be available and have handler
850 if(!table[i].Handler || !isAvailable(table[i]))
851 continue;
853 SetSentErrorMessage(false);
854 // table[i].Name == "" is special case: send original command to handler
855 if((this->*(table[i].Handler))(strlen(table[i].Name)!=0 ? text : oldtext))
857 if(table[i].SecurityLevel > SEC_PLAYER)
859 // chat case
860 if(m_session)
862 Player* p = m_session->GetPlayer();
863 uint64 sel_guid = p->GetSelection();
864 sLog.outCommand(m_session->GetAccountId(),"Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
865 fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
866 GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
870 // some commands have custom error messages. Don't send the default one in these cases.
871 else if(!sentErrorMessage)
873 if(!table[i].Help.empty())
874 SendSysMessage(table[i].Help.c_str());
875 else
876 SendSysMessage(LANG_CMD_SYNTAX);
879 return true;
882 return false;
885 bool ChatHandler::SetDataForCommandInTable(ChatCommand *table, const char* text, uint32 security, std::string const& help, std::string const& fullcommand )
887 std::string cmd = "";
889 while (*text != ' ' && *text != '\0')
891 cmd += *text;
892 ++text;
895 while (*text == ' ') ++text;
897 for(uint32 i = 0; table[i].Name != NULL; i++)
899 // for data fill use full explicit command names
900 if( table[i].Name != cmd )
901 continue;
903 // select subcommand from child commands list (including "")
904 if(table[i].ChildCommands != NULL)
906 if(SetDataForCommandInTable(table[i].ChildCommands, text, security, help, fullcommand))
907 return true;
908 else if(*text)
909 return false;
911 // fail with "" subcommands, then use normal level up command instead
913 // expected subcommand by full name DB content
914 else if(*text)
916 sLog.outErrorDb("Table `command` have unexpected subcommand '%s' in command '%s', skip.",text,fullcommand.c_str());
917 return false;
920 if(table[i].SecurityLevel != security)
921 sLog.outDetail("Table `command` overwrite for command '%s' default security (%u) by %u",fullcommand.c_str(),table[i].SecurityLevel,security);
923 table[i].SecurityLevel = security;
924 table[i].Help = help;
925 return true;
928 // in case "" command let process by caller
929 if(!cmd.empty())
931 if(table==getCommandTable())
932 sLog.outErrorDb("Table `command` have not existed command '%s', skip.",cmd.c_str());
933 else
934 sLog.outErrorDb("Table `command` have not existed subcommand '%s' in command '%s', skip.",cmd.c_str(),fullcommand.c_str());
937 return false;
940 int ChatHandler::ParseCommands(const char* text)
942 ASSERT(text);
943 ASSERT(*text);
945 //if(m_session->GetSecurity() == 0)
946 // return 0;
948 /// chat case (.command or !command format)
949 if (m_session)
951 if(text[0] != '!' && text[0] != '.')
952 return 0;
955 /// ignore single . and ! in line
956 if (strlen(text) < 2)
957 return 0;
959 /// ignore messages staring from many dots.
960 if ((text[0] == '.' && text[1] == '.') || (text[0] == '!' && text[1] == '!'))
961 return 0;
963 /// skip first . or ! (in console allowed use command with . and ! and without its)
964 if (text[0] == '!' || text[0] == '.')
965 ++text;
967 std::string fullcmd = text; // original `text` can't be used. It content destroyed in command code processing.
969 if (!ExecuteCommandInTable(getCommandTable(), text, fullcmd))
970 SendSysMessage(LANG_NO_CMD);
972 return 1;
975 bool ChatHandler::ShowHelpForSubCommands(ChatCommand *table, char const* cmd, char const* subcmd)
977 std::string list;
978 for(uint32 i = 0; table[i].Name != NULL; ++i)
980 // must be available (ignore handler existence for show command with possibe avalable subcomands
981 if(!isAvailable(table[i]))
982 continue;
984 /// for empty subcmd show all available
985 if( *subcmd && !hasStringAbbr(table[i].Name, subcmd))
986 continue;
988 if(m_session)
989 list += "\n ";
990 else
991 list += "\n\r ";
993 list += table[i].Name;
995 if(table[i].ChildCommands)
996 list += " ...";
999 if(list.empty())
1000 return false;
1002 if(table==getCommandTable())
1004 SendSysMessage(LANG_AVIABLE_CMD);
1005 PSendSysMessage("%s",list.c_str());
1007 else
1008 PSendSysMessage(LANG_SUBCMDS_LIST,cmd,list.c_str());
1010 return true;
1013 bool ChatHandler::ShowHelpForCommand(ChatCommand *table, const char* cmd)
1015 if(*cmd)
1017 for(uint32 i = 0; table[i].Name != NULL; ++i)
1019 // must be available (ignore handler existence for show command with possibe avalable subcomands
1020 if(!isAvailable(table[i]))
1021 continue;
1023 if( !hasStringAbbr(table[i].Name, cmd) )
1024 continue;
1026 // have subcommand
1027 char const* subcmd = (*cmd) ? strtok(NULL, " ") : "";
1029 if(table[i].ChildCommands && subcmd && *subcmd)
1031 if(ShowHelpForCommand(table[i].ChildCommands, subcmd))
1032 return true;
1035 if(!table[i].Help.empty())
1036 SendSysMessage(table[i].Help.c_str());
1038 if(table[i].ChildCommands)
1039 if(ShowHelpForSubCommands(table[i].ChildCommands,table[i].Name,subcmd ? subcmd : ""))
1040 return true;
1042 return !table[i].Help.empty();
1045 else
1047 for(uint32 i = 0; table[i].Name != NULL; ++i)
1049 // must be available (ignore handler existence for show command with possibe avalable subcomands
1050 if(!isAvailable(table[i]))
1051 continue;
1053 if(strlen(table[i].Name))
1054 continue;
1056 if(!table[i].Help.empty())
1057 SendSysMessage(table[i].Help.c_str());
1059 if(table[i].ChildCommands)
1060 if(ShowHelpForSubCommands(table[i].ChildCommands,"",""))
1061 return true;
1063 return !table[i].Help.empty();
1067 return ShowHelpForSubCommands(table,"",cmd);
1070 //Note: target_guid used only in CHAT_MSG_WHISPER_INFORM mode (in this case channelName ignored)
1071 void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit *speaker)
1073 uint32 messageLength = (message ? strlen(message) : 0) + 1;
1075 data->Initialize(SMSG_MESSAGECHAT, 100); // guess size
1076 *data << uint8(type);
1077 if ((type != CHAT_MSG_CHANNEL && type != CHAT_MSG_WHISPER) || language == LANG_ADDON)
1078 *data << uint32(language);
1079 else
1080 *data << uint32(LANG_UNIVERSAL);
1082 switch(type)
1084 case CHAT_MSG_SAY:
1085 case CHAT_MSG_PARTY:
1086 case CHAT_MSG_RAID:
1087 case CHAT_MSG_GUILD:
1088 case CHAT_MSG_OFFICER:
1089 case CHAT_MSG_YELL:
1090 case CHAT_MSG_WHISPER:
1091 case CHAT_MSG_CHANNEL:
1092 case CHAT_MSG_RAID_LEADER:
1093 case CHAT_MSG_RAID_WARNING:
1094 case CHAT_MSG_BG_SYSTEM_NEUTRAL:
1095 case CHAT_MSG_BG_SYSTEM_ALLIANCE:
1096 case CHAT_MSG_BG_SYSTEM_HORDE:
1097 case CHAT_MSG_BATTLEGROUND:
1098 case CHAT_MSG_BATTLEGROUND_LEADER:
1099 target_guid = session ? session->GetPlayer()->GetGUID() : 0;
1100 break;
1101 case CHAT_MSG_MONSTER_SAY:
1102 case CHAT_MSG_MONSTER_PARTY:
1103 case CHAT_MSG_MONSTER_YELL:
1104 case CHAT_MSG_MONSTER_WHISPER:
1105 case CHAT_MSG_MONSTER_EMOTE:
1106 case CHAT_MSG_RAID_BOSS_WHISPER:
1107 case CHAT_MSG_RAID_BOSS_EMOTE:
1109 *data << uint64(speaker->GetGUID());
1110 *data << uint32(0); // 2.1.0
1111 *data << uint32(strlen(speaker->GetName()) + 1);
1112 *data << speaker->GetName();
1113 uint64 listener_guid = 0;
1114 *data << uint64(listener_guid);
1115 if(listener_guid && !IS_PLAYER_GUID(listener_guid))
1117 *data << uint32(1); // string listener_name_length
1118 *data << uint8(0); // string listener_name
1120 *data << uint32(messageLength);
1121 *data << message;
1122 *data << uint8(0);
1123 return;
1125 default:
1126 if (type != CHAT_MSG_REPLY && type != CHAT_MSG_IGNORED && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
1127 target_guid = 0; // only for CHAT_MSG_WHISPER_INFORM used original value target_guid
1128 break;
1131 *data << uint64(target_guid); // there 0 for BG messages
1132 *data << uint32(0); // can be chat msg group or something
1134 if (type == CHAT_MSG_CHANNEL)
1136 ASSERT(channelName);
1137 *data << channelName;
1140 *data << uint64(target_guid);
1141 *data << uint32(messageLength);
1142 *data << message;
1143 if(session != 0 && type != CHAT_MSG_REPLY && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
1144 *data << uint8(session->GetPlayer()->chatTag());
1145 else
1146 *data << uint8(0);
1149 Player * ChatHandler::getSelectedPlayer()
1151 if(!m_session)
1152 return NULL;
1154 uint64 guid = m_session->GetPlayer()->GetSelection();
1156 if (guid == 0)
1157 return m_session->GetPlayer();
1159 return objmgr.GetPlayer(guid);
1162 Unit* ChatHandler::getSelectedUnit()
1164 if(!m_session)
1165 return NULL;
1167 uint64 guid = m_session->GetPlayer()->GetSelection();
1169 if (guid == 0)
1170 return m_session->GetPlayer();
1172 return ObjectAccessor::GetUnit(*m_session->GetPlayer(),guid);
1175 Creature* ChatHandler::getSelectedCreature()
1177 if(!m_session)
1178 return NULL;
1180 return ObjectAccessor::GetCreatureOrPetOrVehicle(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection());
1183 char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1)
1185 // skip empty
1186 if(!text)
1187 return NULL;
1189 // skip speces
1190 while(*text==' '||*text=='\t'||*text=='\b')
1191 ++text;
1193 if(!*text)
1194 return NULL;
1196 // return non link case
1197 if(text[0]!='|')
1198 return strtok(text, " ");
1200 // [name] Shift-click form |color|linkType:key|h[name]|h|r
1201 // or
1202 // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r
1204 char* check = strtok(text, "|"); // skip color
1205 if(!check)
1206 return NULL; // end of data
1208 char* cLinkType = strtok(NULL, ":"); // linktype
1209 if(!cLinkType)
1210 return NULL; // end of data
1212 if(strcmp(cLinkType,linkType) != 0)
1214 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after retturn from function
1215 SendSysMessage(LANG_WRONG_LINK_TYPE);
1216 return NULL;
1219 char* cKeys = strtok(NULL, "|"); // extract keys and values
1220 char* cKeysTail = strtok(NULL, "");
1222 char* cKey = strtok(cKeys, ":|"); // extract key
1223 if(something1)
1224 *something1 = strtok(NULL, ":|"); // extract something
1226 strtok(cKeysTail, "]"); // restart scan tail and skip name with possible spaces
1227 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function
1228 return cKey;
1231 char* ChatHandler::extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1)
1233 // skip empty
1234 if(!text)
1235 return NULL;
1237 // skip speces
1238 while(*text==' '||*text=='\t'||*text=='\b')
1239 ++text;
1241 if(!*text)
1242 return NULL;
1244 // return non link case
1245 if(text[0]!='|')
1246 return strtok(text, " ");
1248 // [name] Shift-click form |color|linkType:key|h[name]|h|r
1249 // or
1250 // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r
1251 // or
1252 // [name] Shift-click form |linkType:key|h[name]|h|r
1254 char* tail;
1256 if(text[1]=='c')
1258 char* check = strtok(text, "|"); // skip color
1259 if(!check)
1260 return NULL; // end of data
1262 tail = strtok(NULL, ""); // tail
1264 else
1265 tail = text+1; // skip first |
1267 char* cLinkType = strtok(tail, ":"); // linktype
1268 if(!cLinkType)
1269 return NULL; // end of data
1271 for(int i = 0; linkTypes[i]; ++i)
1273 if(strcmp(cLinkType,linkTypes[i]) == 0)
1275 char* cKeys = strtok(NULL, "|"); // extract keys and values
1276 char* cKeysTail = strtok(NULL, "");
1278 char* cKey = strtok(cKeys, ":|"); // extract key
1279 if(something1)
1280 *something1 = strtok(NULL, ":|"); // extract something
1282 strtok(cKeysTail, "]"); // restart scan tail and skip name with possible spaces
1283 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function
1284 if(found_idx)
1285 *found_idx = i;
1286 return cKey;
1290 strtok(NULL, " "); // skip link tail (to allow continue strtok(NULL,s) use after return from function
1291 SendSysMessage(LANG_WRONG_LINK_TYPE);
1292 return NULL;
1295 char const *fmtstring( char const *format, ... )
1297 va_list argptr;
1298 #define MAX_FMT_STRING 32000
1299 static char temp_buffer[MAX_FMT_STRING];
1300 static char string[MAX_FMT_STRING];
1301 static int index = 0;
1302 char *buf;
1303 int len;
1305 va_start(argptr, format);
1306 vsnprintf(temp_buffer,MAX_FMT_STRING, format, argptr);
1307 va_end(argptr);
1309 len = strlen(temp_buffer);
1311 if( len >= MAX_FMT_STRING )
1312 return "ERROR";
1314 if (len + index >= MAX_FMT_STRING-1)
1316 index = 0;
1319 buf = &string[index];
1320 memcpy( buf, temp_buffer, len+1 );
1322 index += len + 1;
1324 return buf;
1327 GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry)
1329 if(!m_session)
1330 return NULL;
1332 Player* pl = m_session->GetPlayer();
1334 GameObject* obj = pl->GetMap()->GetGameObject(MAKE_NEW_GUID(lowguid, entry, HIGHGUID_GAMEOBJECT));
1336 if(!obj && objmgr.GetGOData(lowguid)) // guid is DB guid of object
1338 // search near player then
1339 CellPair p(MaNGOS::ComputeCellPair(pl->GetPositionX(), pl->GetPositionY()));
1340 Cell cell(p);
1341 cell.data.Part.reserved = ALL_DISTRICT;
1343 MaNGOS::GameObjectWithDbGUIDCheck go_check(*pl,lowguid);
1344 MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck> checker(pl,obj,go_check);
1346 TypeContainerVisitor<MaNGOS::GameObjectSearcher<MaNGOS::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
1347 CellLock<GridReadGuard> cell_lock(cell, p);
1348 cell_lock->Visit(cell_lock, object_checker, *pl->GetMap());
1351 return obj;
1354 enum SpellLinkType
1356 SPELL_LINK_SPELL = 0,
1357 SPELL_LINK_TALENT = 1,
1358 SPELL_LINK_TRADE = 2
1361 static char const* const spellKeys[] =
1363 "Hspell", // normal spell
1364 "Htalent", // talent spell
1365 "Htrade", // profession/skill spell
1369 uint32 ChatHandler::extractSpellIdFromLink(char* text)
1371 // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r
1372 // number or [name] Shift-click form |color|Htalent:talent_id,rank|h[name]|h|r
1373 // number or [name] Shift-click form |color|Htrade:spell_id,skill_id,max_value,cur_value|h[name]|h|r
1374 int type = 0;
1375 char* param1_str = NULL;
1376 char* idS = extractKeyFromLink(text,spellKeys,&type,&param1_str);
1377 if(!idS)
1378 return 0;
1380 uint32 id = (uint32)atol(idS);
1382 switch(type)
1384 case SPELL_LINK_SPELL:
1385 return id;
1386 case SPELL_LINK_TALENT:
1388 // talent
1389 TalentEntry const* talentEntry = sTalentStore.LookupEntry(id);
1390 if(!talentEntry)
1391 return 0;
1393 int32 rank = param1_str ? (uint32)atol(param1_str) : 0;
1394 if(rank >= MAX_TALENT_RANK)
1395 return 0;
1397 if(rank < 0)
1398 rank = 0;
1400 return talentEntry->RankID[rank];
1402 case SPELL_LINK_TRADE:
1403 return id;
1406 // unknown type?
1407 return 0;
1410 GameTele const* ChatHandler::extractGameTeleFromLink(char* text)
1412 // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
1413 char* cId = extractKeyFromLink(text,"Htele");
1414 if(!cId)
1415 return false;
1417 // id case (explicit or from shift link)
1418 if(cId[0] >= '0' || cId[0] >= '9')
1419 if(uint32 id = atoi(cId))
1420 return objmgr.GetGameTele(id);
1422 return objmgr.GetGameTele(cId);
1425 enum GuidLinkType
1427 SPELL_LINK_PLAYER = 0, // must be first for selection in not link case
1428 SPELL_LINK_CREATURE = 1,
1429 SPELL_LINK_GAMEOBJECT = 2
1432 static char const* const guidKeys[] =
1434 "Hplayer",
1435 "Hcreature",
1436 "Hgameobject",
1440 uint64 ChatHandler::extractGuidFromLink(char* text)
1442 int type = 0;
1444 // |color|Hcreature:creature_guid|h[name]|h|r
1445 // |color|Hgameobject:go_guid|h[name]|h|r
1446 // |color|Hplayer:name|h[name]|h|r
1447 char* idS = extractKeyFromLink(text,guidKeys,&type);
1448 if(!idS)
1449 return 0;
1451 switch(type)
1453 case SPELL_LINK_PLAYER:
1455 std::string name = idS;
1456 if(!normalizePlayerName(name))
1457 return 0;
1459 if(Player* player = objmgr.GetPlayer(name.c_str()))
1460 return player->GetGUID();
1462 if(uint64 guid = objmgr.GetPlayerGUIDByName(name))
1463 return guid;
1465 return 0;
1467 case SPELL_LINK_CREATURE:
1469 uint32 lowguid = (uint32)atol(idS);
1471 if(CreatureData const* data = objmgr.GetCreatureData(lowguid) )
1472 return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_UNIT);
1473 else
1474 return 0;
1476 case SPELL_LINK_GAMEOBJECT:
1478 uint32 lowguid = (uint32)atol(idS);
1480 if(GameObjectData const* data = objmgr.GetGOData(lowguid) )
1481 return MAKE_NEW_GUID(lowguid,data->id,HIGHGUID_GAMEOBJECT);
1482 else
1483 return 0;
1487 // unknown type?
1488 return 0;
1491 std::string ChatHandler::extractPlayerNameFromLink(char* text)
1493 // |color|Hplayer:name|h[name]|h|r
1494 char* name_str = extractKeyFromLink(text,"Hplayer");
1495 if(!name_str)
1496 return "";
1498 std::string name = name_str;
1499 if(!normalizePlayerName(name))
1500 return "";
1502 return name;
1505 bool ChatHandler::extractPlayerTarget(char* args, Player** player, uint64* player_guid /*=NULL*/,std::string* player_name /*= NULL*/)
1507 if (args && *args)
1509 std::string name = extractPlayerNameFromLink(args);
1510 if (name.empty())
1512 SendSysMessage(LANG_PLAYER_NOT_FOUND);
1513 SetSentErrorMessage(true);
1514 return false;
1517 Player* pl = objmgr.GetPlayer(name.c_str());
1519 // if allowed player pointer
1520 if(player)
1521 *player = pl;
1523 // if need guid value from DB (in name case for check player existence)
1524 uint64 guid = !pl && (player_guid || player_name) ? objmgr.GetPlayerGUIDByName(name) : 0;
1526 // if allowed player guid (if no then only online players allowed)
1527 if(player_guid)
1528 *player_guid = pl ? pl->GetGUID() : guid;
1530 if(player_name)
1531 *player_name = pl || guid ? name : "";
1533 else
1535 Player* pl = getSelectedPlayer();
1536 // if allowed player pointer
1537 if(player)
1538 *player = pl;
1539 // if allowed player guid (if no then only online players allowed)
1540 if(player_guid)
1541 *player_guid = pl ? pl->GetGUID() : 0;
1543 if(player_name)
1544 *player_name = pl ? pl->GetName() : "";
1547 // some from req. data must be provided (note: name is empty if player not exist)
1548 if((!player || !*player) && (!player_guid || !*player_guid) && (!player_name || player_name->empty()))
1550 SendSysMessage(LANG_PLAYER_NOT_FOUND);
1551 SetSentErrorMessage(true);
1552 return false;
1555 return true;
1558 void ChatHandler::extractOptFirstArg(char* args, char** arg1, char** arg2)
1560 char* p1 = strtok(args, " ");
1561 char* p2 = strtok(NULL, " ");
1563 if(!p2)
1565 p2 = p1;
1566 p1 = NULL;
1569 if(arg1)
1570 *arg1 = p1;
1572 if(arg2)
1573 *arg2 = p2;
1576 char* ChatHandler::extractQuotedArg( char* args )
1578 if(!*args)
1579 return NULL;
1581 if(*args=='"')
1582 return strtok(args+1, "\"");
1583 else
1585 char* space = strtok(args, "\"");
1586 if(!space)
1587 return false;
1588 return strtok(NULL, "\"");
1592 bool ChatHandler::needReportToTarget(Player* chr) const
1594 Player* pl = m_session->GetPlayer();
1595 return pl != chr && pl->IsVisibleGloballyFor(chr);
1598 LocaleConstant ChatHandler::GetSessionDbcLocale() const
1600 return m_session->GetSessionDbcLocale();
1603 int ChatHandler::GetSessionDbLocaleIndex() const
1605 return m_session->GetSessionDbLocaleIndex();
1608 const char *CliHandler::GetMangosString(int32 entry) const
1610 return objmgr.GetMangosStringForDBCLocale(entry);
1613 bool CliHandler::isAvailable(ChatCommand const& cmd) const
1615 // skip non-console commands in console case
1616 return cmd.AllowConsole;
1619 void CliHandler::SendSysMessage(const char *str)
1621 m_print(str);
1622 m_print("\r\n");
1625 std::string CliHandler::GetNameLink() const
1627 return GetMangosString(LANG_CONSOLE_COMMAND);
1630 bool CliHandler::needReportToTarget(Player* /*chr*/) const
1632 return true;
1635 LocaleConstant CliHandler::GetSessionDbcLocale() const
1637 return sWorld.GetDefaultDbcLocale();
1640 int CliHandler::GetSessionDbLocaleIndex() const
1642 return objmgr.GetDBCLocaleIndex();