aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/AccountMgr.h1
-rw-r--r--src/game/Chat.cpp835
-rw-r--r--src/game/Chat.h72
-rw-r--r--src/game/Language.h91
-rw-r--r--src/game/Level0.cpp54
-rw-r--r--src/game/Level1.cpp60
-rw-r--r--src/game/Level2.cpp153
-rw-r--r--src/game/Level3.cpp1435
-rw-r--r--src/game/ObjectMgr.h1
-rw-r--r--src/game/PlayerDump.cpp131
-rw-r--r--src/game/PlayerDump.h15
-rw-r--r--src/game/SharedDefines.h16
-rw-r--r--src/game/World.cpp98
-rw-r--r--src/game/World.h58
-rw-r--r--src/game/WorldSession.cpp2
-rw-r--r--src/game/WorldSession.h6
-rw-r--r--src/shared/Common.h3
-rw-r--r--src/trinitycore/CliRunnable.cpp1177
-rw-r--r--src/trinitycore/RASocket.cpp31
-rw-r--r--src/trinitycore/RASocket.h2
20 files changed, 2128 insertions, 2113 deletions
diff --git a/src/game/AccountMgr.h b/src/game/AccountMgr.h
index 3d86bd78672..0c1703ee2d9 100644
--- a/src/game/AccountMgr.h
+++ b/src/game/AccountMgr.h
@@ -50,7 +50,6 @@ class AccountMgr
bool CheckPassword(uint32 accid, std::string passwd);
uint32 GetId(std::string username);
- uint32 GetIdByGUID(const uint64 &guid) const;
uint32 GetSecurity(uint32 acc_id);
bool GetName(uint32 acc_id, std::string &name);
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 795471da336..67c79642631 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -38,454 +38,506 @@ bool ChatHandler::load_command_table = true;
ChatCommand * ChatHandler::getCommandTable()
{
+ static ChatCommand accountSetCommandTable[] =
+ {
+ { "addon", SEC_ADMINISTRATOR, true, &ChatHandler::HandleAccountSetAddonCommand, "", NULL },
+ { "gmlevel", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetGmLevelCommand, "", NULL },
+ { "password", SEC_CONSOLE, true, &ChatHandler::HandleAccountSetPasswordCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand accountCommandTable[] =
+ {
+ { "create", SEC_CONSOLE, true, &ChatHandler::HandleAccountCreateCommand, "", NULL },
+ { "delete", SEC_CONSOLE, true, &ChatHandler::HandleAccountDeleteCommand, "", NULL },
+ { "onlinelist", SEC_CONSOLE, true, &ChatHandler::HandleAccountOnlineListCommand, "", NULL },
+ { "set", SEC_ADMINISTRATOR, true, NULL, "", accountSetCommandTable },
+ { "", SEC_PLAYER, false, &ChatHandler::HandleAccountCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand serverSetCommandTable[] =
+ {
+ { "loglevel", SEC_CONSOLE, true, &ChatHandler::HandleServerSetLogLevelCommand, "", NULL },
+ { "motd", SEC_ADMINISTRATOR, true, &ChatHandler::HandleServerSetMotdCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
static ChatCommand serverCommandTable[] =
{
- { "idlerestart", SEC_ADMINISTRATOR, &ChatHandler::HandleIdleRestartCommand, "", NULL },
- { "idleshutdown", SEC_ADMINISTRATOR, &ChatHandler::HandleIdleShutDownCommand, "", NULL },
- { "info", SEC_PLAYER, &ChatHandler::HandleInfoCommand, "", NULL },
- { "restart", SEC_ADMINISTRATOR, &ChatHandler::HandleRestartCommand, "", NULL },
- { "shutdown", SEC_ADMINISTRATOR, &ChatHandler::HandleShutDownCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "corpses", SEC_GAMEMASTER, true, &ChatHandler::HandleServerCorpsesCommand, "", NULL },
+ { "exit", SEC_CONSOLE, true, &ChatHandler::HandleServerExitCommand, "", NULL },
+ { "idlerestart", SEC_ADMINISTRATOR, true, &ChatHandler::HandleIdleRestartCommand, "", NULL },
+ { "idleshutdown", SEC_ADMINISTRATOR, true, &ChatHandler::HandleIdleShutDownCommand, "", NULL },
+ { "info", SEC_PLAYER, true, &ChatHandler::HandleInfoCommand, "", NULL },
+ { "motd", SEC_PLAYER, true, &ChatHandler::HandleServerMotdCommand, "", NULL },
+ { "restart", SEC_ADMINISTRATOR, true, &ChatHandler::HandleRestartCommand, "", NULL },
+ { "shutdown", SEC_ADMINISTRATOR, true, &ChatHandler::HandleShutDownCommand, "", NULL },
+ { "set", SEC_ADMINISTRATOR, true, NULL, "", serverSetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand modifyCommandTable[] =
{
- { "hp", SEC_MODERATOR, &ChatHandler::HandleModifyHPCommand, "", NULL },
- { "mana", SEC_MODERATOR, &ChatHandler::HandleModifyManaCommand, "", NULL },
- { "rage", SEC_MODERATOR, &ChatHandler::HandleModifyRageCommand, "", NULL },
- { "energy", SEC_MODERATOR, &ChatHandler::HandleModifyEnergyCommand, "", NULL },
- { "money", SEC_MODERATOR, &ChatHandler::HandleModifyMoneyCommand, "", NULL },
- { "speed", SEC_MODERATOR, &ChatHandler::HandleModifySpeedCommand, "", NULL },
- { "swim", SEC_MODERATOR, &ChatHandler::HandleModifySwimCommand, "", NULL },
- { "scale", SEC_MODERATOR, &ChatHandler::HandleModifyScaleCommand, "", NULL },
- { "bit", SEC_MODERATOR, &ChatHandler::HandleModifyBitCommand, "", NULL },
- { "bwalk", SEC_MODERATOR, &ChatHandler::HandleModifyBWalkCommand, "", NULL },
- { "fly", SEC_MODERATOR, &ChatHandler::HandleModifyFlyCommand, "", NULL },
- { "aspeed", SEC_MODERATOR, &ChatHandler::HandleModifyASpeedCommand, "", NULL },
- { "faction", SEC_MODERATOR, &ChatHandler::HandleModifyFactionCommand, "", NULL },
- { "spell", SEC_MODERATOR, &ChatHandler::HandleModifySpellCommand, "", NULL },
- { "tp", SEC_MODERATOR, &ChatHandler::HandleModifyTalentCommand, "", NULL },
- { "titles", SEC_MODERATOR, &ChatHandler::HandleModifyKnownTitlesCommand, "", NULL },
- { "mount", SEC_MODERATOR, &ChatHandler::HandleModifyMountCommand, "", NULL },
- { "honor", SEC_MODERATOR, &ChatHandler::HandleModifyHonorCommand, "", NULL },
- { "rep", SEC_MODERATOR, &ChatHandler::HandleModifyRepCommand, "", NULL },
- { "arena", SEC_MODERATOR, &ChatHandler::HandleModifyArenaCommand, "", NULL },
- { "drunk", SEC_MODERATOR, &ChatHandler::HandleDrunkCommand, "", NULL },
- { "standstate", SEC_GAMEMASTER, &ChatHandler::HandleStandStateCommand, "", NULL },
- { "morph", SEC_GAMEMASTER, &ChatHandler::HandleMorphCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "hp", SEC_MODERATOR, false, &ChatHandler::HandleModifyHPCommand, "", NULL },
+ { "mana", SEC_MODERATOR, false, &ChatHandler::HandleModifyManaCommand, "", NULL },
+ { "rage", SEC_MODERATOR, false, &ChatHandler::HandleModifyRageCommand, "", NULL },
+ { "energy", SEC_MODERATOR, false, &ChatHandler::HandleModifyEnergyCommand, "", NULL },
+ { "money", SEC_MODERATOR, false, &ChatHandler::HandleModifyMoneyCommand, "", NULL },
+ { "speed", SEC_MODERATOR, false, &ChatHandler::HandleModifySpeedCommand, "", NULL },
+ { "swim", SEC_MODERATOR, false, &ChatHandler::HandleModifySwimCommand, "", NULL },
+ { "scale", SEC_MODERATOR, false, &ChatHandler::HandleModifyScaleCommand, "", NULL },
+ { "bit", SEC_MODERATOR, false, &ChatHandler::HandleModifyBitCommand, "", NULL },
+ { "bwalk", SEC_MODERATOR, false, &ChatHandler::HandleModifyBWalkCommand, "", NULL },
+ { "fly", SEC_MODERATOR, false, &ChatHandler::HandleModifyFlyCommand, "", NULL },
+ { "aspeed", SEC_MODERATOR, false, &ChatHandler::HandleModifyASpeedCommand, "", NULL },
+ { "faction", SEC_MODERATOR, false, &ChatHandler::HandleModifyFactionCommand, "", NULL },
+ { "spell", SEC_MODERATOR, false, &ChatHandler::HandleModifySpellCommand, "", NULL },
+ { "tp", SEC_MODERATOR, false, &ChatHandler::HandleModifyTalentCommand, "", NULL },
+ { "titles", SEC_MODERATOR, false, &ChatHandler::HandleModifyKnownTitlesCommand, "", NULL },
+ { "mount", SEC_MODERATOR, false, &ChatHandler::HandleModifyMountCommand, "", NULL },
+ { "honor", SEC_MODERATOR, false, &ChatHandler::HandleModifyHonorCommand, "", NULL },
+ { "rep", SEC_MODERATOR, false, &ChatHandler::HandleModifyRepCommand, "", NULL },
+ { "arena", SEC_MODERATOR, false, &ChatHandler::HandleModifyArenaCommand, "", NULL },
+ { "drunk", SEC_MODERATOR, false, &ChatHandler::HandleDrunkCommand, "", NULL },
+ { "standstate", SEC_GAMEMASTER, false, &ChatHandler::HandleStandStateCommand, "", NULL },
+ { "morph", SEC_GAMEMASTER, false, &ChatHandler::HandleMorphCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand wpCommandTable[] =
{
- { "show", SEC_GAMEMASTER, &ChatHandler::HandleWpShowCommand, "", NULL },
- { "add", SEC_GAMEMASTER, &ChatHandler::HandleWpAddCommand, "", NULL },
- { "modify", SEC_GAMEMASTER, &ChatHandler::HandleWpModifyCommand, "", NULL },
- { "export", SEC_ADMINISTRATOR, &ChatHandler::HandleWpExportCommand, "", NULL },
- { "import", SEC_ADMINISTRATOR, &ChatHandler::HandleWpImportCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "show", SEC_GAMEMASTER, false, &ChatHandler::HandleWpShowCommand, "", NULL },
+ { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleWpAddCommand, "", NULL },
+ { "modify", SEC_GAMEMASTER, false, &ChatHandler::HandleWpModifyCommand, "", NULL },
+ { "export", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpExportCommand, "", NULL },
+ { "import", SEC_ADMINISTRATOR, false, &ChatHandler::HandleWpImportCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
+ static ChatCommand banCommandTable[] =
+ {
+ { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanAccountCommand, "", NULL },
+ { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanCharacterCommand, "", NULL },
+ { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanIPCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand baninfoCommandTable[] =
+ {
+ { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoAccountCommand, "", NULL },
+ { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoCharacterCommand, "", NULL },
+ { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanInfoIPCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand banlistCommandTable[] =
+ {
+ { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListAccountCommand, "", NULL },
+ { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListCharacterCommand, "", NULL },
+ { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleBanListIPCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand unbanCommandTable[] =
+ {
+ { "account", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanAccountCommand, "", NULL },
+ { "character", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanCharacterCommand, "", NULL },
+ { "ip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleUnBanIPCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
static ChatCommand debugCommandTable[] =
{
- { "inarc", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugInArcCommand, "", NULL },
- { "spellfail", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugSpellFailCommand, "", NULL },
- { "setpoi", SEC_ADMINISTRATOR, &ChatHandler::HandleSetPoiCommand, "", NULL },
- { "qpartymsg", SEC_ADMINISTRATOR, &ChatHandler::HandleSendQuestPartyMsgCommand, "", NULL },
- { "qinvalidmsg", SEC_ADMINISTRATOR, &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL },
- { "equiperr", SEC_ADMINISTRATOR, &ChatHandler::HandleEquipErrorCommand, "", NULL },
- { "sellerr", SEC_ADMINISTRATOR, &ChatHandler::HandleSellErrorCommand, "", NULL },
- { "buyerr", SEC_ADMINISTRATOR, &ChatHandler::HandleBuyErrorCommand, "", NULL },
- { "sendopcode", SEC_ADMINISTRATOR, &ChatHandler::HandleSendOpcodeCommand, "", NULL },
- { "uws", SEC_ADMINISTRATOR, &ChatHandler::HandleUpdateWorldStateCommand, "", NULL },
- { "ps", SEC_ADMINISTRATOR, &ChatHandler::HandlePlaySound2Command, "", NULL },
- { "scn", SEC_ADMINISTRATOR, &ChatHandler::HandleSendChannelNotifyCommand, "", NULL },
- { "scm", SEC_ADMINISTRATOR, &ChatHandler::HandleSendChatMsgCommand, "", NULL },
- { "getitemstate", SEC_ADMINISTRATOR, &ChatHandler::HandleGetItemState, "", NULL },
- { "playsound", SEC_MODERATOR, &ChatHandler::HandlePlaySoundCommand, "", NULL },
- { "update", SEC_ADMINISTRATOR, &ChatHandler::HandleUpdate, "", NULL },
- { "setvalue", SEC_ADMINISTRATOR, &ChatHandler::HandleSetValue, "", NULL },
- { "getvalue", SEC_ADMINISTRATOR, &ChatHandler::HandleGetValue, "", NULL },
- { "Mod32Value", SEC_ADMINISTRATOR, &ChatHandler::HandleMod32Value, "", NULL },
- { "anim", SEC_GAMEMASTER, &ChatHandler::HandleAnimCommand, "", NULL },
- { "lootrecipient", SEC_GAMEMASTER, &ChatHandler::HandleGetLootRecipient, "", NULL },
- { "arena", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugArenaCommand, "", NULL },
- { "threatlist", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugThreatList, "", NULL },
- { "hostilrefs", SEC_ADMINISTRATOR, &ChatHandler::HandleDebugHostilRefList, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "inarc", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugInArcCommand, "", NULL },
+ { "spellfail", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDebugSpellFailCommand, "", NULL },
+ { "setpoi", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetPoiCommand, "", NULL },
+ { "qpartymsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendQuestPartyMsgCommand, "", NULL },
+ { "qinvalidmsg", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL },
+ { "equiperr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleEquipErrorCommand, "", NULL },
+ { "sellerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSellErrorCommand, "", NULL },
+ { "buyerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBuyErrorCommand, "", NULL },
+ { "sendopcode", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendOpcodeCommand, "", NULL },
+ { "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdateWorldStateCommand, "", NULL },
+ { "ps", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlaySound2Command, "", NULL },
+ { "scn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChannelNotifyCommand, "", NULL },
+ { "scm", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChatMsgCommand, "", NULL },
+ { "getitemstate", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetItemState, "", NULL },
+ { "playsound", SEC_MODERATOR, false, &ChatHandler::HandlePlaySoundCommand, "", NULL },
+ { "update", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdate, "", NULL },
+ { "setvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetValue, "", NULL },
+ { "getvalue", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetValue, "", NULL },
+ { "Mod32Value", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMod32Value, "", NULL },
+ { "anim", SEC_GAMEMASTER, false, &ChatHandler::HandleAnimCommand, "", NULL },
+ { "lootrecipient", SEC_GAMEMASTER, false, &ChatHandler::HandleGetLootRecipient, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand eventCommandTable[] =
{
- { "activelist", SEC_GAMEMASTER, &ChatHandler::HandleEventActiveListCommand, "", NULL },
- { "start", SEC_GAMEMASTER, &ChatHandler::HandleEventStartCommand, "", NULL },
- { "stop", SEC_GAMEMASTER, &ChatHandler::HandleEventStopCommand, "", NULL },
- { "", SEC_GAMEMASTER, &ChatHandler::HandleEventInfoCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "activelist", SEC_GAMEMASTER, true, &ChatHandler::HandleEventActiveListCommand, "", NULL },
+ { "start", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStartCommand, "", NULL },
+ { "stop", SEC_GAMEMASTER, true, &ChatHandler::HandleEventStopCommand, "", NULL },
+ { "", SEC_GAMEMASTER, true, &ChatHandler::HandleEventInfoCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand learnCommandTable[] =
{
- { "all", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllCommand, "", NULL },
- { "all_gm", SEC_GAMEMASTER, &ChatHandler::HandleLearnAllGMCommand, "", NULL },
- { "all_crafts", SEC_GAMEMASTER, &ChatHandler::HandleLearnAllCraftsCommand, "", NULL },
- { "all_default", SEC_MODERATOR, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL },
- { "all_lang", SEC_MODERATOR, &ChatHandler::HandleLearnAllLangCommand, "", NULL },
- { "all_myclass", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL },
- { "all_myspells", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL },
- { "all_mytalents", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL },
- { "all_recipes", SEC_GAMEMASTER, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL },
- { "", SEC_ADMINISTRATOR, &ChatHandler::HandleLearnCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllCommand, "", NULL },
+ { "all_gm", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllGMCommand, "", NULL },
+ { "all_crafts", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllCraftsCommand, "", NULL },
+ { "all_default", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllDefaultCommand, "", NULL },
+ { "all_lang", SEC_MODERATOR, false, &ChatHandler::HandleLearnAllLangCommand, "", NULL },
+ { "all_myclass", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyClassCommand, "", NULL },
+ { "all_myspells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMySpellsCommand, "", NULL },
+ { "all_mytalents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnAllMyTalentsCommand, "", NULL },
+ { "all_recipes", SEC_GAMEMASTER, false, &ChatHandler::HandleLearnAllRecipesCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLearnCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand reloadCommandTable[] =
{
- { "all", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllCommand, "", NULL },
- { "all_loot", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllLootCommand, "", NULL },
- { "all_npc", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllNpcCommand, "", NULL },
- { "all_quest", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllQuestCommand, "", NULL },
- { "all_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL },
- { "all_spell", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllSpellCommand, "", NULL },
- { "all_item", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllItemCommand, "", NULL },
- { "all_locales", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL },
-
- { "config", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadConfigCommand, "", NULL },
-
- { "areatrigger_tavern", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL },
- { "areatrigger_teleport", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL },
- { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL },
- { "event_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL },
- { "command", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCommandCommand, "", NULL },
- { "creature_involvedrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL },
- { "creature_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL },
- { "creature_questrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL },
- { "disenchant_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL },
- { "fishing_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL },
- { "game_graveyard_zone", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL },
- { "game_tele", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameTeleCommand, "", NULL },
- { "gameobject_involvedrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL },
- { "gameobject_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL },
- { "gameobject_questrelation", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL },
- { "gameobject_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL },
- { "item_enchantment_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
- { "item_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
- { "trinity_string", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL },
- { "npc_gossip", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
- { "npc_trainer", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
- { "npc_vendor", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL },
- { "page_text", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadPageTextsCommand, "", NULL },
- { "pickpocketing_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
- { "prospecting_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
- { "quest_mail_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL },
- { "quest_end_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL },
- { "quest_start_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL },
- { "quest_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL },
- { "reference_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL },
- { "reserved_name", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadReservedNameCommand, "", NULL },
- { "skill_discovery_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
- { "skill_extra_item_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL },
- { "skill_fishing_base_level", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL },
- { "skinning_loot_template", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL },
- { "spell_affect", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL },
- { "spell_chain", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellChainCommand, "", NULL },
- { "spell_elixir", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL },
- { "spell_learn_spell", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL },
- { "spell_pet_auras", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL },
- { "spell_proc_event", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL },
- { "spell_script_target", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL },
- { "spell_scripts", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL },
- { "spell_target_position", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL },
- { "spell_threats", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL },
- { "spell_disabled", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadSpellDisabledCommand, "", NULL },
- { "locales_creature", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
- { "locales_gameobject", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
- { "locales_item", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
- { "locales_npc_text", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
- { "locales_page_text", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
- { "locales_quest", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
- { "", SEC_ADMINISTRATOR, &ChatHandler::HandleReloadCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllCommand, "", NULL },
+ {"all_loot", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLootCommand, "", NULL },
+ { "all_npc", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllNpcCommand, "", NULL },
+ { "all_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllQuestCommand, "", NULL },
+ { "all_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL },
+ { "all_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllSpellCommand, "", NULL },
+ { "all_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllItemCommand, "", NULL },
+ { "all_locales", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL },
+
+ { "config", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadConfigCommand, "", NULL },
+
+ { "areatrigger_tavern", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL },
+ { "areatrigger_teleport", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL },
+ { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL },
+ { "event_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL },
+ { "command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommandCommand, "", NULL },
+ { "creature_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL },
+ { "creature_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL },
+ { "creature_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL },
+ { "disenchant_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL },
+ { "fishing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL },
+ { "game_graveyard_zone", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL },
+ { "game_tele", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameTeleCommand, "", NULL },
+ { "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL },
+ { "gameobject_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL },
+ { "gameobject_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL },
+ { "gameobject_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL },
+ { "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
+ { "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
+ { "trinity_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL },
+ { "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
+ { "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
+ { "npc_vendor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL },
+ { "page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPageTextsCommand, "", NULL },
+ { "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
+ { "prospecting_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
+ { "quest_mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL },
+ { "quest_end_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL },
+ { "quest_start_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL },
+ { "quest_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL },
+ { "reference_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL },
+ { "reserved_name", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadReservedNameCommand, "", NULL },
+ { "skill_discovery_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
+ { "skill_extra_item_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL },
+ { "skill_fishing_base_level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL },
+ { "skinning_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL },
+ { "spell_affect", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL },
+ { "spell_chain", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellChainCommand, "", NULL },
+ { "spell_elixir", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL },
+ { "spell_learn_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL },
+ { "spell_pet_auras", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL },
+ { "spell_proc_event", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL },
+ { "spell_script_target", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL },
+ { "spell_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL },
+ { "spell_target_position", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL },
+ { "spell_threats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL },
+ { "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
+ { "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
+ { "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
+ { "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
+ { "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
+ { "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
+
+ { "", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand honorCommandTable[] =
{
- { "add", SEC_GAMEMASTER, &ChatHandler::HandleAddHonorCommand, "", NULL },
- { "addkill", SEC_GAMEMASTER, &ChatHandler::HandleHonorAddKillCommand, "", NULL },
- { "update", SEC_GAMEMASTER, &ChatHandler::HandleUpdateHonorFieldsCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleAddHonorCommand, "", NULL },
+ { "addkill", SEC_GAMEMASTER, false, &ChatHandler::HandleHonorAddKillCommand, "", NULL },
+ { "update", SEC_GAMEMASTER, false, &ChatHandler::HandleUpdateHonorFieldsCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand guildCommandTable[] =
{
- { "create", SEC_GAMEMASTER, &ChatHandler::HandleGuildCreateCommand, "", NULL },
- { "delete", SEC_GAMEMASTER, &ChatHandler::HandleGuildDeleteCommand, "", NULL },
- { "invite", SEC_GAMEMASTER, &ChatHandler::HandleGuildInviteCommand, "", NULL },
- { "uninvite", SEC_GAMEMASTER, &ChatHandler::HandleGuildUninviteCommand, "", NULL },
- { "rank", SEC_GAMEMASTER, &ChatHandler::HandleGuildRankCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "create", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildCreateCommand, "", NULL },
+ { "delete", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildDeleteCommand, "", NULL },
+ { "invite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildInviteCommand, "", NULL },
+ { "uninvite", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildUninviteCommand, "", NULL },
+ { "rank", SEC_GAMEMASTER, true, &ChatHandler::HandleGuildRankCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand groupCommandTable[] =
{
- { "leader", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupLeaderCommand, "", NULL },
- { "disband", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupDisbandCommand, "", NULL },
- { "remove", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupRemoveCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "leader", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGroupLeaderCommand, "", NULL },
+ { "disband", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGroupDisbandCommand, "", NULL },
+ { "remove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGroupRemoveCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand lookupPlayerCommandTable[] =
{
- { "ip", SEC_GAMEMASTER, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
- { "account", SEC_GAMEMASTER, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL },
- { "email", SEC_GAMEMASTER, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
+ { "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL },
+ { "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand lookupCommandTable[] =
{
- { "area", SEC_MODERATOR, &ChatHandler::HandleLookupAreaCommand, "", NULL },
- { "creature", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupCreatureCommand, "", NULL },
- { "event", SEC_GAMEMASTER, &ChatHandler::HandleLookupEventCommand, "", NULL },
- { "faction", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupFactionCommand, "", NULL },
- { "item", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupItemCommand, "", NULL },
- { "itemset", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupItemSetCommand, "", NULL },
- { "object", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupObjectCommand, "", NULL },
- { "quest", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupQuestCommand, "", NULL },
- { "player", SEC_GAMEMASTER, NULL, "", lookupPlayerCommandTable },
- { "skill", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupSkillCommand, "", NULL },
- { "spell", SEC_ADMINISTRATOR, &ChatHandler::HandleLookupSpellCommand, "", NULL },
- { "tele", SEC_MODERATOR, &ChatHandler::HandleLookupTeleCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "area", SEC_MODERATOR, true, &ChatHandler::HandleLookupAreaCommand, "", NULL },
+ { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupCreatureCommand, "", NULL },
+ { "event", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupEventCommand, "", NULL },
+ { "faction", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupFactionCommand, "", NULL },
+ { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemCommand, "", NULL },
+ { "itemset", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupItemSetCommand, "", NULL },
+ { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupObjectCommand, "", NULL },
+ { "quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupQuestCommand, "", NULL },
+ { "player", SEC_GAMEMASTER, true, NULL, "", lookupPlayerCommandTable },
+ { "skill", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSkillCommand, "", NULL },
+ { "spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLookupSpellCommand, "", NULL },
+ { "tele", SEC_MODERATOR, true, &ChatHandler::HandleLookupTeleCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand resetCommandTable[] =
{
- { "honor", SEC_ADMINISTRATOR, &ChatHandler::HandleResetHonorCommand, "", NULL },
- { "level", SEC_ADMINISTRATOR, &ChatHandler::HandleResetLevelCommand, "", NULL },
- { "spells", SEC_ADMINISTRATOR, &ChatHandler::HandleResetSpellsCommand, "", NULL },
- { "stats", SEC_ADMINISTRATOR, &ChatHandler::HandleResetStatsCommand, "", NULL },
- { "talents", SEC_ADMINISTRATOR, &ChatHandler::HandleResetTalentsCommand, "", NULL },
- { "all", SEC_ADMINISTRATOR, &ChatHandler::HandleResetAllCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "honor", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetHonorCommand, "", NULL },
+ { "level", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetLevelCommand, "", NULL },
+ { "spells", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetSpellsCommand, "", NULL },
+ { "stats", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetStatsCommand, "", NULL },
+ { "talents", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetTalentsCommand, "", NULL },
+ { "all", SEC_ADMINISTRATOR, false, &ChatHandler::HandleResetAllCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand castCommandTable[] =
{
- { "back", SEC_ADMINISTRATOR, &ChatHandler::HandleCastBackCommand, "", NULL },
- { "dist", SEC_ADMINISTRATOR, &ChatHandler::HandleCastDistCommand, "", NULL },
- { "self", SEC_ADMINISTRATOR, &ChatHandler::HandleCastSelfCommand, "", NULL },
- { "target", SEC_ADMINISTRATOR, &ChatHandler::HandleCastTargetCommand, "", NULL },
- { "", SEC_ADMINISTRATOR, &ChatHandler::HandleCastCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "back", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastBackCommand, "", NULL },
+ { "dist", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastDistCommand, "", NULL },
+ { "self", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastSelfCommand, "", NULL },
+ { "target", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastTargetCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCastCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand pdumpCommandTable[] =
{
- { "load", SEC_ADMINISTRATOR, &ChatHandler::HandleLoadPDumpCommand, "", NULL },
- { "write", SEC_ADMINISTRATOR, &ChatHandler::HandleWritePDumpCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "load", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadPDumpCommand, "", NULL },
+ { "write", SEC_ADMINISTRATOR, true, &ChatHandler::HandleWritePDumpCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand listCommandTable[] =
{
- { "creature", SEC_ADMINISTRATOR, &ChatHandler::HandleListCreatureCommand, "", NULL },
- { "item", SEC_ADMINISTRATOR, &ChatHandler::HandleListItemCommand, "", NULL },
- { "object", SEC_ADMINISTRATOR, &ChatHandler::HandleListObjectCommand, "", NULL },
- { "auras", SEC_ADMINISTRATOR, &ChatHandler::HandleListAurasCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListCreatureCommand, "", NULL },
+ { "item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListItemCommand, "", NULL },
+ { "object", SEC_ADMINISTRATOR, true, &ChatHandler::HandleListObjectCommand, "", NULL },
+ { "auras", SEC_ADMINISTRATOR, false, &ChatHandler::HandleListAurasCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand teleCommandTable[] =
{
- { "add", SEC_ADMINISTRATOR, &ChatHandler::HandleAddTeleCommand, "", NULL },
- { "del", SEC_ADMINISTRATOR, &ChatHandler::HandleDelTeleCommand, "", NULL },
- { "name", SEC_MODERATOR, &ChatHandler::HandleNameTeleCommand, "", NULL },
- { "group", SEC_MODERATOR, &ChatHandler::HandleGroupTeleCommand, "", NULL },
- { "", SEC_MODERATOR, &ChatHandler::HandleTeleCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddTeleCommand, "", NULL },
+ { "del", SEC_ADMINISTRATOR, true, &ChatHandler::HandleDelTeleCommand, "", NULL },
+ { "name", SEC_MODERATOR, true, &ChatHandler::HandleNameTeleCommand, "", NULL },
+ { "group", SEC_MODERATOR, false, &ChatHandler::HandleGroupTeleCommand, "", NULL },
+ { "", SEC_MODERATOR, false, &ChatHandler::HandleTeleCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand npcCommandTable[] =
{
- { "say", SEC_MODERATOR, &ChatHandler::HandleSayCommand, "", NULL },
- { "whisper", SEC_MODERATOR, &ChatHandler::HandleNpcWhisperCommand, "", NULL },
- { "yell", SEC_MODERATOR, &ChatHandler::HandleYellCommand, "", NULL },
- { "textemote", SEC_MODERATOR, &ChatHandler::HandleTextEmoteCommand, "", NULL },
- { "add", SEC_GAMEMASTER, &ChatHandler::HandleAddSpwCommand, "", NULL },
- { "delete", SEC_GAMEMASTER, &ChatHandler::HandleDelCreatureCommand, "", NULL },
- { "spawndist", SEC_GAMEMASTER, &ChatHandler::HandleSpawnDistCommand, "", NULL },
- { "spawntime", SEC_GAMEMASTER, &ChatHandler::HandleSpawnTimeCommand, "", NULL },
- { "factionid", SEC_GAMEMASTER, &ChatHandler::HandleFactionIdCommand, "", NULL },
- { "addmove", SEC_GAMEMASTER, &ChatHandler::HandleAddMoveCommand, "", NULL },
- { "setmovetype", SEC_GAMEMASTER, &ChatHandler::HandleSetMoveTypeCommand, "", NULL },
- { "move", SEC_GAMEMASTER, &ChatHandler::HandleMoveCreatureCommand, "", NULL },
- { "changelevel", SEC_GAMEMASTER, &ChatHandler::HandleChangeLevelCommand, "", NULL },
- { "setmodel", SEC_GAMEMASTER, &ChatHandler::HandleSetModelCommand, "", NULL },
- { "additem", SEC_GAMEMASTER, &ChatHandler::HandleAddVendorItemCommand, "", NULL },
- { "delitem", SEC_GAMEMASTER, &ChatHandler::HandleDelVendorItemCommand, "", NULL },
- { "flag", SEC_GAMEMASTER, &ChatHandler::HandleNPCFlagCommand, "", NULL },
- { "changeentry", SEC_ADMINISTRATOR, &ChatHandler::HandleChangeEntryCommand, "", NULL },
- { "info", SEC_ADMINISTRATOR, &ChatHandler::HandleNpcInfoCommand, "", NULL },
- { "playemote", SEC_ADMINISTRATOR, &ChatHandler::HandlePlayEmoteCommand, "", NULL },
+ { "say", SEC_MODERATOR, false, &ChatHandler::HandleSayCommand, "", NULL },
+ { "whisper", SEC_MODERATOR, false, &ChatHandler::HandleNpcWhisperCommand, "", NULL },
+ { "yell", SEC_MODERATOR, false, &ChatHandler::HandleYellCommand, "", NULL },
+ { "textemote", SEC_MODERATOR, false, &ChatHandler::HandleTextEmoteCommand, "", NULL },
+ { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleAddSpwCommand, "", NULL },
+ { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleDelCreatureCommand, "", NULL },
+ { "spawndist", SEC_GAMEMASTER, false, &ChatHandler::HandleSpawnDistCommand, "", NULL },
+ { "spawntime", SEC_GAMEMASTER, false, &ChatHandler::HandleSpawnTimeCommand, "", NULL },
+ { "factionid", SEC_GAMEMASTER, false, &ChatHandler::HandleFactionIdCommand, "", NULL },
+ { "addmove", SEC_GAMEMASTER, false, &ChatHandler::HandleAddMoveCommand, "", NULL },
+ { "setmovetype", SEC_GAMEMASTER, false, &ChatHandler::HandleSetMoveTypeCommand, "", NULL },
+ { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleMoveCreatureCommand, "", NULL },
+ { "changelevel", SEC_GAMEMASTER, false, &ChatHandler::HandleChangeLevelCommand, "", NULL },
+ { "setmodel", SEC_GAMEMASTER, false, &ChatHandler::HandleSetModelCommand, "", NULL },
+ { "additem", SEC_GAMEMASTER, false, &ChatHandler::HandleAddVendorItemCommand, "", NULL },
+ { "delitem", SEC_GAMEMASTER, false, &ChatHandler::HandleDelVendorItemCommand, "", NULL },
+ { "flag", SEC_GAMEMASTER, false, &ChatHandler::HandleNPCFlagCommand, "", NULL },
+ { "changeentry", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeEntryCommand, "", NULL },
+ { "info", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNpcInfoCommand, "", NULL },
+ { "playemote", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlayEmoteCommand, "", NULL },
//{ TODO: fix or remove this commands
- { "name", SEC_GAMEMASTER, &ChatHandler::HandleNameCommand, "", NULL },
- { "subname", SEC_GAMEMASTER, &ChatHandler::HandleSubNameCommand, "", NULL },
- { "addweapon", SEC_ADMINISTRATOR, &ChatHandler::HandleAddWeaponCommand, "", NULL },
+ { "name", SEC_GAMEMASTER, false, &ChatHandler::HandleNameCommand, "", NULL },
+ { "subname", SEC_GAMEMASTER, false, &ChatHandler::HandleSubNameCommand, "", NULL },
+ { "addweapon", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddWeaponCommand, "", NULL },
//}
- { NULL, 0, NULL, "", NULL }
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand goCommandTable[] =
{
- { "grid", SEC_MODERATOR, &ChatHandler::HandleGoGridCommand, "", NULL },
- { "creature", SEC_GAMEMASTER, &ChatHandler::HandleGoCreatureCommand, "", NULL },
- { "object", SEC_GAMEMASTER, &ChatHandler::HandleGoObjectCommand, "", NULL },
- { "trigger", SEC_GAMEMASTER, &ChatHandler::HandleGoTriggerCommand, "", NULL },
- { "graveyard", SEC_GAMEMASTER, &ChatHandler::HandleGoGraveyardCommand, "", NULL },
- { "zonexy", SEC_MODERATOR, &ChatHandler::HandleGoZoneXYCommand, "", NULL },
- { "xy", SEC_MODERATOR, &ChatHandler::HandleGoXYCommand, "", NULL },
- { "xyz", SEC_MODERATOR, &ChatHandler::HandleGoXYZCommand, "", NULL },
- { "", SEC_MODERATOR, &ChatHandler::HandleGoXYZCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "grid", SEC_MODERATOR, false, &ChatHandler::HandleGoGridCommand, "", NULL },
+ { "creature", SEC_GAMEMASTER, false, &ChatHandler::HandleGoCreatureCommand, "", NULL },
+ { "object", SEC_GAMEMASTER, false, &ChatHandler::HandleGoObjectCommand, "", NULL },
+ { "trigger", SEC_GAMEMASTER, false, &ChatHandler::HandleGoTriggerCommand, "", NULL },
+ { "graveyard", SEC_GAMEMASTER, false, &ChatHandler::HandleGoGraveyardCommand, "", NULL },
+ { "zonexy", SEC_MODERATOR, false, &ChatHandler::HandleGoZoneXYCommand, "", NULL },
+ { "xy", SEC_MODERATOR, false, &ChatHandler::HandleGoXYCommand, "", NULL },
+ { "xyz", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL },
+ { "", SEC_MODERATOR, false, &ChatHandler::HandleGoXYZCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand gobjectCommandTable[] =
{
- { "add", SEC_GAMEMASTER, &ChatHandler::HandleGameObjectCommand, "", NULL },
- { "delete", SEC_GAMEMASTER, &ChatHandler::HandleDelObjectCommand, "", NULL },
- { "target", SEC_GAMEMASTER, &ChatHandler::HandleTargetObjectCommand, "", NULL },
- { "turn", SEC_GAMEMASTER, &ChatHandler::HandleTurnObjectCommand, "", NULL },
- { "move", SEC_GAMEMASTER, &ChatHandler::HandleMoveObjectCommand, "", NULL },
- { "near", SEC_ADMINISTRATOR, &ChatHandler::HandleNearObjectCommand, "", NULL },
- { "state", SEC_ADMINISTRATOR, &ChatHandler::HandleObjectStateCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "add", SEC_GAMEMASTER, false, &ChatHandler::HandleGameObjectCommand, "", NULL },
+ { "delete", SEC_GAMEMASTER, false, &ChatHandler::HandleDelObjectCommand, "", NULL },
+ { "target", SEC_GAMEMASTER, false, &ChatHandler::HandleTargetObjectCommand, "", NULL },
+ { "turn", SEC_GAMEMASTER, false, &ChatHandler::HandleTurnObjectCommand, "", NULL },
+ { "move", SEC_GAMEMASTER, false, &ChatHandler::HandleMoveObjectCommand, "", NULL },
+ { "near", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearObjectCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand questCommandTable[] =
{
- { "add", SEC_ADMINISTRATOR, &ChatHandler::HandleAddQuest, "", NULL },
- { "complete", SEC_ADMINISTRATOR, &ChatHandler::HandleCompleteQuest, "", NULL },
- { "remove", SEC_ADMINISTRATOR, &ChatHandler::HandleRemoveQuest, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "add", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddQuest, "", NULL },
+ { "complete", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCompleteQuest, "", NULL },
+ { "remove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRemoveQuest, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand gmCommandTable[] =
{
- { "chat", SEC_MODERATOR, &ChatHandler::HandleGMChatCommand, "", NULL },
- { "list", SEC_PLAYER, &ChatHandler::HandleGMListCommand, "", NULL },
- { "visible", SEC_MODERATOR, &ChatHandler::HandleVisibleCommand, "", NULL },
- { "fly", SEC_ADMINISTRATOR, &ChatHandler::HandleFlyModeCommand, "", NULL },
- { "", SEC_MODERATOR, &ChatHandler::HandleGMmodeCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "chat", SEC_MODERATOR, false, &ChatHandler::HandleGMChatCommand, "", NULL },
+ { "ingame", SEC_PLAYER, true, &ChatHandler::HandleGMListIngameCommand, "", NULL },
+ { "list", SEC_ADMINISTRATOR, true, &ChatHandler::HandleGMListFullCommand, "", NULL },
+ { "visible", SEC_MODERATOR, false, &ChatHandler::HandleVisibleCommand, "", NULL },
+ { "fly", SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlyModeCommand, "", NULL },
+ { "", SEC_MODERATOR, false, &ChatHandler::HandleGMmodeCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand instanceCommandTable[] =
{
- { "listbinds", SEC_MODERATOR, &ChatHandler::HandleInstanceListBindsCommand, "", NULL },
- { "unbind", SEC_MODERATOR, &ChatHandler::HandleInstanceUnbindCommand, "", NULL },
- { "stats", SEC_MODERATOR, &ChatHandler::HandleInstanceStatsCommand, "", NULL },
- { "savedata", SEC_MODERATOR, &ChatHandler::HandleInstanceSaveDataCommand, "", NULL },
- { NULL, 0, NULL, "", NULL }
+ { "listbinds", SEC_MODERATOR, false, &ChatHandler::HandleInstanceListBindsCommand, "", NULL },
+ { "unbind", SEC_MODERATOR, false, &ChatHandler::HandleInstanceUnbindCommand, "", NULL },
+ { "stats", SEC_MODERATOR, true, &ChatHandler::HandleInstanceStatsCommand, "", NULL },
+ { "savedata", SEC_MODERATOR, false, &ChatHandler::HandleInstanceSaveDataCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
};
static ChatCommand commandTable[] =
{
- { "gm", SEC_MODERATOR, NULL, "", gmCommandTable },
- { "npc", SEC_MODERATOR, NULL, "", npcCommandTable },
- { "go", SEC_MODERATOR, NULL, "", goCommandTable },
- { "learn", SEC_MODERATOR, NULL, "", learnCommandTable },
- { "modify", SEC_MODERATOR, NULL, "", modifyCommandTable },
- { "debug", SEC_MODERATOR, NULL, "", debugCommandTable },
- { "tele", SEC_MODERATOR, NULL, "", teleCommandTable },
- { "event", SEC_GAMEMASTER, NULL, "", eventCommandTable },
- { "gobject", SEC_GAMEMASTER, NULL, "", gobjectCommandTable },
- { "honor", SEC_GAMEMASTER, NULL, "", honorCommandTable },
- { "wp", SEC_GAMEMASTER, NULL, "", wpCommandTable },
- { "quest", SEC_ADMINISTRATOR, NULL, "", questCommandTable },
- { "reload", SEC_ADMINISTRATOR, NULL, "", reloadCommandTable },
- { "list", SEC_ADMINISTRATOR, NULL, "", listCommandTable },
- { "lookup", SEC_ADMINISTRATOR, NULL, "", lookupCommandTable },
- { "pdump", SEC_ADMINISTRATOR, NULL, "", pdumpCommandTable },
- { "group", SEC_ADMINISTRATOR, NULL, "", groupCommandTable },
- { "guild", SEC_ADMINISTRATOR, NULL, "", guildCommandTable },
- { "cast", SEC_ADMINISTRATOR, NULL, "", castCommandTable },
- { "reset", SEC_ADMINISTRATOR, NULL, "", resetCommandTable },
- { "instance", SEC_ADMINISTRATOR, NULL, "", instanceCommandTable },
- { "server", SEC_ADMINISTRATOR, NULL, "", serverCommandTable },
-
- { "aura", SEC_ADMINISTRATOR, &ChatHandler::HandleAuraCommand, "", NULL },
- { "unaura", SEC_ADMINISTRATOR, &ChatHandler::HandleUnAuraCommand, "", NULL },
- { "acct", SEC_PLAYER, &ChatHandler::HandleAcctCommand, "", NULL },
- { "nameannounce", SEC_MODERATOR, &ChatHandler::HandleNameAnnounceCommand, "", NULL },
- { "announce", SEC_ADMINISTRATOR, &ChatHandler::HandleAnnounceCommand, "", NULL },
- { "notify", SEC_MODERATOR, &ChatHandler::HandleNotifyCommand, "", NULL },
- { "goname", SEC_MODERATOR, &ChatHandler::HandleGonameCommand, "", NULL },
- { "namego", SEC_MODERATOR, &ChatHandler::HandleNamegoCommand, "", NULL },
- { "groupgo", SEC_MODERATOR, &ChatHandler::HandleGroupgoCommand, "", NULL },
- { "commands", SEC_PLAYER, &ChatHandler::HandleCommandsCommand, "", NULL },
- { "demorph", SEC_GAMEMASTER, &ChatHandler::HandleDeMorphCommand, "", NULL },
- { "die", SEC_ADMINISTRATOR, &ChatHandler::HandleDieCommand, "", NULL },
- { "revive", SEC_ADMINISTRATOR, &ChatHandler::HandleReviveCommand, "", NULL },
- { "dismount", SEC_PLAYER, &ChatHandler::HandleDismountCommand, "", NULL },
- { "gps", SEC_MODERATOR, &ChatHandler::HandleGPSCommand, "", NULL },
- { "guid", SEC_GAMEMASTER, &ChatHandler::HandleGUIDCommand, "", NULL },
- { "help", SEC_PLAYER, &ChatHandler::HandleHelpCommand, "", NULL },
- { "itemmove", SEC_GAMEMASTER, &ChatHandler::HandleItemMoveCommand, "", NULL },
- { "cooldown", SEC_ADMINISTRATOR, &ChatHandler::HandleCooldownCommand, "", NULL },
- { "unlearn", SEC_ADMINISTRATOR, &ChatHandler::HandleUnLearnCommand, "", NULL },
- { "distance", SEC_ADMINISTRATOR, &ChatHandler::HandleGetDistanceCommand, "", NULL },
- { "recall", SEC_MODERATOR, &ChatHandler::HandleRecallCommand, "", NULL },
- { "save", SEC_PLAYER, &ChatHandler::HandleSaveCommand, "", NULL },
- { "saveall", SEC_MODERATOR, &ChatHandler::HandleSaveAllCommand, "", NULL },
- { "kick", SEC_GAMEMASTER, &ChatHandler::HandleKickPlayerCommand, "", NULL },
- { "security", SEC_ADMINISTRATOR, &ChatHandler::HandleSecurityCommand, "", NULL },
- { "ban", SEC_ADMINISTRATOR, &ChatHandler::HandleBanCommand, "", NULL },
- { "unban", SEC_ADMINISTRATOR, &ChatHandler::HandleUnBanCommand, "", NULL },
- { "baninfo", SEC_ADMINISTRATOR, &ChatHandler::HandleBanInfoCommand, "", NULL },
- { "banlist", SEC_ADMINISTRATOR, &ChatHandler::HandleBanListCommand, "", NULL },
- { "plimit", SEC_ADMINISTRATOR, &ChatHandler::HandlePLimitCommand, "", NULL },
- { "start", SEC_PLAYER, &ChatHandler::HandleStartCommand, "", NULL },
- { "taxicheat", SEC_MODERATOR, &ChatHandler::HandleTaxiCheatCommand, "", NULL },
- { "allowmove", SEC_ADMINISTRATOR, &ChatHandler::HandleAllowMovementCommand, "", NULL },
- { "linkgrave", SEC_ADMINISTRATOR, &ChatHandler::HandleLinkGraveCommand, "", NULL },
- { "neargrave", SEC_ADMINISTRATOR, &ChatHandler::HandleNearGraveCommand, "", NULL },
- { "transport", SEC_ADMINISTRATOR, &ChatHandler::HandleSpawnTransportCommand, "", NULL },
- { "explorecheat", SEC_ADMINISTRATOR, &ChatHandler::HandleExploreCheatCommand, "", NULL },
- { "hover", SEC_ADMINISTRATOR, &ChatHandler::HandleHoverCommand, "", NULL },
- { "levelup", SEC_ADMINISTRATOR, &ChatHandler::HandleLevelUpCommand, "", NULL },
- { "showarea", SEC_ADMINISTRATOR, &ChatHandler::HandleShowAreaCommand, "", NULL },
- { "hidearea", SEC_ADMINISTRATOR, &ChatHandler::HandleHideAreaCommand, "", NULL },
- { "additem", SEC_ADMINISTRATOR, &ChatHandler::HandleAddItemCommand, "", NULL },
- { "additemset", SEC_ADMINISTRATOR, &ChatHandler::HandleAddItemSetCommand, "", NULL },
- { "bank", SEC_ADMINISTRATOR, &ChatHandler::HandleBankCommand, "", NULL },
- { "wchange", SEC_ADMINISTRATOR, &ChatHandler::HandleChangeWeather, "", NULL },
- { "ticket", SEC_GAMEMASTER, &ChatHandler::HandleTicketCommand, "", NULL },
- { "delticket", SEC_GAMEMASTER, &ChatHandler::HandleDelTicketCommand, "", NULL },
- { "maxskill", SEC_ADMINISTRATOR, &ChatHandler::HandleMaxSkillCommand, "", NULL },
- { "setskill", SEC_ADMINISTRATOR, &ChatHandler::HandleSetSkillCommand, "", NULL },
- { "whispers", SEC_MODERATOR, &ChatHandler::HandleWhispersCommand, "", NULL },
- { "pinfo", SEC_GAMEMASTER, &ChatHandler::HandlePInfoCommand, "", NULL },
- { "password", SEC_PLAYER, &ChatHandler::HandlePasswordCommand, "", NULL },
- { "lockaccount", SEC_PLAYER, &ChatHandler::HandleLockAccountCommand, "", NULL },
- { "respawn", SEC_ADMINISTRATOR, &ChatHandler::HandleRespawnCommand, "", NULL },
- { "sendmail", SEC_MODERATOR, &ChatHandler::HandleSendMailCommand, "", NULL },
- { "rename", SEC_GAMEMASTER, &ChatHandler::HandleRenameCommand, "", NULL },
- { "loadscripts", SEC_ADMINISTRATOR, &ChatHandler::HandleLoadScriptsCommand, "", NULL },
- { "mute", SEC_GAMEMASTER, &ChatHandler::HandleMuteCommand, "", NULL },
- { "unmute", SEC_GAMEMASTER, &ChatHandler::HandleUnmuteCommand, "", NULL },
- { "movegens", SEC_ADMINISTRATOR, &ChatHandler::HandleMovegensCommand, "", NULL },
- { "cometome", SEC_ADMINISTRATOR, &ChatHandler::HandleComeToMeCommand, "", NULL },
- { "damage", SEC_ADMINISTRATOR, &ChatHandler::HandleDamageCommand, "", NULL },
- { "combatstop", SEC_GAMEMASTER, &ChatHandler::HandleCombatStopCommand, "", NULL },
- { "freeze", SEC_ADMINISTRATOR, &ChatHandler::HandleFreezeCommand, "", NULL },
- { "unfreeze", SEC_ADMINISTRATOR, &ChatHandler::HandleUnFreezeCommand, "", NULL },
- { "listfreeze", SEC_ADMINISTRATOR, &ChatHandler::HandleListFreezeCommand, "", NULL },
- { "flusharenapoints", SEC_ADMINISTRATOR, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL },
-
- { NULL, 0, NULL, "", NULL }
+ { "account", SEC_PLAYER, true, NULL, "", accountCommandTable },
+ { "gm", SEC_MODERATOR, true, NULL, "", gmCommandTable },
+ { "npc", SEC_MODERATOR, false, NULL, "", npcCommandTable },
+ { "go", SEC_MODERATOR, false, NULL, "", goCommandTable },
+ { "learn", SEC_MODERATOR, false, NULL, "", learnCommandTable },
+ { "modify", SEC_MODERATOR, false, NULL, "", modifyCommandTable },
+ { "debug", SEC_MODERATOR, false, NULL, "", debugCommandTable },
+ { "tele", SEC_MODERATOR, true, NULL, "", teleCommandTable },
+ { "event", SEC_GAMEMASTER, false, NULL, "", eventCommandTable },
+ { "gobject", SEC_GAMEMASTER, false, NULL, "", gobjectCommandTable },
+ { "honor", SEC_GAMEMASTER, false, NULL, "", honorCommandTable },
+ { "wp", SEC_GAMEMASTER, false, NULL, "", wpCommandTable },
+ { "quest", SEC_ADMINISTRATOR, false, NULL, "", questCommandTable },
+ { "reload", SEC_ADMINISTRATOR, true, NULL, "", reloadCommandTable },
+ { "list", SEC_ADMINISTRATOR, true, NULL, "", listCommandTable },
+ { "lookup", SEC_ADMINISTRATOR, true, NULL, "", lookupCommandTable },
+ { "pdump", SEC_ADMINISTRATOR, true, NULL, "", pdumpCommandTable },
+ { "guild", SEC_ADMINISTRATOR, true, NULL, "", guildCommandTable },
+ { "cast", SEC_ADMINISTRATOR, false, NULL, "", castCommandTable },
+ { "reset", SEC_ADMINISTRATOR, false, NULL, "", resetCommandTable },
+ { "instance", SEC_ADMINISTRATOR, true, NULL, "", instanceCommandTable },
+ { "server", SEC_ADMINISTRATOR, true, NULL, "", serverCommandTable },
+
+ { "aura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAuraCommand, "", NULL },
+ { "unaura", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnAuraCommand, "", NULL },
+ { "announce", SEC_MODERATOR, true, &ChatHandler::HandleAnnounceCommand, "", NULL },
+ { "notify", SEC_MODERATOR, true, &ChatHandler::HandleNotifyCommand, "", NULL },
+ { "goname", SEC_MODERATOR, false, &ChatHandler::HandleGonameCommand, "", NULL },
+ { "namego", SEC_MODERATOR, false, &ChatHandler::HandleNamegoCommand, "", NULL },
+ { "groupgo", SEC_MODERATOR, false, &ChatHandler::HandleGroupgoCommand, "", NULL },
+ { "commands", SEC_PLAYER, true, &ChatHandler::HandleCommandsCommand, "", NULL },
+ { "demorph", SEC_GAMEMASTER, false, &ChatHandler::HandleDeMorphCommand, "", NULL },
+ { "die", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDieCommand, "", NULL },
+ { "revive", SEC_ADMINISTRATOR, false, &ChatHandler::HandleReviveCommand, "", NULL },
+ { "dismount", SEC_PLAYER, false, &ChatHandler::HandleDismountCommand, "", NULL },
+ { "gps", SEC_MODERATOR, false, &ChatHandler::HandleGPSCommand, "", NULL },
+ { "guid", SEC_GAMEMASTER, false, &ChatHandler::HandleGUIDCommand, "", NULL },
+ { "help", SEC_PLAYER, true, &ChatHandler::HandleHelpCommand, "", NULL },
+ { "itemmove", SEC_GAMEMASTER, false, &ChatHandler::HandleItemMoveCommand, "", NULL },
+ { "cooldown", SEC_ADMINISTRATOR, false, &ChatHandler::HandleCooldownCommand, "", NULL },
+ { "unlearn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUnLearnCommand, "", NULL },
+ { "distance", SEC_ADMINISTRATOR, false, &ChatHandler::HandleGetDistanceCommand, "", NULL },
+ { "recall", SEC_MODERATOR, false, &ChatHandler::HandleRecallCommand, "", NULL },
+ { "save", SEC_PLAYER, false, &ChatHandler::HandleSaveCommand, "", NULL },
+ { "saveall", SEC_MODERATOR, true, &ChatHandler::HandleSaveAllCommand, "", NULL },
+ { "kick", SEC_GAMEMASTER, true, &ChatHandler::HandleKickPlayerCommand, "", NULL },
+ { "ban", SEC_ADMINISTRATOR, true, NULL, "", banCommandTable },
+ { "unban", SEC_ADMINISTRATOR, true, NULL, "", unbanCommandTable },
+ { "baninfo", SEC_ADMINISTRATOR, false, NULL, "", baninfoCommandTable },
+ { "banlist", SEC_ADMINISTRATOR, true, NULL, "", banlistCommandTable },
+ { "plimit", SEC_ADMINISTRATOR, true, &ChatHandler::HandlePLimitCommand, "", NULL },
+ { "start", SEC_PLAYER, false, &ChatHandler::HandleStartCommand, "", NULL },
+ { "taxicheat", SEC_MODERATOR, false, &ChatHandler::HandleTaxiCheatCommand, "", NULL },
+ { "allowmove", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAllowMovementCommand, "", NULL },
+ { "linkgrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLinkGraveCommand, "", NULL },
+ { "neargrave", SEC_ADMINISTRATOR, false, &ChatHandler::HandleNearGraveCommand, "", NULL },
+ { "explorecheat", SEC_ADMINISTRATOR, false, &ChatHandler::HandleExploreCheatCommand, "", NULL },
+ { "hover", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHoverCommand, "", NULL },
+ { "levelup", SEC_ADMINISTRATOR, false, &ChatHandler::HandleLevelUpCommand, "", NULL },
+ { "showarea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleShowAreaCommand, "", NULL },
+ { "hidearea", SEC_ADMINISTRATOR, false, &ChatHandler::HandleHideAreaCommand, "", NULL },
+ { "additem", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemCommand, "", NULL },
+ { "additemset", SEC_ADMINISTRATOR, false, &ChatHandler::HandleAddItemSetCommand, "", NULL },
+ { "bank", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBankCommand, "", NULL },
+ { "wchange", SEC_ADMINISTRATOR, false, &ChatHandler::HandleChangeWeather, "", NULL },
+ { "ticket", SEC_GAMEMASTER, true, &ChatHandler::HandleTicketCommand, "", NULL },
+ { "delticket", SEC_GAMEMASTER, true, &ChatHandler::HandleDelTicketCommand, "", NULL },
+ { "maxskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMaxSkillCommand, "", NULL },
+ { "setskill", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSetSkillCommand, "", NULL },
+ { "whispers", SEC_MODERATOR, false, &ChatHandler::HandleWhispersCommand, "", NULL },
+ { "pinfo", SEC_GAMEMASTER, true, &ChatHandler::HandlePInfoCommand, "", NULL },
+ { "password", SEC_PLAYER, false, &ChatHandler::HandlePasswordCommand, "", NULL },
+ { "lockaccount", SEC_PLAYER, false, &ChatHandler::HandleLockAccountCommand, "", NULL },
+ { "respawn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleRespawnCommand, "", NULL },
+ { "sendmail", SEC_MODERATOR, false, &ChatHandler::HandleSendMailCommand, "", NULL },
+ { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleRenameCommand, "", NULL },
+ { "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL },
+ { "mute", SEC_GAMEMASTER, true, &ChatHandler::HandleMuteCommand, "", NULL },
+ { "unmute", SEC_GAMEMASTER, true, &ChatHandler::HandleUnmuteCommand, "", NULL },
+ { "movegens", SEC_ADMINISTRATOR, false, &ChatHandler::HandleMovegensCommand, "", NULL },
+ { "cometome", SEC_ADMINISTRATOR, false, &ChatHandler::HandleComeToMeCommand, "", NULL },
+ { "damage", SEC_ADMINISTRATOR, false, &ChatHandler::HandleDamageCommand, "", NULL },
+ { "combatstop", SEC_GAMEMASTER, false, &ChatHandler::HandleCombatStopCommand, "", NULL },
+ { "chardelete", SEC_CONSOLE, true, &ChatHandler::HandleCombatStopCommand, "", NULL },
+ { "sendmessage", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMessageCommand, "", NULL },
+
+ { NULL, 0, false, NULL, "", NULL }
};
if(load_command_table)
@@ -529,11 +581,17 @@ ChatCommand * ChatHandler::getCommandTable()
return commandTable;
}
-const char *ChatHandler::GetTrinityString(int32 entry)
+const char *ChatHandler::GetTrinityString(int32 entry) const
{
return m_session->GetTrinityString(entry);
}
+bool ChatHandler::isAvailable(ChatCommand const& cmd) const
+{
+ // check security level only for simple command (without child commands)
+ return m_session->GetSecurity() >= cmd.SecurityLevel;
+}
+
bool ChatHandler::hasStringAbbr(const char* name, const char* part)
{
// non "" command
@@ -578,6 +636,7 @@ void ChatHandler::SendSysMessage(const char *str)
void ChatHandler::SendGlobalSysMessage(const char *str)
{
+ // Chat output
WorldPacket data;
// need copy to prevent corruption by strtok call in LineFromMessage original string
@@ -653,8 +712,8 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, st
return true;
}
- // check security level only for simple command (without child commands)
- if(m_session->GetSecurity() < table[i].SecurityLevel)
+ // must be available and have handler
+ if(!table[i].Handler || !isAvailable(table[i]))
continue;
SetSentErrorMessage(false);
@@ -663,11 +722,15 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, st
{
if(table[i].SecurityLevel > SEC_PLAYER)
{
- Player* p = m_session->GetPlayer();
- uint64 sel_guid = p->GetSelection();
- sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
- fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
- GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
+ // chat case
+ if(m_session)
+ {
+ Player* p = m_session->GetPlayer();
+ uint64 sel_guid = p->GetSelection();
+ sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
+ fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
+ GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
+ }
}
}
// some commands have custom error messages. Don't send the default one in these cases.
@@ -693,18 +756,24 @@ int ChatHandler::ParseCommands(const char* text)
//if(m_session->GetSecurity() == 0)
// return 0;
- if(text[0] != '!' && text[0] != '.')
- return 0;
+ /// chat case (.command or !command format)
+ if(m_session)
+ {
+ if(text[0] != '!' && text[0] != '.')
+ return 0;
+ }
- // ignore single . and ! in line
+ /// ignore single . and ! in line
if(strlen(text) < 2)
return 0;
- // ignore messages staring from many dots.
+ /// ignore messages staring from many dots.
if(text[0] == '.' && text[1] == '.' || text[0] == '!' && text[1] == '!')
return 0;
- ++text;
+ /// skip first . or ! (in console allowed use command with . and ! and without its)
+ if(text[0] == '!' || text[0] == '.')
+ ++text;
std::string fullcmd = text; // original `text` can't be used. It content destroyed in command code processing.
@@ -719,13 +788,16 @@ bool ChatHandler::ShowHelpForSubCommands(ChatCommand *table, char const* cmd, ch
std::string list;
for(uint32 i = 0; table[i].Name != NULL; ++i)
{
- if(m_session->GetSecurity() < table[i].SecurityLevel)
+ // must be available (ignore handler existence for show command with possibe avalable subcomands
+ if(!isAvailable(table[i]))
continue;
if( *subcmd && !hasStringAbbr(table[i].Name, subcmd))
continue;
(list += "\n ") += table[i].Name;
+ if(table[i].ChildCommands)
+ list += " ...";
}
if(list.empty())
@@ -748,7 +820,8 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand *table, const char* cmd)
{
for(uint32 i = 0; table[i].Name != NULL; ++i)
{
- if(m_session->GetSecurity() < table[i].SecurityLevel)
+ // must be available (ignore handler existence for show command with possibe avalable subcomands
+ if(!isAvailable(table[i]))
continue;
if( !hasStringAbbr(table[i].Name, cmd) )
@@ -777,7 +850,8 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand *table, const char* cmd)
{
for(uint32 i = 0; table[i].Name != NULL; ++i)
{
- if(m_session->GetSecurity() < table[i].SecurityLevel)
+ // must be available (ignore handler existence for show command with possibe avalable subcomands
+ if(!isAvailable(table[i]))
continue;
if(strlen(table[i].Name))
@@ -878,6 +952,9 @@ void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uin
Player * ChatHandler::getSelectedPlayer()
{
+ if(!m_session)
+ return NULL;
+
uint64 guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
@@ -888,6 +965,9 @@ Player * ChatHandler::getSelectedPlayer()
Unit* ChatHandler::getSelectedUnit()
{
+ if(!m_session)
+ return NULL;
+
uint64 guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
@@ -898,6 +978,9 @@ Unit* ChatHandler::getSelectedUnit()
Creature* ChatHandler::getSelectedCreature()
{
+ if(!m_session)
+ return NULL;
+
return ObjectAccessor::GetCreatureOrPet(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection());
}
@@ -1036,6 +1119,9 @@ char const *fmtstring( char const *format, ... )
GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry)
{
+ if(!m_session)
+ return NULL;
+
Player* pl = m_session->GetPlayer();
GameObject* obj = ObjectAccessor::GetGameObject(*pl, MAKE_NEW_GUID(lowguid, entry, HIGHGUID_GAMEOBJECT));
@@ -1110,6 +1196,23 @@ GameTele const* ChatHandler::extractGameTeleFromLink(char* text)
return objmgr.GetGameTele(cId);
}
+const char *CliHandler::GetTrinityString(int32 entry) const
+{
+ return objmgr.GetTrinityStringForDBCLocale(entry);
+}
+
+bool CliHandler::isAvailable(ChatCommand const& cmd) const
+{
+ // skip non-console commands in console case
+ return cmd.AllowConsole;
+}
+
+void CliHandler::SendSysMessage(const char *str)
+{
+ m_print(str);
+ m_print("\r\n");
+}
+
bool ChatHandler::GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline)
{
plr = NULL;
diff --git a/src/game/Chat.h b/src/game/Chat.h
index 89a6478a11d..72f0a2ec79e 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -35,6 +35,7 @@ class ChatCommand
public:
const char * Name;
uint32 SecurityLevel; // function pointer required correct align (use uint32)
+ bool AllowConsole;
bool (ChatHandler::*Handler)(const char* args);
std::string Help;
ChatCommand * ChildCommands;
@@ -61,9 +62,9 @@ class ChatHandler
static char* LineFromMessage(char*& pos) { char* start = strtok(pos,"\n"); pos = NULL; return start; }
- const char *GetTrinityString(int32 entry);
+ virtual const char *GetTrinityString(int32 entry) const;
- void SendSysMessage( const char *str);
+ virtual void SendSysMessage( const char *str);
void SendSysMessage( int32 entry);
void PSendSysMessage( const char *format, ...) ATTR_PRINTF(2,3);
void PSendSysMessage( int32 entry, ... );
@@ -71,7 +72,12 @@ class ChatHandler
int ParseCommands(const char* text);
protected:
+ explicit ChatHandler() : m_session(NULL) {} // for CLI subclass
+
bool hasStringAbbr(const char* name, const char* part);
+
+ virtual bool isAvailable(ChatCommand const& cmd) const;
+
void SendGlobalSysMessage(const char *str);
bool ExecuteCommandInTable(ChatCommand *table, const char* text, std::string fullcommand);
@@ -80,14 +86,22 @@ class ChatHandler
ChatCommand* getCommandTable();
+ bool HandleAccountCommand(const char* args);
+ bool HandleAccountCreateCommand(const char* args);
+ bool HandleAccountDeleteCommand(const char* args);
+ bool HandleAccountOnlineListCommand(const char* args);
+ bool HandleAccountSetAddonCommand(const char* args);
+ bool HandleAccountSetGmLevelCommand(const char* args);
+ bool HandleAccountSetPasswordCommand(const char* args);
+
bool HandleHelpCommand(const char* args);
bool HandleCommandsCommand(const char* args);
- bool HandleAcctCommand(const char* args);
bool HandleStartCommand(const char* args);
bool HandleInfoCommand(const char* args);
bool HandleDismountCommand(const char* args);
bool HandleSaveCommand(const char* args);
- bool HandleGMListCommand(const char* args);
+ bool HandleGMListIngameCommand(const char* args);
+ bool HandleGMListFullCommand(const char* args);
bool HandleNamegoCommand(const char* args);
bool HandleGonameCommand(const char* args);
@@ -208,6 +222,12 @@ class ChatHandler
bool HandleInstanceStatsCommand(const char* args);
bool HandleInstanceSaveDataCommand(const char * args);
+ bool HandleServerCorpsesCommand(const char* args);
+ bool HandleServerExitCommand(const char* args);
+ bool HandleServerMotdCommand(const char* args);
+ bool HandleServerSetMotdCommand(const char* args);
+ bool HandleServerSetLogLevelCommand(const char* args);
+
bool HandleAddHonorCommand(const char* args);
bool HandleHonorAddKillCommand(const char* args);
bool HandleUpdateHonorFieldsCommand(const char* args);
@@ -257,10 +277,19 @@ class ChatHandler
bool HandleUnFreezeCommand(const char *args);
bool HandleListFreezeCommand(const char* args);
- bool HandleBanCommand(const char* args);
- bool HandleUnBanCommand(const char* args);
- bool HandleBanInfoCommand(const char* args);
- bool HandleBanListCommand(const char* args);
+ bool HandleCharacterDeleteCommand(const char* args);
+ bool HandleBanAccountCommand(const char* args);
+ bool HandleBanCharacterCommand(const char* args);
+ bool HandleBanIPCommand(const char* args);
+ bool HandleUnBanAccountCommand(const char* args);
+ bool HandleUnBanCharacterCommand(const char* args);
+ bool HandleUnBanIPCommand(const char* args);
+ bool HandleBanInfoAccountCommand(const char* args);
+ bool HandleBanInfoCharacterCommand(const char* args);
+ bool HandleBanInfoIPCommand(const char* args);
+ bool HandleBanListAccountCommand(const char* args);
+ bool HandleBanListCharacterCommand(const char* args);
+ bool HandleBanListIPCommand(const char* args);
bool HandleIdleRestartCommand(const char* args);
bool HandleIdleShutDownCommand(const char* args);
bool HandleShutDownCommand(const char* args);
@@ -387,6 +416,7 @@ class ChatHandler
bool HandleCastTargetCommand(const char *args);
bool HandleComeToMeCommand(const char *args);
bool HandleCombatStopCommand(const char *args);
+ bool HandleSendMessageCommand(const char * args);
bool HandleFlushArenaPointsCommand(const char *args);
//! Development Commands
@@ -415,19 +445,39 @@ class ChatHandler
GameObject* GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry);
- WorldSession * m_session;
-
// Utility methods for commands
void ShowTicket(uint64 guid, char const* text, char const* time);
uint32 GetTicketIDByNum(uint32 num);
bool LookupPlayerSearchCommand(QueryResult* result, int32 limit);
+ bool HandleBanListHelper(QueryResult* result);
+ bool HandleBanHelper(BanMode mode,char const* args);
+ bool HandleBanInfoHelper(uint32 accountid, char const* accountname);
+ bool HandleUnBanHelper(BanMode mode,char const* args);
void SetSentErrorMessage(bool val){ sentErrorMessage = val;};
private:
+ WorldSession * m_session; // != NULL for chat command call and NULL for CLI command
+
// common global flag
static bool load_command_table;
bool sentErrorMessage;
};
-#endif
+
+class CliHandler : public ChatHandler
+{
+ public:
+ typedef void Print(char const*);
+ explicit CliHandler(Print* zprint) : m_print(zprint) {}
+
+ // overwrite functions
+ const char *GetTrinityString(int32 entry) const;
+ bool isAvailable(ChatCommand const& cmd) const;
+ void SendSysMessage(const char *str);
+
+ private:
+ Print* m_print;
+};
char const *fmtstring( char const *format, ... );
+
+#endif
diff --git a/src/game/Language.h b/src/game/Language.h
index b759f603ff6..b4b4ae5e12f 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -79,7 +79,10 @@ enum TrinityStrings
LANG_NPC_TAINER_HELLO = 51,
LANG_COMMAND_INVALID_ITEM_COUNT = 52,
LANG_COMMAND_MAIL_ITEMS_LIMIT = 53,
- // Room for more level 0 54-99 not used
+ LANG_NEW_PASSWORDS_NOT_MATCH = 54,
+ LANG_PASSWORD_TOO_LONG = 55,
+ LANG_MOTD_CURRENT = 56,
+ // Room for more level 0 57-99 not used
// level 1 chat
LANG_GLOBAL_NOTIFY = 100,
@@ -163,7 +166,8 @@ enum TrinityStrings
LANG_MAIL_SENT = 169,
LANG_SOUND_NOT_EXIST = 170,
- // Room for more level 1 171-199 not used
+ LANG_TELEPORTED_TO_BY_CONSOLE = 171,
+ // Room for more level 1 172-199 not used
// level 2 chat
LANG_NO_SELECTION = 200,
@@ -331,7 +335,8 @@ enum TrinityStrings
LANG_UNBAN_UNBANNED = 411,
LANG_UNBAN_ERROR = 412,
- LANG_BANINFO_NOACCOUNT = 413,
+ LANG_ACCOUNT_NOT_EXIST = 413,
+
LANG_BANINFO_NOCHARACTER = 414,
LANG_BANINFO_NOIP = 415,
LANG_BANINFO_NOACCOUNTBAN = 416,
@@ -444,16 +449,16 @@ enum TrinityStrings
LANG_ITEMLIST_AUCTION = 510,
LANG_WRONG_LINK_TYPE = 511,
- LANG_ITEM_LIST = 512,
- LANG_QUEST_LIST = 513,
- LANG_CREATURE_ENTRY_LIST = 514,
- LANG_CREATURE_LIST = 515,
- LANG_GO_ENTRY_LIST = 516,
- LANG_GO_LIST = 517,
- LANG_ITEMSET_LIST = 518,
+ LANG_ITEM_LIST_CHAT = 512,
+ LANG_QUEST_LIST_CHAT = 513,
+ LANG_CREATURE_ENTRY_LIST_CHAT = 514,
+ LANG_CREATURE_LIST_CHAT = 515,
+ LANG_GO_ENTRY_LIST_CHAT = 516,
+ LANG_GO_LIST_CHAT = 517,
+ LANG_ITEMSET_LIST_CHAT = 518,
LANG_TELE_LIST = 519,
LANG_SPELL_LIST = 520,
- LANG_SKILL_LIST = 521,
+ LANG_SKILL_LIST_CHAT = 521,
LANG_GAMEOBJECT_NOT_EXIST = 522,
@@ -526,7 +531,7 @@ enum TrinityStrings
LANG_COMMAND_NEAROBJMESSAGE = 581,
LANG_COMMAND_RAWPAWNTIMES = 582,
- LANG_EVENT_ENTRY_LIST = 583,
+ LANG_EVENT_ENTRY_LIST_CHAT = 583,
LANG_NOEVENTFOUND = 584,
LANG_EVENT_NOT_EXIST = 585,
LANG_EVENT_INFO = 586,
@@ -538,6 +543,14 @@ enum TrinityStrings
LANG_MOVEGENS_DISTRACT = 591,
LANG_COMMAND_LEARN_ALL_RECIPES = 592,
+ LANG_BANLIST_ACCOUNTS = 593,
+ LANG_BANLIST_ACCOUNTS_HEADER = 594,
+ LANG_BANLIST_IPS = 595,
+ LANG_BANLIST_IPS_HEADER = 596,
+ LANG_GMLIST = 597,
+ LANG_GMLIST_HEADER = 598,
+ LANG_GMLIST_EMPTY = 599,
+ // End Level 3 list, continued at 1100
// Battleground
LANG_BG_A_WINS = 600,
@@ -658,14 +671,52 @@ enum TrinityStrings
LANG_ACCOUNT_FOR_PLAYER_NOT_FOUND = 809,
// Room for in-game strings 810-999 not used
- // FREE IDS 1000-9999
- LANG_COMMAND_FREEZE = 1000,
- LANG_COMMAND_FREEZE_ERROR = 1001,
- LANG_COMMAND_FREEZE_WRONG = 1002,
- LANG_COMMAND_UNFREEZE = 1003,
- LANG_COMMAND_NO_FROZEN_PLAYERS = 1004,
- LANG_COMMAND_LIST_FREEZE = 1005,
- LANG_COMMAND_FROZEN_PLAYERS = 1006,
+ // Level 4 (CLI only commands)
+ LANG_COMMAND_EXIT = 1000,
+ LANG_ACCOUNT_DELETED = 1001,
+ LANG_ACCOUNT_NOT_DELETED_SQL_ERROR = 1002,
+ LANG_ACCOUNT_NOT_DELETED = 1003,
+ LANG_ACCOUNT_CREATED = 1004,
+ LANG_ACCOUNT_TOO_LONG = 1005,
+ LANG_ACCOUNT_ALREADY_EXIST = 1006,
+ LANG_ACCOUNT_NOT_CREATED_SQL_ERROR = 1007,
+ LANG_ACCOUNT_NOT_CREATED = 1008,
+ LANG_CHARACTER_DELETED = 1009,
+ LANG_ACCOUNT_LIST_HEADER = 1010,
+ LANG_ACCOUNT_LIST_ERROR = 1011,
+ // Room for more level 4 1012-1099 not used
+
+ // Level 3 (continue)
+ LANG_MOTD_NEW = 1100,
+ LANG_ACCOUNT_SETADDON = 1101,
+ LANG_SENDMESSAGE = 1102,
+ LANG_EVENT_ENTRY_LIST_CONSOLE = 1103,
+ LANG_CREATURE_ENTRY_LIST_CONSOLE = 1104,
+ LANG_ITEM_LIST_CONSOLE = 1105,
+ LANG_ITEMSET_LIST_CONSOLE = 1106,
+ LANG_GO_ENTRY_LIST_CONSOLE = 1107,
+ LANG_QUEST_LIST_CONSOLE = 1108,
+ LANG_SKILL_LIST_CONSOLE = 1109,
+ LANG_CREATURE_LIST_CONSOLE = 1110,
+ LANG_GO_LIST_CONSOLE = 1111,
+ LANG_FILE_OPEN_FAIL = 1112,
+ LANG_ACCOUNT_CHARACTER_LIST_FULL = 1113,
+ LANG_DUMP_BROKEN = 1114,
+ LANG_INVALID_CHARACTER_NAME = 1115,
+ LANG_INVALID_CHARACTER_GUID = 1116,
+ LANG_CHARACTER_GUID_IN_USE = 1117,
+ LANG_ITEMLIST_GUILD = 1118,
+ // Room for more level 3 1119-1199 not used
+
+ // Trinity custom patches 5000-9999
+ LANG_COMMAND_FREEZE = 5000,
+ LANG_COMMAND_FREEZE_ERROR = 5001,
+ LANG_COMMAND_FREEZE_WRONG = 5002,
+ LANG_COMMAND_UNFREEZE = 5003,
+ LANG_COMMAND_NO_FROZEN_PLAYERS = 5004,
+ LANG_COMMAND_LIST_FREEZE = 5005,
+ LANG_COMMAND_FROZEN_PLAYERS = 5006,
+ // Room for more Trinity custom patches 5007-9999
// Use for not-in-svn patches 10000-10999
// opvp hp
diff --git a/src/game/Level0.cpp b/src/game/Level0.cpp
index 3e02d6ca7f4..bea6dd1f91c 100644
--- a/src/game/Level0.cpp
+++ b/src/game/Level0.cpp
@@ -35,15 +35,17 @@
bool ChatHandler::HandleHelpCommand(const char* args)
{
- if(!*args)
- return false;
-
- char* cmd = strtok((char*)args, " ");
+ char* cmd = strtok((char*)args, " ");
if(!cmd)
- return false;
-
- if(!ShowHelpForCommand(getCommandTable(), cmd))
- SendSysMessage(LANG_NO_HELP_CMD);
+ {
+ ShowHelpForCommand(getCommandTable(), "help");
+ ShowHelpForCommand(getCommandTable(), "");
+ }
+ else
+ {
+ if(!ShowHelpForCommand(getCommandTable(), cmd))
+ SendSysMessage(LANG_NO_HELP_CMD);
+ }
return true;
}
@@ -54,7 +56,7 @@ bool ChatHandler::HandleCommandsCommand(const char* args)
return true;
}
-bool ChatHandler::HandleAcctCommand(const char* /*args*/)
+bool ChatHandler::HandleAccountCommand(const char* /*args*/)
{
uint32 gmlevel = m_session->GetSecurity();
PSendSysMessage(LANG_ACCOUNT_LEVEL, gmlevel);
@@ -141,7 +143,7 @@ bool ChatHandler::HandleSaveCommand(const char* /*args*/)
return true;
}
-bool ChatHandler::HandleGMListCommand(const char* /*args*/)
+bool ChatHandler::HandleGMListIngameCommand(const char* /*args*/)
{
bool first = true;
@@ -149,8 +151,9 @@ bool ChatHandler::HandleGMListCommand(const char* /*args*/)
HashMapHolder<Player>::MapType::iterator itr = m.begin();
for(; itr != m.end(); ++itr)
{
- if( itr->second->GetSession()->GetSecurity() && (itr->second->isGameMaster() || sWorld.getConfig(CONFIG_GM_IN_GM_LIST) ) &&
- itr->second->IsVisibleGloballyFor(m_session->GetPlayer()) )
+ if (itr->second->GetSession()->GetSecurity() &&
+ (itr->second->isGameMaster() || sWorld.getConfig(CONFIG_GM_IN_GM_LIST)) &&
+ (!m_session || itr->second->IsVisibleGloballyFor(m_session->GetPlayer())) )
{
if(first)
{
@@ -177,17 +180,24 @@ bool ChatHandler::HandlePasswordCommand(const char* args)
char *new_pass = strtok (NULL, " ");
char *new_pass_c = strtok (NULL, " ");
- if( !old_pass || !new_pass || !new_pass_c )
+ if (!old_pass || !new_pass || !new_pass_c)
return false;
std::string password_old = old_pass;
std::string password_new = new_pass;
std::string password_new_c = new_pass_c;
- if(!accmgr.CheckPassword(m_session->GetAccountId(), password_old) || password_new != password_new_c)
+ if (password_new != password_new_c)
{
- SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD);
- SetSentErrorMessage(true);
+ SendSysMessage (LANG_NEW_PASSWORDS_NOT_MATCH);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ if (!accmgr.CheckPassword (m_session->GetAccountId(), password_old))
+ {
+ SendSysMessage (LANG_COMMAND_WRONGOLDPASSWORD);
+ SetSentErrorMessage (true);
return false;
}
@@ -198,6 +208,11 @@ bool ChatHandler::HandlePasswordCommand(const char* args)
case AOR_OK:
SendSysMessage(LANG_COMMAND_PASSWORD);
break;
+ case AOR_PASS_TOO_LONG:
+ SendSysMessage(LANG_PASSWORD_TOO_LONG);
+ SetSentErrorMessage(true);
+ return false;
+ case AOR_NAME_NOT_EXIST: // not possible case, don't want get account name for output
default:
SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD);
SetSentErrorMessage(true);
@@ -233,3 +248,10 @@ bool ChatHandler::HandleLockAccountCommand(const char* args)
SendSysMessage(LANG_USE_BOL);
return true;
}
+
+/// Display the 'Message of the day' for the realm
+bool ChatHandler::HandleServerMotdCommand(const char* /*args*/)
+{
+ PSendSysMessage(LANG_MOTD_CURRENT, sWorld.GetMotd());
+ return true;
+}
diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp
index 9d3ddb3aff8..0e8579b5c00 100644
--- a/src/game/Level1.cpp
+++ b/src/game/Level1.cpp
@@ -1692,62 +1692,65 @@ bool ChatHandler::HandleTeleCommand(const char * args)
bool ChatHandler::HandleLookupAreaCommand(const char* args)
{
- if(!*args)
+ if (!*args)
return false;
std::string namepart = args;
std::wstring wnamepart;
- if(!Utf8toWStr(namepart,wnamepart))
+ if (!Utf8toWStr (namepart,wnamepart))
return false;
uint32 counter = 0; // Counter for figure out that we found smth.
// converting string that we try to find to lower case
- wstrToLower( wnamepart );
+ wstrToLower (wnamepart);
// Search in AreaTable.dbc
- for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows(); ++areaflag)
+ for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows (); ++areaflag)
{
- AreaTableEntry const *areaEntry = sAreaStore.LookupEntry(areaflag);
- if(areaEntry)
+ AreaTableEntry const *areaEntry = sAreaStore.LookupEntry (areaflag);
+ if (areaEntry)
{
- int loc = m_session->GetSessionDbcLocale();
+ int loc = m_session ? m_session->GetSessionDbcLocale () : sWorld.GetDefaultDbcLocale();
std::string name = areaEntry->area_name[loc];
- if(name.empty())
+ if (name.empty())
continue;
- if(!Utf8FitTo(name, wnamepart))
+ if (!Utf8FitTo (name, wnamepart))
{
loc = 0;
for(; loc < MAX_LOCALE; ++loc)
{
- if(loc==m_session->GetSessionDbcLocale())
+ if (m_session && loc==m_session->GetSessionDbcLocale ())
continue;
name = areaEntry->area_name[loc];
- if(name.empty())
+ if (name.empty ())
continue;
- if (Utf8FitTo(name, wnamepart))
+ if (Utf8FitTo (name, wnamepart))
break;
}
}
- if(loc < MAX_LOCALE)
+ if (loc < MAX_LOCALE)
{
// send area in "id - [name]" format
std::ostringstream ss;
- ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r";
+ if (m_session)
+ ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r";
+ else
+ ss << areaEntry->ID << " - " << name << " " << localeNames[loc];
- SendSysMessage(ss.str().c_str());
+ SendSysMessage (ss.str ().c_str());
++counter;
}
}
}
- if (counter == 0) // if counter == 0 then we found nth
- SendSysMessage(LANG_COMMAND_NOAREAFOUND);
+ if (counter == 0) // if counter == 0 then we found nth
+ SendSysMessage (LANG_COMMAND_NOAREAFOUND);
return true;
}
@@ -1760,6 +1763,7 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args)
SetSentErrorMessage(true);
return false;
}
+
char const* str = strtok((char*)args, " ");
if(!str)
return false;
@@ -1773,9 +1777,9 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args)
// converting string that we try to find to lower case
wstrToLower( wnamepart );
- GameTeleMap const & teleMap = objmgr.GetGameTeleMap();
-
std::ostringstream reply;
+
+ GameTeleMap const & teleMap = objmgr.GetGameTeleMap();
for(GameTeleMap::const_iterator itr = teleMap.begin(); itr != teleMap.end(); ++itr)
{
GameTele const* tele = &itr->second;
@@ -1783,11 +1787,10 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args)
if(tele->wnameLow.find(wnamepart) == std::wstring::npos)
continue;
- reply << " |cffffffff|Htele:";
- reply << itr->first;
- reply << "|h[";
- reply << tele->name;
- reply << "]|h|r\n";
+ if (m_session)
+ reply << " |cffffffff|Htele:" << itr->first << "|h[" << tele->name << "]|h|r\n";
+ else
+ reply << " " << itr->first << " " << tele->name << "\n";
}
if(reply.str().empty())
@@ -2072,8 +2075,13 @@ bool ChatHandler::HandleNameTeleCommand(const char * args)
PSendSysMessage(LANG_TELEPORTING_TO, chr->GetName(),"", tele->name.c_str());
- if (m_session->GetPlayer()->IsVisibleGloballyFor(chr))
- ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName());
+ if (m_session)
+ {
+ if(m_session->GetPlayer()->IsVisibleGloballyFor(chr))
+ ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, m_session->GetPlayer()->GetName());
+ }
+ else
+ ChatHandler(chr).SendSysMessage(LANG_TELEPORTED_TO_BY_CONSOLE);
// stop flight if need
if(chr->isInFlight())
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index a449f15dfc3..4164c5cde3c 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -42,6 +42,7 @@
#include <iostream>
#include <fstream>
#include <map>
+#include "GlobalEvents.h"
static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] =
{
@@ -99,7 +100,7 @@ bool ChatHandler::HandleMuteCommand(const char* args)
security = accmgr.GetSecurity(account_id);
}
- if(security >= m_session->GetSecurity())
+ if(m_session && security >= m_session->GetSecurity())
{
SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
SetSentErrorMessage(true);
@@ -165,7 +166,7 @@ bool ChatHandler::HandleUnmuteCommand(const char* args)
security = accmgr.GetSecurity(account_id);
}
- if(security >= m_session->GetSecurity())
+ if(m_session && security >= m_session->GetSecurity())
{
SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
SetSentErrorMessage(true);
@@ -555,38 +556,37 @@ bool ChatHandler::HandleGUIDCommand(const char* /*args*/)
bool ChatHandler::HandleLookupFactionCommand(const char* args)
{
- if(!*args)
+ if (!*args)
return false;
- Player *target = getSelectedPlayer();
- if (!target)
- {
- SendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
- return false;
- }
+ // Can be NULL at console call
+ Player *target = getSelectedPlayer ();
std::string namepart = args;
std::wstring wnamepart;
- if(!Utf8toWStr(namepart,wnamepart))
+ if (!Utf8toWStr (namepart,wnamepart))
return false;
// converting string that we try to find to lower case
- wstrToLower( wnamepart );
+ wstrToLower (wnamepart);
uint32 counter = 0; // Counter for figure out that we found smth.
- for (uint32 id = 0; id < sFactionStore.GetNumRows(); id++)
- //for(FactionStateList::const_iterator itr = target->m_factions.begin(); itr != target->m_factions.end(); ++itr)
+ for (uint32 id = 0; id < sFactionStore.GetNumRows(); ++id)
{
- FactionEntry const *factionEntry = sFactionStore.LookupEntry(id);
- //FactionEntry const *factionEntry = sFactionStore.LookupEntry(itr->second.ID);
+ FactionEntry const *factionEntry = sFactionStore.LookupEntry (id);
if (factionEntry)
{
- FactionStateList::const_iterator repItr = target->m_factions.find(factionEntry->reputationListID);
+ FactionState const* repState = NULL;
+ if(target)
+ {
+ FactionStateList::const_iterator repItr = target->m_factions.find (factionEntry->reputationListID);
+ if(repItr != target->m_factions.end())
+ repState = &repItr->second;
+ }
- int loc = m_session->GetSessionDbcLocale();
+ int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
std::string name = factionEntry->name[loc];
if(name.empty())
continue;
@@ -596,7 +596,7 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args)
loc = 0;
for(; loc < MAX_LOCALE; ++loc)
{
- if(loc==m_session->GetSessionDbcLocale())
+ if(m_session && loc==m_session->GetSessionDbcLocale())
continue;
name = factionEntry->name[loc];
@@ -613,26 +613,29 @@ bool ChatHandler::HandleLookupFactionCommand(const char* args)
// send faction in "id - [faction] rank reputation [visible] [at war] [own team] [unknown] [invisible] [inactive]" format
// or "id - [faction] [no reputation]" format
std::ostringstream ss;
- ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r";
+ if (m_session)
+ ss << id << " - |cffffffff|Hfaction:" << id << "|h[" << name << " " << localeNames[loc] << "]|h|r";
+ else
+ ss << id << " - " << name << " " << localeNames[loc];
- if (repItr != target->m_factions.end())
+ if (repState) // and then target!=NULL also
{
ReputationRank rank = target->GetReputationRank(factionEntry);
std::string rankName = GetTrinityString(ReputationRankStrIndex[rank]);
ss << " " << rankName << "|h|r (" << target->GetReputation(factionEntry) << ")";
- if(repItr->second.Flags & FACTION_FLAG_VISIBLE)
+ if(repState->Flags & FACTION_FLAG_VISIBLE)
ss << GetTrinityString(LANG_FACTION_VISIBLE);
- if(repItr->second.Flags & FACTION_FLAG_AT_WAR)
+ if(repState->Flags & FACTION_FLAG_AT_WAR)
ss << GetTrinityString(LANG_FACTION_ATWAR);
- if(repItr->second.Flags & FACTION_FLAG_PEACE_FORCED)
+ if(repState->Flags & FACTION_FLAG_PEACE_FORCED)
ss << GetTrinityString(LANG_FACTION_PEACE_FORCED);
- if(repItr->second.Flags & FACTION_FLAG_HIDDEN)
+ if(repState->Flags & FACTION_FLAG_HIDDEN)
ss << GetTrinityString(LANG_FACTION_HIDDEN);
- if(repItr->second.Flags & FACTION_FLAG_INVISIBLE_FORCED)
+ if(repState->Flags & FACTION_FLAG_INVISIBLE_FORCED)
ss << GetTrinityString(LANG_FACTION_INVISIBLE_FORCED);
- if(repItr->second.Flags & FACTION_FLAG_INACTIVE)
+ if(repState->Flags & FACTION_FLAG_INACTIVE)
ss << GetTrinityString(LANG_FACTION_INACTIVE);
}
else
@@ -1702,7 +1705,7 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
return false;
}
- if(name==m_session->GetPlayer()->GetName())
+ if(m_session && name==m_session->GetPlayer()->GetName())
{
SendSysMessage(LANG_COMMAND_KICKSELF);
SetSentErrorMessage(true);
@@ -1809,7 +1812,8 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
Field* fields = result->Fetch();
username = fields[0].GetCppString();
security = fields[1].GetUInt32();
- if(m_session->GetSecurity() >= security)
+
+ if(!m_session || m_session->GetSecurity() >= security)
{
last_ip = fields[2].GetCppString();
last_login = fields[3].GetCppString();
@@ -1891,6 +1895,13 @@ bool ChatHandler::HandleTicketCommand(const char* args)
// ticket<end>
if (!px)
{
+ if(!m_session)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
size_t count;
QueryResult *result = CharacterDatabase.Query("SELECT COUNT(ticket_id) FROM character_ticket");
if(result)
@@ -1901,13 +1912,22 @@ bool ChatHandler::HandleTicketCommand(const char* args)
else
count = 0;
- PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, m_session->GetPlayer()->isAcceptTickets() ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF));
+ bool accept = m_session->GetPlayer()->isAcceptTickets();
+
+ PSendSysMessage(LANG_COMMAND_TICKETCOUNT, count, accept ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF));
return true;
}
// ticket on
if(strncmp(px,"on",3) == 0)
{
+ if(!m_session)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
m_session->GetPlayer()->SetAcceptTicket(true);
SendSysMessage(LANG_COMMAND_TICKETON);
return true;
@@ -1916,6 +1936,13 @@ bool ChatHandler::HandleTicketCommand(const char* args)
// ticket off
if(strncmp(px,"off",4) == 0)
{
+ if(!m_session)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
m_session->GetPlayer()->SetAcceptTicket(false);
SendSysMessage(LANG_COMMAND_TICKETOFF);
return true;
@@ -3590,7 +3617,12 @@ bool ChatHandler::HandleLookupEventCommand(const char* args)
if (Utf8FitTo(descr, wnamepart))
{
char const* active = activeEvents.find(id) != activeEvents.end() ? GetTrinityString(LANG_ACTIVE) : "";
- PSendSysMessage(LANG_EVENT_ENTRY_LIST,id,id,descr.c_str(),active );
+
+ if(m_session)
+ PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,id,id,eventData.description.c_str(),active );
+ else
+ PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,id,eventData.description.c_str(),active );
+
++counter;
}
}
@@ -3615,7 +3647,11 @@ bool ChatHandler::HandleEventActiveListCommand(const char* args)
uint32 event_id = *itr;
GameEventData const& eventData = events[event_id];
- PSendSysMessage(LANG_EVENT_ENTRY_LIST,event_id,event_id,eventData.description.c_str(),active );
+ if(m_session)
+ PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,event_id,event_id,eventData.description.c_str(),active );
+ else
+ PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,event_id,eventData.description.c_str(),active );
+
++counter;
}
@@ -3848,7 +3884,7 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args)
return false;
}
- if(!*args)
+ if (!*args)
return false;
std::wstring wnamepart;
@@ -3916,54 +3952,54 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args)
bool ChatHandler::HandleLookupPlayerIpCommand(const char* args)
{
- if(!*args)
+ if (!*args)
return false;
- std::string ip = strtok((char*)args, " ");
- char* limit_str = strtok(NULL, " ");
- int32 limit = limit_str ? atoi(limit_str) : -1;
+ std::string ip = strtok ((char*)args, " ");
+ char* limit_str = strtok (NULL, " ");
+ int32 limit = limit_str ? atoi (limit_str) : -1;
- loginDatabase.escape_string(ip);
+ loginDatabase.escape_string (ip);
- QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str());
+ QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str ());
- return LookupPlayerSearchCommand(result,limit);
+ return LookupPlayerSearchCommand (result,limit);
}
bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args)
{
- if(!*args)
+ if (!*args)
return false;
- std::string account = strtok((char*)args, " ");
- char* limit_str = strtok(NULL, " ");
- int32 limit = limit_str ? atoi(limit_str) : -1;
+ std::string account = strtok ((char*)args, " ");
+ char* limit_str = strtok (NULL, " ");
+ int32 limit = limit_str ? atoi (limit_str) : -1;
- if(!AccountMgr::normilizeString(account))
+ if (!AccountMgr::normilizeString (account))
return false;
- loginDatabase.escape_string(account);
+ loginDatabase.escape_string (account);
- QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE username = '%s'", account.c_str());
+ QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE username = '%s'", account.c_str ());
- return LookupPlayerSearchCommand(result,limit);
+ return LookupPlayerSearchCommand (result,limit);
}
bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args)
{
- if(!*args)
+ if (!*args)
return false;
- std::string email = strtok((char*)args, " ");
- char* limit_str = strtok(NULL, " ");
- int32 limit = limit_str ? atoi(limit_str) : -1;
+ std::string email = strtok ((char*)args, " ");
+ char* limit_str = strtok (NULL, " ");
+ int32 limit = limit_str ? atoi (limit_str) : -1;
- loginDatabase.escape_string(email);
+ loginDatabase.escape_string (email);
- QueryResult* result = loginDatabase.PQuery("SELECT id,username FROM account WHERE email = '%s'", email.c_str());
+ QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE email = '%s'", email.c_str ());
- return LookupPlayerSearchCommand(result,limit);
+ return LookupPlayerSearchCommand (result,limit);
}
bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit)
@@ -4009,3 +4045,10 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit)
return true;
}
+
+/// Triggering corpses expire check in world
+bool ChatHandler::HandleServerCorpsesCommand(const char* /*args*/)
+{
+ CorpsesErase();
+ return true;
+}
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 71ee2fbab62..c2c8645a27d 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -52,6 +52,7 @@
#include "BattleGroundMgr.h"
#include "InstanceSaveMgr.h"
#include "InstanceData.h"
+#include "AccountMgr.h"
//reload commands
bool ChatHandler::HandleReloadCommand(const char* arg)
@@ -681,56 +682,47 @@ bool ChatHandler::HandleLoadScriptsCommand(const char* args)
return true;
}
-bool ChatHandler::HandleSecurityCommand(const char* args)
+bool ChatHandler::HandleAccountSetGmLevelCommand(const char* args)
{
char* arg1 = strtok((char*)args, " ");
if( !arg1 )
return false;
- char* arg2 = 0;
+ char* arg2 = strtok(NULL, " ");
- std::string targetName;
+ std::string targetAccountName;
uint32 targetAccountId = 0;
uint32 targetSecurity = 0;
+ /// only target player different from self allowed (if targetPlayer!=NULL then not console)
Player* targetPlayer = getSelectedPlayer();
- if(targetPlayer)
+ if(targetPlayer && m_session->GetPlayer()!=targetPlayer)
{
- targetName = targetPlayer->GetName();
+ /// wrong command syntax or unexpected targeting
+ if(arg2)
+ return false;
+
targetAccountId = targetPlayer->GetSession()->GetAccountId();
targetSecurity = targetPlayer->GetSession()->GetSecurity();
- arg2 = arg1;
+ if(!accmgr.GetName(targetAccountId,targetAccountName))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,targetAccountName.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
}
else
{
- targetName = arg1;
- if(!normalizePlayerName(targetName))
+ targetAccountName = arg1;
+ if(!AccountMgr::normilizeString(targetAccountName))
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,targetAccountName.c_str());
SetSentErrorMessage(true);
return false;
}
- targetPlayer = ObjectAccessor::Instance().FindPlayerByName(targetName.c_str());
- if(targetPlayer)
- {
- targetAccountId = targetPlayer->GetSession()->GetAccountId();
- targetSecurity = targetPlayer->GetSession()->GetSecurity();
- }
- else
- {
- uint64 targetGUID = objmgr.GetPlayerGUIDByName(targetName.c_str());
- if(!targetGUID)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
- targetAccountId = objmgr.GetPlayerAccountIdByGUID(targetGUID);
- targetSecurity = accmgr.GetSecurity(targetAccountId);
- }
-
- arg2 = strtok(NULL, " ");
+ targetAccountId = accmgr.GetId(targetAccountName);
+ targetSecurity = accmgr.GetSecurity(targetAccountId);
}
int32 gm = (int32)atoi(arg2);
@@ -741,8 +733,12 @@ bool ChatHandler::HandleSecurityCommand(const char* args)
return false;
}
- // can set security level only for target with less security and to less security that we have
- if(targetSecurity >= m_session->GetSecurity() || uint32(gm) >= m_session->GetSecurity() )
+ /// m_session==NULL only for console
+ uint32 plSecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE;
+
+ /// can set security level only for target with less security and to less security that we have
+ /// This is also reject self apply in fact
+ if(targetSecurity >= plSecurity || uint32(gm) >= plSecurity )
{
SendSysMessage(LANG_YOURS_SECURITY_IS_LOW);
SetSentErrorMessage(true);
@@ -751,18 +747,91 @@ bool ChatHandler::HandleSecurityCommand(const char* args)
if(targetPlayer)
{
- if( targetPlayer != m_session->GetPlayer() )
- ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,m_session->GetPlayer()->GetName(), gm);
-
+ ChatHandler(targetPlayer).PSendSysMessage(LANG_YOURS_SECURITY_CHANGED,m_session->GetPlayer()->GetName(), gm);
targetPlayer->GetSession()->SetSecurity(gm);
}
- PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetName.c_str(), gm);
+ PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm);
loginDatabase.PExecute("UPDATE account SET gmlevel = '%i' WHERE id = '%u'", gm, targetAccountId);
return true;
}
+/// Set password for account
+bool ChatHandler::HandleAccountSetPasswordCommand(const char* args)
+{
+ if(!*args)
+ return false;
+
+ ///- Get the command line arguments
+ char *szAccount = strtok ((char*)args," ");
+ char *szPassword1 = strtok (NULL," ");
+ char *szPassword2 = strtok (NULL," ");
+
+ if (!szAccount||!szPassword1 || !szPassword2)
+ return false;
+
+ std::string account_name = szAccount;
+ if(!AccountMgr::normilizeString(account_name))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 targetAccountId = accmgr.GetId(account_name);
+ if (!targetAccountId)
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ uint32 targetSecurity = accmgr.GetSecurity(targetAccountId);
+
+ /// m_session==NULL only for console
+ uint32 plSecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE;
+
+ /// can set password only for target with less security
+ /// This is also reject self apply in fact
+ if (targetSecurity >= plSecurity)
+ {
+ SendSysMessage (LANG_YOURS_SECURITY_IS_LOW);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ if (strcmp(szPassword1,szPassword2))
+ {
+ SendSysMessage (LANG_NEW_PASSWORDS_NOT_MATCH);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ AccountOpResult result = accmgr.ChangePassword(targetAccountId, szPassword1);
+
+ switch(result)
+ {
+ case AOR_OK:
+ SendSysMessage(LANG_COMMAND_PASSWORD);
+ break;
+ case AOR_NAME_NOT_EXIST:
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ case AOR_PASS_TOO_LONG:
+ SendSysMessage(LANG_PASSWORD_TOO_LONG);
+ SetSentErrorMessage(true);
+ return false;
+ default:
+ SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ return true;
+}
+
bool ChatHandler::HandleAllowMovementCommand(const char* /*args*/)
{
if(sWorld.getAllowMovement())
@@ -1976,10 +2045,16 @@ bool ChatHandler::HandleListItemCommand(const char* args)
char* cId = extractKeyFromLink((char*)args,"Hitem");
if(!cId)
return false;
- uint32 item_id = atol(cId);
-
- ItemPrototype const* itemProto = item_id ? itemProto = objmgr.GetItemPrototype(item_id) : NULL;
+ uint32 item_id = atol(cId);
+ if(!item_id)
+ {
+ PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ ItemPrototype const* itemProto = objmgr.GetItemPrototype(item_id);
if(!itemProto)
{
PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, item_id);
@@ -2135,14 +2210,53 @@ bool ChatHandler::HandleListItemCommand(const char* args)
delete result;
}
- if(inv_count+mail_count+auc_count == 0)
+ // guild bank case
+ uint32 guild_count = 0;
+ result=CharacterDatabase.PQuery("SELECT COUNT(item_entry) FROM guild_bank_item WHERE item_entry='%u'",item_id);
+ if(result)
+ {
+ guild_count = (*result)[0].GetUInt32();
+ delete result;
+ }
+
+ result=CharacterDatabase.PQuery(
+ // 0 1 2
+ "SELECT gi.item_guid, gi.guildid, guild.name "
+ "FROM guild_bank_item AS gi, guild WHERE gi.item_entry='%u' AND gi.guildid = guild.guildid LIMIT %u ",
+ item_id,uint32(count));
+
+ if(result)
+ {
+ do
+ {
+ Field *fields = result->Fetch();
+ uint32 item_guid = fields[0].GetUInt32();
+ uint32 guild_guid = fields[1].GetUInt32();
+ std::string guild_name = fields[2].GetCppString();
+
+ char const* item_pos = "[in guild bank]";
+
+ PSendSysMessage(LANG_ITEMLIST_GUILD,item_guid,guild_name.c_str(),guild_guid,item_pos);
+ } while (result->NextRow());
+
+ int64 res_count = result->GetRowCount();
+
+ delete result;
+
+ if(count > res_count)
+ count-=res_count;
+ else if(count)
+ count = 0;
+ }
+
+ if(inv_count+mail_count+auc_count+guild_count == 0)
{
SendSysMessage(LANG_COMMAND_NOITEMFOUND);
SetSentErrorMessage(true);
return false;
}
- PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE,item_id,inv_count+mail_count+auc_count,inv_count,mail_count,auc_count);
+ PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE,item_id,inv_count+mail_count+auc_count+guild_count,inv_count,mail_count,auc_count,guild_count);
return true;
}
@@ -2152,16 +2266,21 @@ bool ChatHandler::HandleListObjectCommand(const char* args)
if(!*args)
return false;
- // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
+ // number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hgameobject_entry");
if(!cId)
return false;
uint32 go_id = atol(cId);
+ if(!go_id)
+ {
+ PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id);
+ SetSentErrorMessage(true);
+ return false;
+ }
GameObjectInfo const * gInfo = objmgr.GetGameObjectInfo(go_id);
-
- if(!go_id || !gInfo)
+ if(!gInfo)
{
PSendSysMessage(LANG_COMMAND_LISTOBJINVALIDID, go_id);
SetSentErrorMessage(true);
@@ -2174,7 +2293,6 @@ bool ChatHandler::HandleListObjectCommand(const char* args)
if(count < 0)
return false;
- Player* pl = m_session->GetPlayer();
QueryResult *result;
uint32 obj_count = 0;
@@ -2185,8 +2303,15 @@ bool ChatHandler::HandleListObjectCommand(const char* args)
delete result;
}
- result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
- pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),go_id,uint32(count));
+ if(m_session)
+ {
+ Player* pl = m_session->GetPlayer();
+ result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
+ pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),go_id,uint32(count));
+ }
+ else
+ result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM gameobject WHERE id = '%u' LIMIT %u",
+ go_id,uint32(count));
if (result)
{
@@ -2199,7 +2324,10 @@ bool ChatHandler::HandleListObjectCommand(const char* args)
float z = fields[3].GetFloat();
int mapid = fields[4].GetUInt16();
- PSendSysMessage(LANG_GO_LIST, guid, guid, gInfo->name, x, y, z, mapid);
+ if (m_session)
+ PSendSysMessage(LANG_GO_LIST_CHAT, guid, guid, gInfo->name, x, y, z, mapid);
+ else
+ PSendSysMessage(LANG_GO_LIST_CONSOLE, guid, gInfo->name, x, y, z, mapid);
} while (result->NextRow());
delete result;
@@ -2238,7 +2366,7 @@ bool ChatHandler::HandleNearObjectCommand(const char* args)
if(!gInfo)
continue;
- PSendSysMessage(LANG_GO_LIST, guid, guid, gInfo->name, x, y, z, mapid);
+ PSendSysMessage(LANG_GO_LIST_CHAT, guid, guid, gInfo->name, x, y, z, mapid);
++count;
} while (result->NextRow());
@@ -2293,16 +2421,21 @@ bool ChatHandler::HandleListCreatureCommand(const char* args)
if(!*args)
return false;
- // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r
+ // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hcreature_entry");
if(!cId)
return false;
uint32 cr_id = atol(cId);
+ if(!cr_id)
+ {
+ PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, cr_id);
+ SetSentErrorMessage(true);
+ return false;
+ }
CreatureInfo const* cInfo = objmgr.GetCreatureTemplate(cr_id);
-
- if(!cr_id || !cInfo)
+ if(!cInfo)
{
PSendSysMessage(LANG_COMMAND_INVALIDCREATUREID, cr_id);
SetSentErrorMessage(true);
@@ -2315,7 +2448,6 @@ bool ChatHandler::HandleListCreatureCommand(const char* args)
if(count < 0)
return false;
- Player* pl = m_session->GetPlayer();
QueryResult *result;
uint32 cr_count = 0;
@@ -2326,8 +2458,15 @@ bool ChatHandler::HandleListCreatureCommand(const char* args)
delete result;
}
- result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
- pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), cr_id,uint32(count));
+ if(m_session)
+ {
+ Player* pl = m_session->GetPlayer();
+ result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM creature WHERE id = '%u' ORDER BY order_ ASC LIMIT %u",
+ pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), cr_id,uint32(count));
+ }
+ else
+ result = WorldDatabase.PQuery("SELECT guid, position_x, position_y, position_z, map FROM creature WHERE id = '%u' LIMIT %u",
+ cr_id,uint32(count));
if (result)
{
@@ -2340,7 +2479,10 @@ bool ChatHandler::HandleListCreatureCommand(const char* args)
float z = fields[3].GetFloat();
int mapid = fields[4].GetUInt16();
- PSendSysMessage(LANG_CREATURE_LIST, guid, guid, cInfo->Name, x, y, z, mapid);
+ if (m_session)
+ PSendSysMessage(LANG_CREATURE_LIST_CHAT, guid, guid, cInfo->Name, x, y, z, mapid);
+ else
+ PSendSysMessage(LANG_CREATURE_LIST_CONSOLE, guid, cInfo->Name, x, y, z, mapid);
} while (result->NextRow());
delete result;
@@ -2373,7 +2515,7 @@ bool ChatHandler::HandleLookupItemCommand(const char* args)
if(!pProto)
continue;
- int loc_idx = m_session->GetSessionDbLocaleIndex();
+ int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
if ( loc_idx >= 0 )
{
ItemLocale const *il = objmgr.GetItemLocale(pProto->ItemId);
@@ -2385,7 +2527,10 @@ bool ChatHandler::HandleLookupItemCommand(const char* args)
if (Utf8FitTo(name, wnamepart))
{
- PSendSysMessage(LANG_ITEM_LIST, id, id, name.c_str());
+ if (m_session)
+ PSendSysMessage(LANG_ITEM_LIST_CHAT, id, id, name.c_str());
+ else
+ PSendSysMessage(LANG_ITEM_LIST_CONSOLE, id, name.c_str());
++counter;
continue;
}
@@ -2399,7 +2544,10 @@ bool ChatHandler::HandleLookupItemCommand(const char* args)
if (Utf8FitTo(name, wnamepart))
{
- PSendSysMessage(LANG_ITEM_LIST, id, id, name.c_str());
+ if (m_session)
+ PSendSysMessage(LANG_ITEM_LIST_CHAT, id, id, name.c_str());
+ else
+ PSendSysMessage(LANG_ITEM_LIST_CONSOLE, id, name.c_str());
++counter;
}
}
@@ -2432,8 +2580,8 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args)
ItemSetEntry const *set = sItemSetStore.LookupEntry(id);
if(set)
{
- int loc = m_session->GetSessionDbcLocale();
- std::string name = set->name[m_session->GetSessionDbcLocale()];
+ int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
+ std::string name = set->name[loc];
if(name.empty())
continue;
@@ -2442,10 +2590,10 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args)
loc = 0;
for(; loc < MAX_LOCALE; ++loc)
{
- if(loc==m_session->GetSessionDbcLocale())
+ if(m_session && loc==m_session->GetSessionDbcLocale())
continue;
- name = set->name[m_session->GetSessionDbcLocale()];
+ name = set->name[loc];
if(name.empty())
continue;
@@ -2457,7 +2605,10 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args)
if(loc < MAX_LOCALE)
{
// send item set in "id - [namedlink locale]" format
- PSendSysMessage(LANG_ITEMSET_LIST,id,id,name.c_str(),localeNames[loc]);
+ if (m_session)
+ PSendSysMessage(LANG_ITEMSET_LIST_CHAT,id,id,name.c_str(),localeNames[loc]);
+ else
+ PSendSysMessage(LANG_ITEMSET_LIST_CONSOLE,id,name.c_str(),localeNames[loc]);
++counter;
}
}
@@ -2469,16 +2620,11 @@ bool ChatHandler::HandleLookupItemSetCommand(const char* args)
bool ChatHandler::HandleLookupSkillCommand(const char* args)
{
- Player* target = getSelectedPlayer();
- if(!target)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ if (!*args)
return false;
- }
- if(!*args)
- return false;
+ // can be NULL in console call
+ Player* target = getSelectedPlayer();
std::string namepart = args;
std::wstring wnamepart;
@@ -2497,7 +2643,7 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args)
SkillLineEntry const *skillInfo = sSkillLineStore.LookupEntry(id);
if(skillInfo)
{
- int loc = m_session->GetSessionDbcLocale();
+ int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
std::string name = skillInfo->name[loc];
if(name.empty())
continue;
@@ -2507,7 +2653,7 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args)
loc = 0;
for(; loc < MAX_LOCALE; ++loc)
{
- if(loc==m_session->GetSessionDbcLocale())
+ if(m_session && loc==m_session->GetSessionDbcLocale())
continue;
name = skillInfo->name[loc];
@@ -2521,8 +2667,15 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args)
if(loc < MAX_LOCALE)
{
+ char const* knownStr = "";
+ if(target && target->HasSkill(id))
+ knownStr = GetTrinityString(LANG_KNOWN);
+
// send skill in "id - [namedlink locale]" format
- PSendSysMessage(LANG_SKILL_LIST,id,id,name.c_str(),localeNames[loc],(target->HasSkill(id) ? m_session->GetTrinityString(LANG_KNOWN) : ""));
+ if (m_session)
+ PSendSysMessage(LANG_SKILL_LIST_CHAT,id,id,name.c_str(),localeNames[loc],knownStr);
+ else
+ PSendSysMessage(LANG_SKILL_LIST_CONSOLE,id,name.c_str(),localeNames[loc],knownStr);
++counter;
}
@@ -2535,16 +2688,11 @@ bool ChatHandler::HandleLookupSkillCommand(const char* args)
bool ChatHandler::HandleLookupSpellCommand(const char* args)
{
- Player* target = getSelectedPlayer();
- if( !target )
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ if (!*args)
return false;
- }
- if(!*args)
- return false;
+ // can be NULL at console call
+ Player* target = getSelectedPlayer();
std::string namepart = args;
std::wstring wnamepart;
@@ -2563,7 +2711,7 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args)
SpellEntry const *spellInfo = sSpellStore.LookupEntry(id);
if(spellInfo)
{
- int loc = m_session->GetSessionDbcLocale();
+ int loc = m_session ? m_session->GetSessionDbcLocale() : sWorld.GetDefaultDbcLocale();
std::string name = spellInfo->SpellName[loc];
if(name.empty())
continue;
@@ -2573,7 +2721,7 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args)
loc = 0;
for(; loc < MAX_LOCALE; ++loc)
{
- if(loc==m_session->GetSessionDbcLocale())
+ if(m_session && loc==m_session->GetSessionDbcLocale())
continue;
name = spellInfo->SpellName[loc];
@@ -2587,14 +2735,14 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args)
if(loc < MAX_LOCALE)
{
- bool known = target->HasSpell(id);
+ bool known = target && target->HasSpell(id);
bool learn = (spellInfo->Effect[0] == SPELL_EFFECT_LEARN_SPELL);
uint32 telentCost = GetTalentSpellCost(id);
bool talent = (telentCost > 0);
bool passive = IsPassiveSpell(id);
- bool active = target->HasAura(id,0) || target->HasAura(id,1) || target->HasAura(id,2);
+ bool active = target && (target->HasAura(id,0) || target->HasAura(id,1) || target->HasAura(id,2));
// unit32 used to prevent interpreting uint8 as char at output
// find rank of learned spell for learning spell, or talent rank
@@ -2602,13 +2750,19 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args)
// send spell in "id - [name, rank N] [talent] [passive] [learn] [known]" format
std::ostringstream ss;
- ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
+ if (m_session)
+ ss << id << " - |cffffffff|Hspell:" << id << "|h[" << name;
+ else
+ ss << id << " - " << name;
// include rank in link name
if(rank)
ss << GetTrinityString(LANG_SPELL_RANK) << rank;
- ss << " " << localeNames[loc] << "]|h|r";
+ if (m_session)
+ ss << " " << localeNames[loc] << "]|h|r";
+ else
+ ss << " " << localeNames[loc];
if(talent)
ss << GetTrinityString(LANG_TALENT);
@@ -2634,16 +2788,11 @@ bool ChatHandler::HandleLookupSpellCommand(const char* args)
bool ChatHandler::HandleLookupQuestCommand(const char* args)
{
- Player* target = getSelectedPlayer();
- if( !target )
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ if (!*args)
return false;
- }
- if(!*args)
- return false;
+ // can be NULL at console call
+ Player* target = getSelectedPlayer();
std::string namepart = args;
std::wstring wnamepart;
@@ -2661,7 +2810,7 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args)
{
Quest * qinfo = iter->second;
- int loc_idx = m_session->GetSessionDbLocaleIndex();
+ int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
if ( loc_idx >= 0 )
{
QuestLocale const *il = objmgr.GetQuestLocale(qinfo->GetQuestId());
@@ -2673,20 +2822,28 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args)
if (Utf8FitTo(title, wnamepart))
{
- QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
-
char const* statusStr = "";
- if(status == QUEST_STATUS_COMPLETE)
+
+ if(target)
{
- if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
- statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
- else
- statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+ QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
+
+ if(status == QUEST_STATUS_COMPLETE)
+ {
+ if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
+ statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
+ else
+ statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+ }
+ else if(status == QUEST_STATUS_INCOMPLETE)
+ statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
}
- else if(status == QUEST_STATUS_INCOMPLETE)
- statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
+
+ if (m_session)
+ PSendSysMessage(LANG_QUEST_LIST_CHAT,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),statusStr);
+ else
+ PSendSysMessage(LANG_QUEST_LIST_CONSOLE,qinfo->GetQuestId(),title.c_str(),statusStr);
- PSendSysMessage(LANG_QUEST_LIST,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),(status == QUEST_STATUS_COMPLETE ? GetTrinityString(LANG_COMPLETE) : (status == QUEST_STATUS_INCOMPLETE ? GetTrinityString(LANG_ACTIVE) : "") ));
++counter;
continue;
}
@@ -2700,20 +2857,28 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args)
if (Utf8FitTo(title, wnamepart))
{
- QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
-
char const* statusStr = "";
- if(status == QUEST_STATUS_COMPLETE)
+
+ if(target)
{
- if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
- statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
- else
- statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+ QuestStatus status = target->GetQuestStatus(qinfo->GetQuestId());
+
+ if(status == QUEST_STATUS_COMPLETE)
+ {
+ if(target->GetQuestRewardStatus(qinfo->GetQuestId()))
+ statusStr = GetTrinityString(LANG_COMMAND_QUEST_REWARDED);
+ else
+ statusStr = GetTrinityString(LANG_COMMAND_QUEST_COMPLETE);
+ }
+ else if(status == QUEST_STATUS_INCOMPLETE)
+ statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
}
- else if(status == QUEST_STATUS_INCOMPLETE)
- statusStr = GetTrinityString(LANG_COMMAND_QUEST_ACTIVE);
+
+ if (m_session)
+ PSendSysMessage(LANG_QUEST_LIST_CHAT,qinfo->GetQuestId(),qinfo->GetQuestId(),title.c_str(),statusStr);
+ else
+ PSendSysMessage(LANG_QUEST_LIST_CONSOLE,qinfo->GetQuestId(),title.c_str(),statusStr);
- PSendSysMessage(LANG_QUEST_LIST,qinfo->GetQuestId(),qinfo->GetQuestId(), title.c_str(),(status == QUEST_STATUS_COMPLETE ? GetTrinityString(LANG_COMPLETE) : (status == QUEST_STATUS_INCOMPLETE ? GetTrinityString(LANG_ACTIVE) : "") ));
++counter;
}
}
@@ -2726,39 +2891,43 @@ bool ChatHandler::HandleLookupQuestCommand(const char* args)
bool ChatHandler::HandleLookupCreatureCommand(const char* args)
{
- if(!*args)
+ if (!*args)
return false;
std::string namepart = args;
std::wstring wnamepart;
// converting string that we try to find to lower case
- if(!Utf8toWStr(namepart,wnamepart))
+ if (!Utf8toWStr (namepart,wnamepart))
return false;
- wstrToLower(wnamepart);
+ wstrToLower (wnamepart);
uint32 counter = 0;
- for (uint32 id = 0; id< sCreatureStorage.MaxEntry; id++ )
+ for (uint32 id = 0; id< sCreatureStorage.MaxEntry; ++id)
{
- CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(id);
+ CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo> (id);
if(!cInfo)
continue;
- int loc_idx = m_session->GetSessionDbLocaleIndex();
- if ( loc_idx >= 0 )
+ int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
+ if (loc_idx >= 0)
{
- CreatureLocale const *cl = objmgr.GetCreatureLocale(id);
+ CreatureLocale const *cl = objmgr.GetCreatureLocale (id);
if (cl)
{
- if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty())
+ if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty ())
{
std::string name = cl->Name[loc_idx];
- if (Utf8FitTo(name, wnamepart))
+ if (Utf8FitTo (name, wnamepart))
{
- PSendSysMessage(LANG_CREATURE_ENTRY_LIST, id, id, name.c_str());
+ if (m_session)
+ PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ());
+ else
+ PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ());
+
++counter;
continue;
}
@@ -2767,18 +2936,21 @@ bool ChatHandler::HandleLookupCreatureCommand(const char* args)
}
std::string name = cInfo->Name;
- if(name.empty())
+ if (name.empty ())
continue;
if (Utf8FitTo(name, wnamepart))
{
- PSendSysMessage(LANG_CREATURE_ENTRY_LIST,id,id,name.c_str());
+ if (m_session)
+ PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CHAT, id, id, name.c_str ());
+ else
+ PSendSysMessage (LANG_CREATURE_ENTRY_LIST_CONSOLE, id, name.c_str ());
++counter;
}
}
if (counter==0)
- SendSysMessage(LANG_COMMAND_NOCREATUREFOUND);
+ SendSysMessage (LANG_COMMAND_NOCREATUREFOUND);
return true;
}
@@ -2805,7 +2977,7 @@ bool ChatHandler::HandleLookupObjectCommand(const char* args)
if(!gInfo)
continue;
- int loc_idx = m_session->GetSessionDbLocaleIndex();
+ int loc_idx = m_session ? m_session->GetSessionDbLocaleIndex() : objmgr.GetDBCLocaleIndex();
if ( loc_idx >= 0 )
{
GameObjectLocale const *gl = objmgr.GetGameObjectLocale(id);
@@ -2817,7 +2989,10 @@ bool ChatHandler::HandleLookupObjectCommand(const char* args)
if (Utf8FitTo(name, wnamepart))
{
- PSendSysMessage(LANG_GO_ENTRY_LIST, id, id, name.c_str());
+ if (m_session)
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str());
+ else
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str());
++counter;
continue;
}
@@ -2831,7 +3006,10 @@ bool ChatHandler::HandleLookupObjectCommand(const char* args)
if(Utf8FitTo(name, wnamepart))
{
- PSendSysMessage(LANG_GO_ENTRY_LIST, id, id, name.c_str());
+ if (m_session)
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CHAT, id, id, name.c_str());
+ else
+ PSendSysMessage(LANG_GO_ENTRY_LIST_CONSOLE, id, name.c_str());
++counter;
}
}
@@ -2856,86 +3034,82 @@ bool ChatHandler::HandleGuildCreateCommand(const char* args)
if (!*args)
return false;
- Guild *guild;
- Player * player;
- char *lname,*gname;
- std::string guildname;
-
- lname = strtok((char*)args, " ");
- gname = strtok(NULL, "");
+ char *lname = strtok ((char*)args, " ");
+ char *gname = strtok (NULL, "");
- if(!lname)
+ if (!lname)
return false;
- else if(!gname)
+
+ if (!gname)
{
- SendSysMessage(LANG_INSERT_GUILD_NAME);
- SetSentErrorMessage(true);
+ SendSysMessage (LANG_INSERT_GUILD_NAME);
+ SetSentErrorMessage (true);
return false;
}
- guildname = gname;
- player = ObjectAccessor::Instance().FindPlayerByName(lname);
+ std::string guildname = gname;
- if(!player)
+ Player* player = ObjectAccessor::Instance ().FindPlayerByName (lname);
+ if (!player)
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ SendSysMessage (LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage (true);
return false;
}
- if(!player->GetGuildId())
+ if (player->GetGuildId())
{
- guild = new Guild;
- if(!guild->create(player->GetGUID(),guildname))
- {
- delete guild;
- SendSysMessage(LANG_GUILD_NOT_CREATED);
- SetSentErrorMessage(true);
- return false;
- }
+ SendSysMessage (LANG_PLAYER_IN_GUILD);
+ return true;
+ }
- objmgr.AddGuild(guild);
+ Guild *guild = new Guild;
+ if (!guild->create (player->GetGUID (),guildname))
+ {
+ delete guild;
+ SendSysMessage (LANG_GUILD_NOT_CREATED);
+ SetSentErrorMessage (true);
+ return false;
}
- else
- SendSysMessage(LANG_PLAYER_IN_GUILD);
-
+
+ objmgr.AddGuild (guild);
return true;
}
bool ChatHandler::HandleGuildInviteCommand(const char *args)
{
- if(!*args)
+ if (!*args)
return false;
- char* par1 = strtok((char*)args, " ");
+ char* par1 = strtok ((char*)args, " ");
char* par2 = strtok (NULL, "");
if(!par1 || !par2)
return false;
std::string glName = par2;
- Guild* targetGuild = objmgr.GetGuildByName(glName);
- if(!targetGuild)
+ Guild* targetGuild = objmgr.GetGuildByName (glName);
+ if (!targetGuild)
return false;
std::string plName = par1;
- if(!normalizePlayerName(plName))
+ if (!normalizePlayerName (plName))
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ SendSysMessage (LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage (true);
return false;
}
uint64 plGuid = 0;
- if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str()))
- plGuid = targetPlayer->GetGUID();
+ if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
+ plGuid = targetPlayer->GetGUID ();
else
- plGuid = objmgr.GetPlayerGUIDByName(plName.c_str());
+ plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
- if(!plGuid)
+ if (!plGuid)
false;
// players's guild membership checked in AddMember before add
- if(!targetGuild->AddMember(plGuid,targetGuild->GetLowestRank()))
+ if (!targetGuild->AddMember (plGuid,targetGuild->GetLowestRank ()))
return false;
return true;
@@ -2943,107 +3117,109 @@ bool ChatHandler::HandleGuildInviteCommand(const char *args)
bool ChatHandler::HandleGuildUninviteCommand(const char *args)
{
- if(!*args)
+ if (!*args)
return false;
- char* par1 = strtok((char*)args, " ");
+ char* par1 = strtok ((char*)args, " ");
if(!par1)
return false;
+
std::string plName = par1;
- if(!normalizePlayerName(plName))
+ if (!normalizePlayerName (plName))
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ SendSysMessage (LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage (true);
return false;
}
uint64 plGuid = 0;
uint32 glId = 0;
- if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str()))
+ if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
{
- plGuid = targetPlayer->GetGUID();
- glId = targetPlayer->GetGuildId();
+ plGuid = targetPlayer->GetGUID ();
+ glId = targetPlayer->GetGuildId ();
}
else
{
- plGuid = objmgr.GetPlayerGUIDByName(plName.c_str());
- glId = Player::GetGuildIdFromDB(plGuid);
+ plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+ glId = Player::GetGuildIdFromDB (plGuid);
}
- if(!plGuid || !glId)
+ if (!plGuid || !glId)
return false;
- Guild* targetGuild = objmgr.GetGuildById(glId);
- if(!targetGuild)
+ Guild* targetGuild = objmgr.GetGuildById (glId);
+ if (!targetGuild)
return false;
- targetGuild->DelMember(plGuid);
+ targetGuild->DelMember (plGuid);
return true;
}
bool ChatHandler::HandleGuildRankCommand(const char *args)
{
- if(!*args)
+ if (!*args)
return false;
- char* par1 = strtok((char*)args, " ");
- char* par2 = strtok(NULL, " ");
- if(!par1 || !par2)
+ char* par1 = strtok ((char*)args, " ");
+ char* par2 = strtok (NULL, " ");
+ if (!par1 || !par2)
return false;
+
std::string plName = par1;
- if(!normalizePlayerName(plName))
+ if (!normalizePlayerName (plName))
{
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
+ SendSysMessage (LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage (true);
return false;
}
uint64 plGuid = 0;
uint32 glId = 0;
- if(Player* targetPlayer = ObjectAccessor::Instance().FindPlayerByName(plName.c_str()))
+ if (Player* targetPlayer = ObjectAccessor::Instance ().FindPlayerByName (plName.c_str ()))
{
- plGuid = targetPlayer->GetGUID();
- glId = targetPlayer->GetGuildId();
+ plGuid = targetPlayer->GetGUID ();
+ glId = targetPlayer->GetGuildId ();
}
else
{
- plGuid = objmgr.GetPlayerGUIDByName(plName.c_str());
- glId = Player::GetGuildIdFromDB(plGuid);
+ plGuid = objmgr.GetPlayerGUIDByName (plName.c_str ());
+ glId = Player::GetGuildIdFromDB (plGuid);
}
- if(!plGuid || !glId)
+ if (!plGuid || !glId)
return false;
- Guild* targetGuild = objmgr.GetGuildById(glId);
- if(!targetGuild)
+ Guild* targetGuild = objmgr.GetGuildById (glId);
+ if (!targetGuild)
return false;
- uint32 newrank = uint32(atoi(par2));
- if(newrank > targetGuild->GetLowestRank())
+ uint32 newrank = uint32 (atoi (par2));
+ if (newrank > targetGuild->GetLowestRank ())
return false;
- targetGuild->ChangeRank(plGuid,newrank);
+ targetGuild->ChangeRank (plGuid,newrank);
return true;
}
bool ChatHandler::HandleGuildDeleteCommand(const char* args)
{
- if(!*args)
+ if (!*args)
return false;
- char* par1 = strtok((char*)args, " ");
- if(!par1)
+ char* par1 = strtok ((char*)args, " ");
+ if (!par1)
return false;
std::string gld = par1;
- Guild* targetGuild = objmgr.GetGuildByName(gld);
- if(!targetGuild)
+ Guild* targetGuild = objmgr.GetGuildByName (gld);
+ if (!targetGuild)
return false;
- targetGuild->Disband();
+ targetGuild->Disband ();
return true;
}
@@ -3471,11 +3647,6 @@ bool ChatHandler::HandleNearGraveCommand(const char* args)
return true;
}
-bool ChatHandler::HandleSpawnTransportCommand(const char* /*args*/)
-{
- return true;
-}
-
//play npc emote
bool ChatHandler::HandlePlayEmoteCommand(const char* args)
{
@@ -4720,238 +4891,470 @@ bool ChatHandler::HandleCompleteQuest(const char* args)
return true;
}
-bool ChatHandler::HandleBanCommand(const char* args)
+bool ChatHandler::HandleBanAccountCommand(const char* args)
{
- if(!args)
- return false;
+ return HandleBanHelper(BAN_ACCOUNT,args);
+}
- char* type = strtok((char*)args, " ");
+bool ChatHandler::HandleBanCharacterCommand(const char* args)
+{
+ return HandleBanHelper(BAN_CHARACTER,args);
+}
- if(!type)
+bool ChatHandler::HandleBanIPCommand(const char* args)
+{
+ return HandleBanHelper(BAN_IP,args);
+}
+
+bool ChatHandler::HandleBanHelper(BanMode mode, const char* args)
+{
+ if(!args)
return false;
- char* nameOrIP = strtok(NULL, " ");
- if(!nameOrIP)
+ char* cnameOrIP = strtok ((char*)args, " ");
+ if (!cnameOrIP)
return false;
- char* duration = strtok(NULL," ");
+ std::string nameOrIP = cnameOrIP;
+
+ char* duration = strtok (NULL," ");
if(!duration || !atoi(duration))
return false;
- char* reason = strtok(NULL,"");
+ char* reason = strtok (NULL,"");
if(!reason)
return false;
- switch(sWorld.BanAccount(type, nameOrIP, duration, reason,m_session->GetPlayerName()))
+ switch(mode)
+ {
+ case BAN_ACCOUNT:
+ if(!AccountMgr::normilizeString(nameOrIP))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,nameOrIP.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+ break;
+ case BAN_CHARACTER:
+ if(!normalizePlayerName(nameOrIP))
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+ break;
+ case BAN_IP:
+ if(!IsIPAddress(nameOrIP.c_str()))
+ return false;
+ break;
+ }
+
+ switch(sWorld.BanAccount(mode, nameOrIP, duration, reason,m_session ? m_session->GetPlayerName() : ""))
{
case BAN_SUCCESS:
if(atoi(duration)>0)
- PSendSysMessage(LANG_BAN_YOUBANNED,nameOrIP,secsToTimeString(TimeStringToSecs(duration),true).c_str(),reason);
+ PSendSysMessage(LANG_BAN_YOUBANNED,nameOrIP.c_str(),secsToTimeString(TimeStringToSecs(duration),true).c_str(),reason);
else
- PSendSysMessage(LANG_BAN_YOUPERMBANNED,nameOrIP,reason);
+ PSendSysMessage(LANG_BAN_YOUPERMBANNED,nameOrIP.c_str(),reason);
break;
case BAN_SYNTAX_ERROR:
return false;
case BAN_NOTFOUND:
- PSendSysMessage(LANG_BAN_NOTFOUND,type,nameOrIP);
- break;
+ switch(mode)
+ {
+ default:
+ PSendSysMessage(LANG_BAN_NOTFOUND,"account",nameOrIP.c_str());
+ break;
+ case BAN_CHARACTER:
+ PSendSysMessage(LANG_BAN_NOTFOUND,"character",nameOrIP.c_str());
+ break;
+ case BAN_IP:
+ PSendSysMessage(LANG_BAN_NOTFOUND,"ip",nameOrIP.c_str());
+ break;
+
+ }
+ SetSentErrorMessage(true);
+ return false;
}
return true;
}
-bool ChatHandler::HandleUnBanCommand(const char* args)
+bool ChatHandler::HandleUnBanAccountCommand(const char* args)
{
- if(!args)
- return false;
- char* type = strtok((char*)args, " ");
- if(!type)
- return false;
- char* nameOrIP = strtok(NULL, " ");
-
- if(!nameOrIP)
- return false;
+ return HandleUnBanHelper(BAN_ACCOUNT,args);
+}
- if(sWorld.RemoveBanAccount(type,nameOrIP))
- PSendSysMessage(LANG_UNBAN_UNBANNED,nameOrIP);
- else
- PSendSysMessage(LANG_UNBAN_ERROR,nameOrIP);
+bool ChatHandler::HandleUnBanCharacterCommand(const char* args)
+{
+ return HandleUnBanHelper(BAN_CHARACTER,args);
+}
- return true;
+bool ChatHandler::HandleUnBanIPCommand(const char* args)
+{
+ return HandleUnBanHelper(BAN_IP,args);
}
-bool ChatHandler::HandleBanInfoCommand(const char* args)
+bool ChatHandler::HandleUnBanHelper(BanMode mode, const char* args)
{
if(!args)
return false;
- char* cType = strtok((char*)args, " ");
- char* cnameOrIP = strtok(NULL, "");
- if(!cType || !cnameOrIP)
+ char* cnameOrIP = strtok ((char*)args, " ");
+ if(!cnameOrIP)
return false;
std::string nameOrIP = cnameOrIP;
- std::string type = cType;
- if (!IsIPAddress(cnameOrIP) && type=="ip")
- return false;
-
- Field *fields;
- if(type != "ip")
+ switch(mode)
{
- //look the accountid up
- uint32 accountid;
- std::string accountname;
- if(type == "account")
- {
- loginDatabase.escape_string(nameOrIP);
- QueryResult *result = loginDatabase.PQuery("SELECT id, username FROM account WHERE username = '%s'",nameOrIP.c_str());
- if (!result)
+ case BAN_ACCOUNT:
+ if(!AccountMgr::normilizeString(nameOrIP))
{
- PSendSysMessage(LANG_BANINFO_NOACCOUNT);
- return true;
- }
- fields = result->Fetch();
- accountid = fields[0].GetUInt32();
- accountname = fields[1].GetCppString();
- delete result;
- }
- else if(type == "character")
- {
- if(!normalizePlayerName(nameOrIP))
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,nameOrIP.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+ break;
+ case BAN_CHARACTER:
+ if(!normalizePlayerName(nameOrIP))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
+ break;
+ case BAN_IP:
+ if(!IsIPAddress(nameOrIP.c_str()))
+ return false;
+ break;
+ }
- accountid = objmgr.GetPlayerAccountIdByPlayerName (nameOrIP);
- if (!accountid)
- {
- PSendSysMessage(LANG_BANINFO_NOCHARACTER);
- return true;
- }
-
- if (!accmgr.GetName (accountid,accountname))
- {
- PSendSysMessage(LANG_BANINFO_NOCHARACTER);
- return true;
- }
- }
- else
- return false;
+ if(sWorld.RemoveBanAccount(mode,nameOrIP))
+ PSendSysMessage(LANG_UNBAN_UNBANNED,nameOrIP.c_str());
+ else
+ PSendSysMessage(LANG_UNBAN_ERROR,nameOrIP.c_str());
- QueryResult *result = loginDatabase.PQuery("SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate,banreason,bannedby FROM account_banned WHERE id = '%u' ORDER BY bandate ASC",accountid);
- if(!result)
- {
- PSendSysMessage(LANG_BANINFO_NOACCOUNTBAN, accountname.c_str());
- return true;
- }
+ return true;
+}
- PSendSysMessage(LANG_BANINFO_BANHISTORY,accountname.c_str());
- do
- {
- fields = result->Fetch();
-
- time_t unbandate = time_t(fields[3].GetUInt64());
- bool active = false;
- if(fields[2].GetBool() && (fields[1].GetUInt64() == (uint64)0 ||unbandate >= time(NULL)) )
- active = true;
- bool permanent = (fields[1].GetUInt64() == (uint64)0);
- std::string bantime = permanent?GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[1].GetUInt64(), true);
- PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
- fields[0].GetString(), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES):GetTrinityString(LANG_BANINFO_NO), fields[4].GetString(), fields[5].GetString());
- }while (result->NextRow());
+bool ChatHandler::HandleBanInfoAccountCommand(const char* args)
+{
+ if(!args)
+ return false;
- delete result;
+ char* cname = strtok((char*)args, "");
+ if(!cname)
+ return false;
+
+ std::string account_name = cname;
+ if(!AccountMgr::normilizeString(account_name))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
}
- else
+
+ uint32 accountid = accmgr.GetId(account_name);
+ if(!accountid)
{
- loginDatabase.escape_string(nameOrIP);
- QueryResult *result = loginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason,bannedby,unbandate-bandate FROM ip_banned WHERE ip = '%s'",nameOrIP.c_str());
- if(!result)
- {
- PSendSysMessage(LANG_BANINFO_NOIP);
- return true;
- }
- fields = result->Fetch();
- bool permanent = (fields[6].GetUInt64()==(uint64)0);
- PSendSysMessage(LANG_BANINFO_IPENTRY,
- fields[0].GetString(), fields[1].GetString(), permanent ? GetTrinityString(LANG_BANINFO_NEVER):fields[2].GetString(),
- permanent ? GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetString(), fields[5].GetString());
- delete result;
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ return true;
}
- return true;
+
+ return HandleBanInfoHelper(accountid,account_name.c_str());
}
-bool ChatHandler::HandleBanListCommand(const char* args)
+bool ChatHandler::HandleBanInfoCharacterCommand(const char* args)
{
- loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
- if(!*args)
+ if(!args)
return false;
- char* cType = strtok((char*)args, " ");
- char* cFilter = strtok(NULL, "");
- if(!cType || !cFilter)
+
+ char* cname = strtok ((char*)args, "");
+ if(!cname)
return false;
- std::string Filter = cFilter;
- std::string Type = cType;
- loginDatabase.escape_string(Filter);
- QueryResult* result = NULL;
- Field *fields = NULL;
- if(Type == "ip")
- {
- result = loginDatabase.PQuery("SELECT ip FROM ip_banned WHERE ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str());
- if(!result)
- {
- PSendSysMessage(LANG_BANLIST_NOIP);
- return true;
- }
- PSendSysMessage(LANG_BANLIST_MATCHINGIP);
- do
- {
- fields = result->Fetch();
- PSendSysMessage("%s",fields[0].GetString());
- } while (result->NextRow());
+ std::string name = cname;
+ if(!normalizePlayerName(name))
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
- delete result;
+ uint32 accountid = objmgr.GetPlayerAccountIdByPlayerName(name);
+ if(!accountid)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ std::string accountname;
+ if(!accmgr.GetName(accountid,accountname))
+ {
+ PSendSysMessage(LANG_BANINFO_NOCHARACTER);
return true;
}
- //lookup accountid
- if(Type == "account")
+
+ return HandleBanInfoHelper(accountid,accountname.c_str());
+}
+
+bool ChatHandler::HandleBanInfoHelper(uint32 accountid, char const* accountname)
+{
+ QueryResult *result = loginDatabase.PQuery("SELECT FROM_UNIXTIME(bandate), unbandate-bandate, active, unbandate,banreason,bannedby FROM account_banned WHERE id = '%u' ORDER BY bandate ASC",accountid);
+ if(!result)
{
- result = loginDatabase.PQuery("SELECT id FROM account WHERE username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str());
- if (!result)
- {
- PSendSysMessage(LANG_BANLIST_NOACCOUNT);
- return true;
- }
- //do not delete result
+ PSendSysMessage(LANG_BANINFO_NOACCOUNTBAN, accountname);
+ return true;
}
- else if(Type == "characters")
+
+ PSendSysMessage(LANG_BANINFO_BANHISTORY,accountname);
+ do
{
- result = CharacterDatabase.PQuery("SELECT account FROM characters, WHERE name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),Filter.c_str());
- if (!result)
- {
- PSendSysMessage(LANG_BANLIST_NOCHARACTER);
- return true;
- }
+ Field* fields = result->Fetch();
+
+ time_t unbandate = time_t(fields[3].GetUInt64());
+ bool active = false;
+ if(fields[2].GetBool() && (fields[1].GetUInt64() == (uint64)0 ||unbandate >= time(NULL)) )
+ active = true;
+ bool permanent = (fields[1].GetUInt64() == (uint64)0);
+ std::string bantime = permanent?GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[1].GetUInt64(), true);
+ PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
+ fields[0].GetString(), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES):GetTrinityString(LANG_BANINFO_NO), fields[4].GetString(), fields[5].GetString());
+ }while (result->NextRow());
+
+ delete result;
+ return true;
+}
+
+bool ChatHandler::HandleBanInfoIPCommand(const char* args)
+{
+ if(!args)
+ return false;
+
+ char* cIP = strtok ((char*)args, "");
+ if(!cIP)
+ return false;
+
+ if (!IsIPAddress(cIP))
+ return false;
+
+ std::string IP = cIP;
+
+ loginDatabase.escape_string(IP);
+ QueryResult *result = loginDatabase.PQuery("SELECT ip, FROM_UNIXTIME(bandate), FROM_UNIXTIME(unbandate), unbandate-UNIX_TIMESTAMP(), banreason,bannedby,unbandate-bandate FROM ip_banned WHERE ip = '%s'",IP.c_str());
+ if(!result)
+ {
+ PSendSysMessage(LANG_BANINFO_NOIP);
+ return true;
}
- else
+
+ Field *fields = result->Fetch();
+ bool permanent = !fields[6].GetUInt64();
+ PSendSysMessage(LANG_BANINFO_IPENTRY,
+ fields[0].GetString(), fields[1].GetString(), permanent ? GetTrinityString(LANG_BANINFO_NEVER):fields[2].GetString(),
+ permanent ? GetTrinityString(LANG_BANINFO_INFINITE):secsToTimeString(fields[3].GetUInt64(), true).c_str(), fields[4].GetString(), fields[5].GetString());
+ delete result;
+ return true;
+}
+
+bool ChatHandler::HandleBanListCharacterCommand(const char* args)
+{
+ loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+
+ char* cFilter = strtok ((char*)args, " ");
+ if(!cFilter)
return false;
+ std::string filter = cFilter;
+ loginDatabase.escape_string(filter);
+ QueryResult* result = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"),filter.c_str());
+ if (!result)
+ {
+ PSendSysMessage(LANG_BANLIST_NOCHARACTER);
+ return true;
+ }
+
+ return HandleBanListHelper(result);
+}
+
+bool ChatHandler::HandleBanListAccountCommand(const char* args)
+{
+ loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+
+ char* cFilter = strtok((char*)args, " ");
+ std::string filter = cFilter ? cFilter : "";
+ loginDatabase.escape_string(filter);
+
+ QueryResult* result;
+
+ if(filter.empty())
+ {
+ result = loginDatabase.Query("SELECT account.id, username FROM account, account_banned"
+ " WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id");
+ }
+ else
+ {
+ result = loginDatabase.PQuery("SELECT account.id, username FROM account, account_banned"
+ " WHERE account.id = account_banned.id AND active = 1 AND username "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'")" GROUP BY account.id",
+ filter.c_str());
+ }
+
+ if (!result)
+ {
+ PSendSysMessage(LANG_BANLIST_NOACCOUNT);
+ return true;
+ }
+
+ return HandleBanListHelper(result);
+}
+
+bool ChatHandler::HandleBanListHelper(QueryResult* result)
+{
PSendSysMessage(LANG_BANLIST_MATCHINGACCOUNT);
- do
+
+ // Chat short output
+ if(m_session)
{
- fields = result->Fetch();
- uint32 accountid = fields[0].GetUInt32();
- QueryResult* banresult = loginDatabase.PQuery("SELECT account.username FROM account,account_banned WHERE account_banned.id='%u' AND account_banned.active = '1' AND account_banned.id=account.id",accountid);
- if(banresult)
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 accountid = fields[0].GetUInt32();
+
+ QueryResult* banresult = loginDatabase.PQuery("SELECT account.username FROM account,account_banned WHERE account_banned.id='%u' AND account_banned.id=account.id",accountid);
+ if(banresult)
+ {
+ Field* fields2 = banresult->Fetch();
+ PSendSysMessage("%s",fields2[0].GetString());
+ delete banresult;
+ }
+ } while (result->NextRow());
+ }
+ // Console wide output
+ else
+ {
+ SendSysMessage(LANG_BANLIST_ACCOUNTS);
+ SendSysMessage("===============================================================================");
+ SendSysMessage(LANG_BANLIST_ACCOUNTS_HEADER);
+ do
+ {
+ SendSysMessage("-------------------------------------------------------------------------------");
+ Field *fields = result->Fetch();
+ uint32 account_id = fields[0].GetUInt32 ();
+
+ std::string account_name;
+
+ // "account" case, name can be get in same quary
+ if(result->GetFieldCount() > 1)
+ account_name = fields[1].GetCppString();
+ // "character" case, name need extract from another DB
+ else
+ accmgr.GetName (account_id,account_name);
+
+ // No SQL injection. id is uint32.
+ QueryResult *banInfo = loginDatabase.PQuery("SELECT bandate,unbandate,bannedby,banreason FROM account_banned WHERE id = %u ORDER BY unbandate", account_id);
+ if (banInfo)
+ {
+ Field *fields2 = banInfo->Fetch();
+ do
+ {
+ time_t t_ban = fields2[0].GetUInt64();
+ tm* aTm_ban = localtime(&t_ban);
+
+ if (fields2[0].GetUInt64() == fields2[1].GetUInt64())
+ {
+ PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
+ account_name.c_str(),aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+ fields2[2].GetString(),fields2[3].GetString());
+ }
+ else
+ {
+ time_t t_unban = fields2[1].GetUInt64();
+ tm* aTm_unban = localtime(&t_unban);
+ PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
+ account_name.c_str(),aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+ aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min,
+ fields2[2].GetString(),fields2[3].GetString());
+ }
+ }while ( banInfo->NextRow() );
+ delete banInfo;
+ }
+ }while( result->NextRow() );
+ SendSysMessage("===============================================================================");
+ }
+
+ delete result;
+ return true;
+}
+
+bool ChatHandler::HandleBanListIPCommand(const char* args)
+{
+ loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
+
+ char* cFilter = strtok((char*)args, " ");
+ std::string filter = cFilter ? cFilter : "";
+ loginDatabase.escape_string(filter);
+
+ QueryResult* result;
+
+ if(filter.empty())
+ {
+ result = loginDatabase.Query ("SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned"
+ " WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP())"
+ " ORDER BY unbandate" );
+ }
+ else
+ {
+ result = loginDatabase.PQuery( "SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned"
+ " WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP()) AND ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'")
+ " ORDER BY unbandate",filter.c_str() );
+ }
+
+ if(!result)
+ {
+ PSendSysMessage(LANG_BANLIST_NOIP);
+ return true;
+ }
+
+ PSendSysMessage(LANG_BANLIST_MATCHINGIP);
+ // Chat short output
+ if(m_session)
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ PSendSysMessage("%s",fields[0].GetString());
+ }while (result->NextRow());
+ }
+ // Console wide output
+ else
+ {
+ SendSysMessage(LANG_BANLIST_IPS);SendSysMessage("===============================================================================");
+ SendSysMessage(LANG_BANLIST_IPS_HEADER);
+ do
{
- Field* fields2 = banresult->Fetch();
- PSendSysMessage("%s",fields2[0].GetString());
- delete banresult;
- }
- } while (result->NextRow());
+ SendSysMessage("-------------------------------------------------------------------------------");
+ Field *fields = result->Fetch();
+ time_t t_ban = fields[1].GetUInt64();
+ tm* aTm_ban = localtime(&t_ban);
+ if ( fields[1].GetUInt64() == fields[2].GetUInt64() )
+ {
+ PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
+ fields[0].GetString(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+ fields[3].GetString(), fields[4].GetString());
+ }
+ else
+ {
+ time_t t_unban = fields[2].GetUInt64();
+ tm* aTm_unban = localtime(&t_unban);
+ PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
+ fields[0].GetString(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
+ aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min,
+ fields[3].GetString(), fields[4].GetString());
+ }
+ }while( result->NextRow() );
+ SendSysMessage("===============================================================================");
+ }
delete result;
return true;
@@ -5012,37 +5415,111 @@ bool ChatHandler::HandleFlyModeCommand(const char* args)
bool ChatHandler::HandleLoadPDumpCommand(const char *args)
{
- if(!args)
+ if (!args)
return false;
- char * file = strtok((char*)args, " "); if(!file) return false;
- char * acc = strtok(NULL, " "); if(!acc) return false;
- if(!file || !acc)
+ char * file = strtok((char*)args, " ");
+ if(!file)
+ return false;
+
+ char * account = strtok(NULL, " ");
+ if(!account)
+ return false;
+
+ std::string account_name = account;
+ if(!AccountMgr::normilizeString(account_name))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
return false;
+ }
- uint32 account_id = accmgr.GetId(acc);
+ uint32 account_id = accmgr.GetId(account_name);
if(!account_id)
{
- account_id = atoi(acc);
- if(account_id)
+ account_id = atoi(account); // use original string
+ if(!account_id)
{
- std::string acc_name;
- if(!accmgr.GetName(account_id,acc_name))
- return false;
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
}
- else
+ }
+
+ if(!accmgr.GetName(account_id,account_name))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ char* guid_str = NULL;
+ char* name_str = strtok(NULL, " ");
+
+ std::string name;
+ if(name_str)
+ {
+ name = name_str;
+ // normalize the name if specified and check if it exists
+ if(!normalizePlayerName(name))
+ {
+ PSendSysMessage(LANG_INVALID_CHARACTER_NAME);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ if(!ObjectMgr::IsValidName(name,true))
+ {
+ PSendSysMessage(LANG_INVALID_CHARACTER_NAME);
+ SetSentErrorMessage(true);
return false;
- }
-
- char * name = strtok(NULL, " ");
- char * guid_str = name ? strtok(NULL, " ") : NULL;
-
- uint32 guid = guid_str ? atoi(guid_str) : 0;
-
- if(PlayerDumpReader().LoadDump(file, account_id, name ? name : "", guid))
- PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS);
- else
- PSendSysMessage(LANG_COMMAND_IMPORT_FAILED);
+ }
+
+ guid_str = strtok(NULL, " ");
+ }
+
+ uint32 guid = 0;
+
+ if(guid_str)
+ {
+ guid = atoi(guid_str);
+ if(!guid)
+ {
+ PSendSysMessage(LANG_INVALID_CHARACTER_GUID);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ if(objmgr.GetPlayerAccountIdByGUID(guid))
+ {
+ PSendSysMessage(LANG_CHARACTER_GUID_IN_USE,guid);
+ SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ switch(PlayerDumpReader().LoadDump(file, account_id, name, guid))
+ {
+ case DUMP_SUCCESS:
+ PSendSysMessage(LANG_COMMAND_IMPORT_SUCCESS);
+ break;
+ case DUMP_FILE_OPEN_ERROR:
+ PSendSysMessage(LANG_FILE_OPEN_FAIL,file);
+ SetSentErrorMessage(true);
+ return false;
+ case DUMP_FILE_BROKEN:
+ PSendSysMessage(LANG_DUMP_BROKEN,file);
+ SetSentErrorMessage(true);
+ return false;
+ case DUMP_TOO_MANY_CHARS:
+ PSendSysMessage(LANG_ACCOUNT_CHARACTER_LIST_FULL,account_name,account_id);
+ SetSentErrorMessage(true);
+ return false;
+ default:
+ PSendSysMessage(LANG_COMMAND_IMPORT_FAILED);
+ SetSentErrorMessage(true);
+ return false;
+ }
return true;
}
@@ -5086,10 +5563,27 @@ bool ChatHandler::HandleWritePDumpCommand(const char *args)
if(!guid)
guid = atoi(p2);
- if (PlayerDumpWriter().WriteDump(file, guid))
- PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS);
- else
- PSendSysMessage(LANG_COMMAND_EXPORT_FAILED);
+ if(!objmgr.GetPlayerAccountIdByGUID(guid))
+ {
+ PSendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ switch(PlayerDumpWriter().WriteDump(file, guid))
+ {
+ case DUMP_SUCCESS:
+ PSendSysMessage(LANG_COMMAND_EXPORT_SUCCESS);
+ break;
+ case DUMP_FILE_OPEN_ERROR:
+ PSendSysMessage(LANG_FILE_OPEN_FAIL,file);
+ SetSentErrorMessage(true);
+ return false;
+ default:
+ PSendSysMessage(LANG_COMMAND_EXPORT_FAILED);
+ SetSentErrorMessage(true);
+ return false;
+ }
return true;
}
@@ -5573,6 +6067,135 @@ bool ChatHandler::HandleInstanceSaveDataCommand(const char * /*args*/)
return true;
}
+/// Display the list of GMs
+bool ChatHandler::HandleGMListFullCommand(const char* /*args*/)
+{
+ ///- Get the accounts with GM Level >0
+ QueryResult *result = loginDatabase.Query( "SELECT username,gmlevel FROM account WHERE gmlevel > 0" );
+ if(result)
+ {
+ SendSysMessage(LANG_GMLIST);
+ SendSysMessage("========================");
+ SendSysMessage(LANG_GMLIST_HEADER);
+ SendSysMessage("========================");
+
+ ///- Circle through them. Display username and GM level
+ do
+ {
+ Field *fields = result->Fetch();
+ PSendSysMessage("|%15s|%6s|", fields[0].GetString(),fields[1].GetString());
+ } while( result->NextRow() );
+
+ PSendSysMessage("========================");
+ delete result;
+ }
+ else
+ PSendSysMessage(LANG_GMLIST_EMPTY);
+ return true;
+}
+
+/// Define the 'Message of the day' for the realm
+bool ChatHandler::HandleServerSetMotdCommand(const char* args)
+{
+ sWorld.SetMotd(args);
+ PSendSysMessage(LANG_MOTD_NEW, args);
+ return true;
+}
+
+/// Set/Unset the expansion level for an account
+bool ChatHandler::HandleAccountSetAddonCommand(const char* args)
+{
+ ///- Get the command line arguments
+ char *szAcc = strtok((char*)args," ");
+ char *szExp = strtok(NULL," ");
+
+ if(!szAcc)
+ return false;
+
+ std::string account_name;
+ uint32 account_id;
+
+ if(!szExp)
+ {
+ Player* player = getSelectedPlayer();
+ if(!player)
+ return false;
+
+ account_id = player->GetSession()->GetAccountId();
+ accmgr.GetName(account_id,account_name);
+ szExp = szAcc;
+ }
+ else
+ {
+ ///- Convert Account name to Upper Format
+ account_name = szAcc;
+ if(!AccountMgr::normilizeString(account_name))
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ account_id = accmgr.GetId(account_name);
+ if(!account_id)
+ {
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
+ }
+ }
+
+ int lev=atoi(szExp); //get int anyway (0 if error)
+ if(lev < 0)
+ return false;
+
+ // No SQL injection
+ loginDatabase.PExecute("UPDATE account SET expansion = '%d' WHERE id = '%u'",lev,account_id);
+ PSendSysMessage(LANG_ACCOUNT_SETADDON,account_name.c_str(),account_id,lev);
+ return true;
+}
+
+/// Send a message to a player in game
+bool ChatHandler::HandleSendMessageCommand(const char* args)
+{
+ ///- Get the command line arguments
+ char* name_str = strtok((char*)args, " ");
+ char* msg_str = strtok(NULL, "");
+
+ if(!name_str || !msg_str)
+ return false;
+
+ std::string name = name_str;
+
+ if(!normalizePlayerName(name))
+ return false;
+
+ ///- Find the player and check that he is not logging out.
+ Player *rPlayer = objmgr.GetPlayer(name.c_str());
+ if(!rPlayer)
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ if(rPlayer->GetSession()->isLogingOut())
+ {
+ SendSysMessage(LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ ///- Send the message
+ //Use SendAreaTriggerMessage for fastest delivery.
+ rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg_str);
+ rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
+
+ //Confirmation message
+ PSendSysMessage(LANG_SENDMESSAGE,name.c_str(),msg_str);
+ return true;
+}
+
bool ChatHandler::HandleFreezeCommand(const char *args)
{
std::string name;
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 6567b4716bd..e1bc3dfcfef 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -680,6 +680,7 @@ class ObjectMgr
}
const char *GetTrinityString(int32 entry, int locale_idx) const;
const char *GetTrinityStringForDBCLocale(int32 entry) const { return GetTrinityString(entry,DBCLocaleIndex); }
+ int32 GetDBCLocaleIndex() const { return DBCLocaleIndex; }
void SetDBCLocaleIndex(uint32 lang) { DBCLocaleIndex = GetIndexForLocale(LocaleConstant(lang)); }
void AddCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_guid, uint32 instance);
diff --git a/src/game/PlayerDump.cpp b/src/game/PlayerDump.cpp
index e6f68122f9b..78f90bc9c9e 100644
--- a/src/game/PlayerDump.cpp
+++ b/src/game/PlayerDump.cpp
@@ -26,7 +26,7 @@
#include "ObjectMgr.h"
// Character Dump tables
-#define DUMP_TABLE_COUNT 20
+#define DUMP_TABLE_COUNT 19
struct DumpTable
{
@@ -258,11 +258,8 @@ void StoreGUID(QueryResult *result,uint32 data,uint32 field, std::set<uint32>& g
}
// Writing - High-level functions
-bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type)
+void PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type)
{
- if (!tableFrom || !tableTo)
- return false;
-
GUIDs const* guids = NULL;
char const* fieldname = NULL;
@@ -280,7 +277,7 @@ bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tabl
// for guid set stop if set is empty
if(guids && guids->empty())
- return true; // nothing to do
+ return; // nothing to do
// setup for guids case start position
GUIDs::const_iterator guids_itr;
@@ -298,7 +295,7 @@ bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tabl
QueryResult *result = CharacterDatabase.PQuery("SELECT * FROM %s WHERE %s", tableFrom, wherestr.c_str());
if(!result)
- return false;
+ return;
do
{
@@ -328,8 +325,6 @@ bool PlayerDumpWriter::DumpTable(std::string& dump, uint32 guid, char const*tabl
delete result;
}
while(guids && guids_itr != guids->end()); // not set case iterate single time, set case iterate for all guids
-
- return true;
}
std::string PlayerDumpWriter::GetDump(uint32 guid)
@@ -338,28 +333,29 @@ std::string PlayerDumpWriter::GetDump(uint32 guid)
for(int i = 0; i < DUMP_TABLE_COUNT; i++)
DumpTable(dump, guid, dumpTables[i].name, dumpTables[i].name, dumpTables[i].type);
- // TODO: Add instance/group/gifts..
+ // TODO: Add instance/group..
// TODO: Add a dump level option to skip some non-important tables
return dump;
}
-bool PlayerDumpWriter::WriteDump(std::string file, uint32 guid)
+DumpReturn PlayerDumpWriter::WriteDump(std::string file, uint32 guid)
{
FILE *fout = fopen(file.c_str(), "w");
- if (!fout) { sLog.outError("Failed to open file!\r\n"); return false; }
+ if (!fout)
+ return DUMP_FILE_OPEN_ERROR;
std::string dump = GetDump(guid);
fprintf(fout,"%s\n",dump.c_str());
fclose(fout);
- return true;
+ return DUMP_SUCCESS;
}
// Reading - High-level functions
-#define ROLLBACK {CharacterDatabase.RollbackTransaction(); fclose(fin); return false;}
+#define ROLLBACK(DR) {CharacterDatabase.RollbackTransaction(); fclose(fin); return (DR);}
-bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string name, uint32 guid)
+DumpReturn PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string name, uint32 guid)
{
// check character count
{
@@ -372,13 +368,12 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
delete result;
if (charcount >= 10)
- {
- return false;
- }
+ return DUMP_TOO_MANY_CHARS;
}
}
FILE *fin = fopen(file.c_str(), "r");
- if(!fin) return false;
+ if(!fin)
+ return DUMP_FILE_OPEN_ERROR;
QueryResult * result = NULL;
char newguid[20], chraccount[20], newpetid[20], currpetid[20], lastpetid[20];
@@ -434,8 +429,7 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
if(!fgets(buf, 32000, fin))
{
if(feof(fin)) break;
- sLog.outError("LoadPlayerDump: File read error!");
- ROLLBACK;
+ ROLLBACK(DUMP_FILE_BROKEN);
}
std::string line; line.assign(buf);
@@ -449,7 +443,7 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
if(tn.empty())
{
sLog.outError("LoadPlayerDump: Can't extract table name from line: '%s'!", line.c_str());
- ROLLBACK;
+ ROLLBACK(DUMP_FILE_BROKEN);
}
DumpTableType type;
@@ -466,27 +460,37 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
if (i == DUMP_TABLE_COUNT)
{
sLog.outError("LoadPlayerDump: Unknown table: '%s'!", tn.c_str());
- ROLLBACK;
+ ROLLBACK(DUMP_FILE_BROKEN);
}
// change the data to server values
switch(type)
{
case DTT_CHAR_TABLE:
- if(!changenth(line, 1, newguid)) ROLLBACK;
+ if(!changenth(line, 1, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
case DTT_CHARACTER: // character t.
{
- if(!changenth(line, 1, newguid)) ROLLBACK;
+ if(!changenth(line, 1, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
// guid, data field:guid, items
- if(!changenth(line, 2, chraccount)) ROLLBACK;
+ if(!changenth(line, 2, chraccount))
+ ROLLBACK(DUMP_FILE_BROKEN);
+
std::string vals = getnth(line, 3);
- if(!changetoknth(vals, OBJECT_FIELD_GUID+1, newguid)) ROLLBACK;
+ if(!changetoknth(vals, OBJECT_FIELD_GUID+1, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+
for(uint16 field = PLAYER_FIELD_INV_SLOT_HEAD; field < PLAYER_FARSIGHT; field++)
- if(!changetokGuid(vals, field+1, items, objmgr.m_hiItemGuid, true)) ROLLBACK;
- if(!changenth(line, 3, vals.c_str())) ROLLBACK;
+ if(!changetokGuid(vals, field+1, items, objmgr.m_hiItemGuid, true))
+ ROLLBACK(DUMP_FILE_BROKEN);
+
+ if(!changenth(line, 3, vals.c_str()))
+ ROLLBACK(DUMP_FILE_BROKEN);
+
if (name == "")
{
// check if the original name already exists
@@ -498,38 +502,51 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
{
delete result;
// rename on login: `at_login` field 30 in raw field list
- if(!changenth(line, 30, "1")) ROLLBACK;
+ if(!changenth(line, 30, "1"))
+ ROLLBACK(DUMP_FILE_BROKEN);
}
}
- else if(!changenth(line, 4, name.c_str())) ROLLBACK;
+ else if(!changenth(line, 4, name.c_str()))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
case DTT_INVENTORY: // character_inventory t.
{
- if(!changenth(line, 1, newguid)) ROLLBACK;
+ if(!changenth(line, 1, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
// bag, item
- if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid, true)) ROLLBACK;
- if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid)) ROLLBACK;
+ if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid, true))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changeGuid(line, 4, items, objmgr.m_hiItemGuid))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
case DTT_ITEM: // item_instance t.
{
// item, owner, data field:item, owner guid
- if(!changeGuid(line, 1, items, objmgr.m_hiItemGuid)) ROLLBACK;
- if(!changenth(line, 2, newguid)) ROLLBACK;
+ if(!changeGuid(line, 1, items, objmgr.m_hiItemGuid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changenth(line, 2, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+
std::string vals = getnth(line,3);
- if(!changetokGuid(vals, OBJECT_FIELD_GUID+1, items, objmgr.m_hiItemGuid)) ROLLBACK;
- if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid)) ROLLBACK;
- if(!changenth(line, 3, vals.c_str())) ROLLBACK;
+ if(!changetokGuid(vals, OBJECT_FIELD_GUID+1, items, objmgr.m_hiItemGuid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changetoknth(vals, ITEM_FIELD_OWNER+1, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changenth(line, 3, vals.c_str()))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
case DTT_ITEM_GIFT: // character_gift
{
// guid,item_guid,
- if(!changenth(line, 1, newguid)) ROLLBACK;
- if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) ROLLBACK;
+ if(!changenth(line, 1, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
case DTT_PET: // character_pet t
@@ -551,8 +568,10 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
}
// item, entry, owner, ...
- if(!changenth(line, 1, newpetid)) ROLLBACK;
- if(!changenth(line, 3, newguid)) ROLLBACK;
+ if(!changenth(line, 1, newpetid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changenth(line, 3, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
@@ -562,27 +581,34 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
// lookup currpetid and match to new inserted pet id
std::map<uint32, uint32> :: const_iterator petids_iter = petids.find(atoi(currpetid));
- if(petids_iter == petids.end()) ROLLBACK; // couldn't find new inserted id
+ if(petids_iter == petids.end()) // couldn't find new inserted id
+ ROLLBACK(DUMP_FILE_BROKEN);
snprintf(newpetid, 20, "%d", petids_iter->second);
- if(!changenth(line, 1, newpetid)) ROLLBACK;
+ if(!changenth(line, 1, newpetid))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
case DTT_MAIL: // mail
{
// id,messageType,stationery,sender,receiver
- if(!changeGuid(line, 1, mails, objmgr.m_mailid)) ROLLBACK;
- if(!changenth(line, 5, newguid)) ROLLBACK;
+ if(!changeGuid(line, 1, mails, objmgr.m_mailid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changenth(line, 5, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
case DTT_MAIL_ITEM: // mail_items
{
// mail_id,item_guid,item_template,receiver
- if(!changeGuid(line, 1, mails, objmgr.m_mailid)) ROLLBACK;
- if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid)) ROLLBACK;
- if(!changenth(line, 4, newguid)) ROLLBACK;
+ if(!changeGuid(line, 1, mails, objmgr.m_mailid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changeGuid(line, 2, items, objmgr.m_hiItemGuid))
+ ROLLBACK(DUMP_FILE_BROKEN);
+ if(!changenth(line, 4, newguid))
+ ROLLBACK(DUMP_FILE_BROKEN);
break;
}
default:
@@ -590,7 +616,8 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
break;
}
- if(!CharacterDatabase.Execute(line.c_str())) ROLLBACK;
+ if(!CharacterDatabase.Execute(line.c_str()))
+ ROLLBACK(DUMP_FILE_BROKEN);
}
CharacterDatabase.CommitTransaction();
@@ -603,5 +630,5 @@ bool PlayerDumpReader::LoadDump(std::string file, uint32 account, std::string na
fclose(fin);
- return true;
+ return DUMP_SUCCESS;
}
diff --git a/src/game/PlayerDump.h b/src/game/PlayerDump.h
index 6f5b6eed1e7..af5462e1fd6 100644
--- a/src/game/PlayerDump.h
+++ b/src/game/PlayerDump.h
@@ -73,6 +73,15 @@ enum DumpTableType
DTT_ITEM_TEXT, // <- item_text // item_text
};
+enum DumpReturn
+{
+ DUMP_SUCCESS,
+ DUMP_FILE_OPEN_ERROR,
+ DUMP_TOO_MANY_CHARS,
+ DUMP_UNEXPECTED_END,
+ DUMP_FILE_BROKEN,
+};
+
class PlayerDump
{
protected:
@@ -85,11 +94,11 @@ class PlayerDumpWriter : public PlayerDump
PlayerDumpWriter() {}
std::string GetDump(uint32 guid);
- bool WriteDump(std::string file, uint32 guid);
+ DumpReturn WriteDump(std::string file, uint32 guid);
private:
typedef std::set<uint32> GUIDs;
- bool DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type);
+ void DumpTable(std::string& dump, uint32 guid, char const*tableFrom, char const*tableTo, DumpTableType type);
std::string GenerateWhereStr(char const* field, GUIDs const& guids, GUIDs::const_iterator& itr);
std::string GenerateWhereStr(char const* field, uint32 guid);
@@ -104,7 +113,7 @@ class PlayerDumpReader : public PlayerDump
public:
PlayerDumpReader() {}
- bool LoadDump(std::string file, uint32 account, std::string name, uint32 guid);
+ DumpReturn LoadDump(std::string file, uint32 account, std::string name, uint32 guid);
};
#endif
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index f950a9ceb6c..26cd729f887 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -2167,4 +2167,20 @@ enum ResponseCodes
CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x59,
CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x5A,
};
+
+/// Ban function modes
+enum BanMode
+{
+ BAN_ACCOUNT,
+ BAN_CHARACTER,
+ BAN_IP
+};
+
+/// Ban function return codes
+enum BanReturn
+{
+ BAN_SUCCESS,
+ BAN_SYNTAX_ERROR,
+ BAN_NOTFOUND
+};
#endif
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 8bdea8996ec..de89643257f 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -2264,45 +2264,43 @@ bool World::KickPlayer(std::string playerName)
}
/// Ban an account or ban an IP address, duration will be parsed using TimeStringToSecs if it is positive, otherwise permban
-uint8 World::BanAccount(std::string type, std::string nameOrIP, std::string duration, std::string reason, std::string author)
+BanReturn World::BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author)
{
loginDatabase.escape_string(nameOrIP);
loginDatabase.escape_string(reason);
std::string safe_author=author;
loginDatabase.escape_string(safe_author);
- if(type != "ip" && !normalizePlayerName(nameOrIP))
- return BAN_NOTFOUND; // Nobody to ban
-
uint32 duration_secs = TimeStringToSecs(duration);
QueryResult *resultAccounts = NULL; //used for kicking
///- Update the database with ban information
-
- if(type=="ip")
- {
- //No SQL injection as strings are escaped
- resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str());
- loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str());
+ switch(mode)
+ {
+ case BAN_IP:
+ //No SQL injection as strings are escaped
+ resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE last_ip = '%s'",nameOrIP.c_str());
+ loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+%u,'%s','%s')",nameOrIP.c_str(),duration_secs,safe_author.c_str(),reason.c_str());
+ break;
+ case BAN_ACCOUNT:
+ //No SQL injection as string is escaped
+ resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str());
+ break;
+ case BAN_CHARACTER:
+ //No SQL injection as string is escaped
+ resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str());
+ break;
+ default:
+ return BAN_SYNTAX_ERROR;
}
- else if(type=="account")
- {
- //No SQL injection as string is escaped
- resultAccounts = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",nameOrIP.c_str());
- }
- else if(type=="character")
- {
- //No SQL injection as string is escaped
- resultAccounts = CharacterDatabase.PQuery("SELECT account FROM characters WHERE name = '%s'",nameOrIP.c_str());
- }
- else
- return BAN_SYNTAX_ERROR; //Syntax problem
-
- if(!resultAccounts)
- if(type=="ip")
- return BAN_SUCCESS; // ip correctly banned but nobody affected (yet)
- else
- return BAN_NOTFOUND; // Nobody to ban
+
+ if(!resultAccounts)
+ {
+ if(mode==BAN_IP)
+ return BAN_SUCCESS;
+ else
+ return BAN_NOTFOUND; // Nobody to ban
+ }
///- Disconnect all affected players (for IP it can be several)
do
@@ -2310,13 +2308,14 @@ uint8 World::BanAccount(std::string type, std::string nameOrIP, std::string dura
Field* fieldsAccount = resultAccounts->Fetch();
uint32 account = fieldsAccount->GetUInt32();
- if(type != "ip")
+ if(mode!=BAN_IP)
+ {
//No SQL injection as strings are escaped
loginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+%u, '%s', '%s', '1')",
account,duration_secs,safe_author.c_str(),reason.c_str());
+ }
- WorldSession* sess = FindSession(account);
- if( sess )
+ if (WorldSession* sess = FindSession(account))
if(std::string(sess->GetPlayerName()) != author)
sess->KickPlayer();
}
@@ -2327,9 +2326,9 @@ uint8 World::BanAccount(std::string type, std::string nameOrIP, std::string dura
}
/// Remove a ban from an account or IP address
-bool World::RemoveBanAccount(std::string type, std::string nameOrIP)
+bool World::RemoveBanAccount(BanMode mode, std::string nameOrIP)
{
- if(type == "ip")
+ if (mode == BAN_IP)
{
loginDatabase.escape_string(nameOrIP);
loginDatabase.PExecute("DELETE FROM ip_banned WHERE ip = '%s'",nameOrIP.c_str());
@@ -2337,20 +2336,11 @@ bool World::RemoveBanAccount(std::string type, std::string nameOrIP)
else
{
uint32 account=0;
- if(type == "account")
- {
- if (!AccountMgr::normilizeString (nameOrIP))
- return false;
-
+ if (mode == BAN_ACCOUNT)
account = accmgr.GetId (nameOrIP);
- }
- else if(type == "character")
- {
- if(!normalizePlayerName(nameOrIP))
- return false;
-
+ else if (mode == BAN_CHARACTER)
account = objmgr.GetPlayerAccountIdByPlayerName (nameOrIP);
- }
+
if(!account)
return false;
@@ -2503,20 +2493,24 @@ void World::UpdateSessions( time_t diff )
// This handles the issued and queued CLI commands
void World::ProcessCliCommands()
{
- if (cliCmdQueue.empty()) return;
+ if (cliCmdQueue.empty())
+ return;
- CliCommandHolder *command;
- pPrintf p_zprintf;
+ CliCommandHolder::Print* zprint;
while (!cliCmdQueue.empty())
{
sLog.outDebug("CLI command under processing...");
- command = cliCmdQueue.next();
- command->Execute();
- p_zprintf=command->GetOutputMethod();
+ CliCommandHolder *command = cliCmdQueue.next();
+
+ zprint = command->m_print;
+
+ CliHandler(zprint).ParseCommands(command->m_command);
+
delete command;
}
+
// print the console message here so it looks right
- p_zprintf("TC> ");
+ zprint("TC> ");
}
void World::InitResultQueue()
diff --git a/src/game/World.h b/src/game/World.h
index 764c442d5a3..26746fa71de 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -28,6 +28,7 @@
#include "Common.h"
#include "Timer.h"
#include "Policies/Singleton.h"
+#include "SharedDefines.h"
#include <map>
#include <set>
@@ -40,7 +41,6 @@ class Player;
class Weather;
struct ScriptAction;
struct ScriptInfo;
-class CliCommandHolder;
class SqlResultQueue;
class QueryResult;
class WorldSocket;
@@ -296,14 +296,6 @@ enum RealmZone
REALM_ZONE_CN9 = 29 // basic-Latin at create, any at login
};
-/// Ban function return codes
-enum BanReturn
-{
- BAN_SUCCESS,
- BAN_SYNTAX_ERROR,
- BAN_NOTFOUND
-};
-
// DB scripting commands
#define SCRIPT_COMMAND_TALK 0 // source = unit, target=any, datalong ( 0=say, 1=whisper, 2=yell, 3=emote text)
#define SCRIPT_COMMAND_EMOTE 1 // source = unit, datalong = anim_id
@@ -321,37 +313,23 @@ enum BanReturn
#define SCRIPT_COMMAND_REMOVE_AURA 14 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id
#define SCRIPT_COMMAND_CAST_SPELL 15 // source (datalong2!=0) or target (datalong==0) unit, datalong = spell_id
-/// CLI related stuff, define here to prevent cyclic dependancies
+/// Storage class for commands issued for delayed execution
+struct CliCommandHolder
+{
+ typedef void Print(const char*);
-typedef int(* pPrintf)(const char*,...);
-typedef void(* pCliFunc)(char *,pPrintf);
+ char *m_command;
+ Print* m_print;
-/// Command Template class
-struct CliCommand
-{
- char const * cmd;
- pCliFunc Func;
- char const * description;
-};
+ CliCommandHolder(const char *command, Print* zprint)
+ : m_print(zprint)
+ {
+ size_t len = strlen(command)+1;
+ m_command = new char[len];
+ memcpy(m_command, command, len);
+ }
-/// Storage class for commands issued for delayed execution
-class CliCommandHolder
-{
- private:
- const CliCommand *cmd;
- char *args;
- pPrintf m_zprintf;
- public:
- CliCommandHolder(const CliCommand *command, const char *arguments, pPrintf p_zprintf)
- : cmd(command), m_zprintf(p_zprintf)
- {
- size_t len = strlen(arguments)+1;
- args = new char[len];
- memcpy(args, arguments, len);
- }
- ~CliCommandHolder() { delete[] args; }
- void Execute() const { cmd->Func(args, m_zprintf); }
- pPrintf GetOutputMethod() const {return (m_zprintf);}
+ ~CliCommandHolder() { delete[] m_command; }
};
/// The World
@@ -474,8 +452,8 @@ class World
void KickAll();
void KickAllLess(AccountTypes sec);
void KickAllQueued();
- uint8 BanAccount(std::string type, std::string nameOrIP, std::string duration, std::string reason, std::string author);
- bool RemoveBanAccount(std::string type, std::string nameOrIP);
+ BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author);
+ bool RemoveBanAccount(BanMode mode, std::string nameOrIP);
void ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo> > const& scripts, uint32 id, Object* source, Object* target);
void ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* source, Object* target);
@@ -492,7 +470,7 @@ class World
static float GetVisibleObjectGreyDistance() { return m_VisibleObjectGreyDistance; }
void ProcessCliCommands();
- void QueueCliCommand(CliCommandHolder* command) { cliCmdQueue.add(command); }
+ void QueueCliCommand( CliCommandHolder::Print* zprintf, char const* input ) { cliCmdQueue.add(new CliCommandHolder(input, zprintf)); }
void UpdateResultQueue();
void InitResultQueue();
diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp
index 9583df10cb1..7d9e2a365ac 100644
--- a/src/game/WorldSession.cpp
+++ b/src/game/WorldSession.cpp
@@ -466,7 +466,7 @@ void WorldSession::SendNotification(int32 string_id,...)
}
}
-const char * WorldSession::GetTrinityString( int32 entry )
+const char * WorldSession::GetTrinityString( int32 entry ) const
{
return objmgr.GetTrinityString(entry,GetSessionDbLocaleIndex());
}
diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h
index 346184f6a24..fc3866868cd 100644
--- a/src/game/WorldSession.h
+++ b/src/game/WorldSession.h
@@ -194,9 +194,9 @@ class TRINITY_DLL_SPEC WorldSession
time_t m_muteTime;
// Locales
- LocaleConstant GetSessionDbcLocale() { return m_sessionDbcLocale; }
- int GetSessionDbLocaleIndex() { return m_sessionDbLocaleIndex; }
- const char *GetTrinityString(int32 entry);
+ LocaleConstant GetSessionDbcLocale() const { return m_sessionDbcLocale; }
+ int GetSessionDbLocaleIndex() const { return m_sessionDbLocaleIndex; }
+ const char *GetTrinityString(int32 entry) const;
uint32 GetLatency() const { return m_latency; }
void SetLatency(uint32 latency) { m_latency = latency; }
diff --git a/src/shared/Common.h b/src/shared/Common.h
index 96071437931..34a35800ad2 100644
--- a/src/shared/Common.h
+++ b/src/shared/Common.h
@@ -169,7 +169,8 @@ enum AccountTypes
SEC_PLAYER = 0,
SEC_MODERATOR = 1,
SEC_GAMEMASTER = 2,
- SEC_ADMINISTRATOR = 3
+ SEC_ADMINISTRATOR = 3,
+ SEC_CONSOLE = 4 // must be always last in list, accounts must have less security level always also
};
enum LocaleConstant
diff --git a/src/trinitycore/CliRunnable.cpp b/src/trinitycore/CliRunnable.cpp
index 33544435e3b..9c464fde9ef 100644
--- a/src/trinitycore/CliRunnable.cpp
+++ b/src/trinitycore/CliRunnable.cpp
@@ -27,7 +27,6 @@
#include "Log.h"
#include "World.h"
#include "ScriptCalls.h"
-#include "GlobalEvents.h"
#include "ObjectMgr.h"
#include "WorldSession.h"
#include "SystemConfig.h"
@@ -36,254 +35,109 @@
#include "AccountMgr.h"
#include "CliRunnable.h"
#include "MapManager.h"
-#include "PlayerDump.h"
#include "Player.h"
+#include "Chat.h"
-//CliCommand and CliCommandHolder are defined in World.h to avoid cyclic deps
-
-//func prototypes must be defined
-
-void CliHelp(char*,pPrintf);
-void CliInfo(char*,pPrintf);
-void CliBan(char*,pPrintf);
-void CliBanList(char*,pPrintf);
-void CliRemoveBan(char*,pPrintf);
-void CliSetGM(char*,pPrintf);
-void CliListGM(char*,pPrintf);
-void CliVersion(char*,pPrintf);
-void CliExit(char*,pPrintf);
-void CliIdleRestart(char*,pPrintf zprintf);
-void CliRestart(char*,pPrintf zprintf);
-void CliIdleShutdown(char*,pPrintf zprintf);
-void CliShutdown(char*,pPrintf zprintf);
-void CliBroadcast(char*,pPrintf);
-void CliCreate(char*,pPrintf);
-void CliDelete(char*,pPrintf);
-void CliCharDelete(char *,pPrintf);
-void CliLoadScripts(char*,pPrintf);
-void CliKick(char*,pPrintf);
-void CliTele(char*,pPrintf);
-void CliMotd(char*,pPrintf);
-void CliCorpses(char*,pPrintf);
-void CliSetLogLevel(char*,pPrintf);
-void CliUpTime(char*,pPrintf);
-void CliSetAddon(char*,pPrintf);
-void CliWritePlayerDump(char*,pPrintf);
-void CliLoadPlayerDump(char*,pPrintf);
-void CliSave(char*,pPrintf);
-void CliSend(char*,pPrintf);
-void CliPLimit(char*,pPrintf);
-void CliSetPassword(char*,pPrintf);
-/// Table of known commands
-const CliCommand Commands[]=
+void utf8print(const char* str)
{
- {"help", & CliHelp,"Display this help message"},
- {"broadcast", & CliBroadcast,"Announce in-game message"},
- {"create", & CliCreate,"Create account"},
- {"delete", & CliDelete,"Delete account and characters"},
- {"chardelete", & CliCharDelete,"Delete character"},
- {"info", & CliInfo,"Display Server infomation"},
- {"uptime", & CliUpTime, "Displays the server uptime"},
- {"motd", & CliMotd,"Change or display motd"},
- {"kick", & CliKick,"Kick user"},
- {"ban", & CliBan,"Ban account|ip"},
- {"listbans", & CliBanList,"List bans"},
- {"unban", & CliRemoveBan,"Remove ban from account|ip"},
- {"setgm", & CliSetGM,"Edit user privileges"},
- {"setpass", & CliSetPassword,"Set password for account"},
- {"setaddon", & CliSetAddon,"Set user expansion addon level allowed"},
- {"listgm", & CliListGM,"Display user privileges"},
- {"loadscripts", & CliLoadScripts,"Load script library"},
- {"setloglevel", & CliSetLogLevel,"Set Log Level"},
- {"corpses", & CliCorpses,"Manually call corpses erase global even code"},
- {"version", & CliVersion,"Display server version"},
- {"idlerestart", & CliIdleRestart,"Restart server with some delay when there are no active connections remaining"},
- {"restart", & CliRestart,"Restart server with some delay"},
- {"idleshutdown", & CliIdleShutdown,"Shutdown server with some delay when there are no active connections remaining"},
- {"shutdown", & CliShutdown,"Shutdown server with some delay"},
- {"exit", & CliExit,"Shutdown server NOW"},
- {"writepdump", &CliWritePlayerDump,"Write a player dump to a file"},
- {"loadpdump", &CliLoadPlayerDump,"Load a player dump from a file"},
- {"saveall", &CliSave,"Save all players"},
- {"send", &CliSend,"Send message to a player"},
- {"tele", &CliTele,"Teleport player to location"},
- {"plimit", &CliPLimit,"Show or set player login limitations"}
-};
-/// \todo Need some pragma pack? Else explain why in a comment.
-#define CliTotalCmds sizeof(Commands)/sizeof(CliCommand)
-
#if PLATFORM == PLATFORM_WINDOWS
-int utf8printf(const char* str,...)
-{
- UTF8PRINTF(stdout,str,1);
- return 0;
-}
#define UTF8ZPRINTF utf8printf
+ wchar_t wtemp_buf[6000];
+ size_t wtemp_len = 6000-1;
+ if(!Utf8toWStr(str,strlen(str),wtemp_buf,wtemp_len))
+ return;
+
+ char temp_buf[6000];
+ CharToOemBuffW(&wtemp_buf[0],&temp_buf[0],wtemp_len+1);
+ printf(temp_buf);
#else
-#define UTF8ZPRINTF printf
+ printf(str);
#endif
+}
-/// Create a character dump file
-void CliWritePlayerDump(char*command,pPrintf zprintf)
+/// Delete a user account and all associated characters in this realm
+/// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm, delete account chars in realm then delete account
+bool ChatHandler::HandleAccountDeleteCommand(const char* args)
{
- char * file = strtok(command, " ");
- char * p2 = strtok(NULL, " ");
- if(!file || !p2)
- {
- zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n");
- return;
- }
-
- std::string name;
- if(!consoleToUtf8(p2,name)) // convert from console encoding to utf8
- return;
-
- if(!normalizePlayerName(name))
- {
- zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n");
- return;
- }
-
- uint32 guid = objmgr.GetPlayerGUIDByName(name);
- if(!guid)
- guid = atoi(p2);
-
- if(!guid)
- {
- zprintf("Syntax is: writepdump $filename $playerNameOrGUID\r\n");
- return;
- }
+ if(!*args)
+ return false;
- PlayerDumpWriter().WriteDump(file, guid);
-}
+ ///- Get the account name from the command line
+ char *account_name_str=strtok ((char*)args," ");
+ if (!account_name_str)
+ return false;
-/// Load a character from a dump file
-void CliLoadPlayerDump(char*command,pPrintf zprintf)
-{
- char * file = strtok(command, " ");
- char * acc = strtok(NULL, " ");
- if (!file ||!acc)
+ std::string account_name = account_name_str;
+ if(!AccountMgr::normilizeString(account_name))
{
- zprintf("Syntax is: loadpdump $filename $account ($newname) ($newguid)\r\n");
- return;
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
}
- uint32 account_id = accmgr.GetId(acc);
+ uint32 account_id = accmgr.GetId(account_name);
if(!account_id)
{
- account_id = atoi(acc);
- if(account_id)
- {
- std::string acc_name;
- if(!accmgr.GetName(account_id,acc_name))
- {
- zprintf("Failed to load the character! Account not exist.\r\n");
- return;
- }
- }
- else
- {
- zprintf("Failed to load the character! Account not exist.\r\n");
- return;
- }
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
}
- char * name_str = strtok(NULL, " ");
- char * guid_str = name_str ? strtok(NULL, " ") : NULL;
-
- uint32 guid = guid_str ? atoi(guid_str) : 0;
-
- std::string name;
- if(name_str)
+ /// Commands not recommended call from chat, but support anyway
+ if(m_session)
{
- if(!consoleToUtf8(name_str,name)) // convert from console encoding to utf8
- return;
+ uint32 targetSecurity = accmgr.GetSecurity(account_id);
- if(!normalizePlayerName(name))
+ /// can delete only for account with less security
+ /// This is also reject self apply in fact
+ if (targetSecurity >= m_session->GetSecurity())
{
- zprintf("Syntax is: loadpdump $filename $account ($newname) ($newguid)\r\n");
- return;
+ SendSysMessage (LANG_YOURS_SECURITY_IS_LOW);
+ SetSentErrorMessage (true);
+ return false;
}
}
- if(PlayerDumpReader().LoadDump(file, account_id, name, guid))
- zprintf("Character loaded successfully!\r\n");
- else
- zprintf("Failed to load the character!\r\n");
-}
-
-/// Reload the scripts and notify the players
-void CliLoadScripts(char*command,pPrintf zprintf)
-{
- char const *del=strtok(command," ");
- if (!del)
- del="";
- if(!LoadScriptingModule(del)) // Error report is already done by LoadScriptingModule
- return;
-
- sWorld.SendWorldText(LANG_SCRIPTS_RELOADED);
-}
-
-/// Delete a user account and all associated characters in this realm
-/// \todo This function has to be enhanced to respect the login/realm split (delete char, delete account chars in realm, delete account chars in realm then delete account
-void CliDelete(char*command,pPrintf zprintf)
-{
- ///- Get the account name from the command line
- char *account_name_str=strtok(command," ");
- if(!account_name_str)
- {
- // \r\n is used because this function can also be called from RA
- zprintf("Syntax is: delete $account\r\n");
- return;
- }
-
- std::string account_name;
- if(!consoleToUtf8(account_name_str,account_name)) // convert from console encoding to utf8
- return;
-
- AccountOpResult result = accmgr.DeleteAccount(accmgr.GetId(account_name));
+ AccountOpResult result = accmgr.DeleteAccount(account_id);
switch(result)
{
case AOR_OK:
- zprintf("We deleted account: %s\r\n",account_name.c_str());
+ PSendSysMessage(LANG_ACCOUNT_DELETED,account_name.c_str());
break;
case AOR_NAME_NOT_EXIST:
- zprintf("User %s does not exist\r\n",account_name.c_str());
- break;
+ PSendSysMessage(LANG_ACCOUNT_NOT_EXIST,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
case AOR_DB_INTERNAL_ERROR:
- zprintf("User %s NOT deleted (probably sql file format was updated)\r\n",account_name.c_str());
- break;
+ PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
default:
- zprintf("User %s NOT deleted (unknown error)\r\n",account_name.c_str());
- break;
+ PSendSysMessage(LANG_ACCOUNT_NOT_DELETED,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
}
+
+ return true;
}
-void CliCharDelete(char*command,pPrintf zprintf)
+bool ChatHandler::HandleCharacterDeleteCommand(const char* args)
{
- char *character_name_str = strtok(command," ");
+ if(!*args)
+ return false;
+ char *character_name_str = strtok((char*)args," ");
if(!character_name_str)
- {
- zprintf("Syntax is: chardelete $character_name\r\n");
- return;
- }
-
- std::string character_name;
- if(!consoleToUtf8(character_name_str,character_name)) // convert from console encoding to utf8
- return;
+ return false;
+ std::string character_name = character_name_str;
if(!normalizePlayerName(character_name))
- {
- zprintf("Syntax is: chardelete $character_name\r\n");
- return;
- }
-
- Player *player = objmgr.GetPlayer(character_name.c_str());
+ return false;
uint64 character_guid;
uint32 account_id;
+ Player *player = objmgr.GetPlayer(character_name.c_str());
if(player)
{
character_guid = player->GetGUID();
@@ -295,185 +149,42 @@ void CliCharDelete(char*command,pPrintf zprintf)
character_guid = objmgr.GetPlayerGUIDByName(character_name);
if(!character_guid)
{
- zprintf("Player %s not found!\r\n",character_name.c_str());
- return;
+ PSendSysMessage(LANG_NO_PLAYER,character_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
}
account_id = objmgr.GetPlayerAccountIdByGUID(character_guid);
}
- Player::DeleteFromDB(character_guid, account_id, true);
- zprintf("Player %s (Guid: %u AccountId: %u) deleted\r\n",character_name.c_str(),GUID_LOPART(character_guid),account_id);
-}
-
-/// Broadcast a message to the World
-void CliBroadcast(char *text,pPrintf zprintf)
-{
- std::string textUtf8;
- if(!consoleToUtf8(text,textUtf8)) // convert from console encoding to utf8
- return;
+ std::string account_name;
+ accmgr.GetName (account_id,account_name);
- sWorld.SendWorldText(LANG_SYSTEMMESSAGE,textUtf8.c_str());
- zprintf("Broadcasting to the world: %s\r\n",textUtf8.c_str());
-}
-
-/// Print the list of commands and associated description
-void CliHelp(char*,pPrintf zprintf)
-{
- for (unsigned int x=0;x<CliTotalCmds;x++)
- zprintf("%-13s - %s.\r\n",Commands[x].cmd ,Commands[x].description);
+ Player::DeleteFromDB(character_guid, account_id, true);
+ PSendSysMessage(LANG_CHARACTER_DELETED,character_name.c_str(),GUID_LOPART(character_guid),account_name.c_str(), account_id);
+ return true;
}
/// Exit the realm
-void CliExit(char*,pPrintf zprintf)
+bool ChatHandler::HandleServerExitCommand(const char* args)
{
- zprintf( "Exiting daemon...\r\n" );
+ SendSysMessage(LANG_COMMAND_EXIT);
World::m_stopEvent = true;
-}
-
-/// Restart the server (with some delay) as soon as no active connections remain on the server
-void CliIdleRestart(char* command,pPrintf zprintf)
-{
- char *args = strtok(command," ");
-
- if(!args)
- {
- zprintf("Syntax is: idlerestart $seconds|cancel\r\n");
- return;
- }
-
- if(std::string(args)=="cancel")
- {
- sWorld.ShutdownCancel();
- }
- else
- {
-
- uint32 time = atoi(args);
-
- ///- Prevent interpret wrong arg value as 0 secs shutdown time
- if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
- {
- zprintf("Syntax is: idlerestart $seconds|cancel\r\n");
- return;
- }
-
- sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE);
- }
-}
-
-/// Restart the server with some delay
-void CliRestart(char* command,pPrintf zprintf)
-{
- char *args = strtok(command," ");
-
- if(!args)
- {
- zprintf("Syntax is: restart $seconds|cancel\r\n");
- return;
- }
-
- if(std::string(args)=="cancel")
- {
- sWorld.ShutdownCancel();
- }
- else
- {
- int32 time = atoi(args);
-
- ///- Prevent interpret wrong arg value as 0 secs shutdown time
- if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
- {
- zprintf("Syntax is: restart $seconds|cancel\r\n");
- return;
- }
-
- sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART);
- }
-}
-
-/// Shutdown the server (with some delay) as soon as no active connections remain on the server
-void CliIdleShutdown(char* command,pPrintf zprintf)
-{
- char *args = strtok(command," ");
-
- if(!args)
- {
- zprintf("Syntax is: idleshutdown $seconds|cancel\r\n");
- return;
- }
-
- if(std::string(args)=="cancel")
- {
- sWorld.ShutdownCancel();
- }
- else
- {
-
- uint32 time = atoi(args);
-
- ///- Prevent interpret wrong arg value as 0 secs shutdown time
- if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
- {
- zprintf("Syntax is: idleshutdown $seconds|cancel\r\n");
- return;
- }
-
- sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE);
- }
-}
-
-/// Shutdown the server with some delay
-void CliShutdown(char* command,pPrintf zprintf)
-{
- char *args = strtok(command," ");
-
- if(!args)
- {
- zprintf("Syntax is: shutdown $seconds|cancel\r\n");
- return;
- }
-
- if(std::string(args)=="cancel")
- {
- sWorld.ShutdownCancel();
- }
- else
- {
- int32 time = atoi(args);
-
- ///- Prevent interpret wrong arg value as 0 secs shutdown time
- if(time==0 && (args[0]!='0' || args[1]!='\0') || time < 0)
- {
- zprintf("Syntax is: shutdown $seconds|cancel\r\n");
- return;
- }
-
- sWorld.ShutdownServ(time);
- }
+ return true;
}
/// Display info on users currently in the realm
-void CliInfo(char*,pPrintf zprintf)
+bool ChatHandler::HandleAccountOnlineListCommand(const char* args)
{
- uint32 activeClientsNum = sWorld.GetActiveSessionCount();
- uint32 queuedClientsNum = sWorld.GetQueuedSessionCount();
- uint32 maxActiveClientsNum = sWorld.GetMaxActiveSessionCount();
- uint32 maxQueuedClientsNum = sWorld.GetMaxQueuedSessionCount();
- std::string timeStr = secsToTimeString(sWorld.GetUptime(),true);
-
- zprintf("Online players: %u (max: %u) queued: %u (max: %u) Uptime: %s\r\n",activeClientsNum,maxActiveClientsNum,queuedClientsNum,maxQueuedClientsNum,timeStr.c_str());
-
///- Get the list of accounts ID logged to the realm
QueryResult *resultDB = CharacterDatabase.Query("SELECT name,account FROM characters WHERE online > 0");
-
if (!resultDB)
- return;
+ return true;
///- Display the list of account/characters online
- zprintf("=====================================================================\r\n");
- zprintf("| Account | Character | IP | GM | Exp |\r\n");
- zprintf("=====================================================================\r\n");
+ SendSysMessage("=====================================================================");
+ SendSysMessage(LANG_ACCOUNT_LIST_HEADER);
+ SendSysMessage("=====================================================================");
///- Circle through accounts
do
@@ -490,708 +201,77 @@ void CliInfo(char*,pPrintf zprintf)
if(resultLogin)
{
Field *fieldsLogin = resultLogin->Fetch();
- zprintf("|%15s| %20s | %15s |%4d|%5d|\r\n",
+ PSendSysMessage("|%15s| %20s | %15s |%4d|%5d|",
fieldsLogin[0].GetString(),name.c_str(),fieldsLogin[1].GetString(),fieldsLogin[2].GetUInt32(),fieldsLogin[3].GetUInt32());
delete resultLogin;
}
else
- zprintf("|<Error> | %20s |<Error> |<Er>|<Err>|\r\n",name.c_str());
+ PSendSysMessage(LANG_ACCOUNT_LIST_ERROR,name.c_str());
}while(resultDB->NextRow());
delete resultDB;
- zprintf("=====================================================================\r\n");
-}
-
-/// Display a list of banned accounts and ip addresses
-void CliBanList(char*,pPrintf zprintf)
-{
- bool found = false;
- ///- Get the list of banned accounts and display them
- QueryResult *result = loginDatabase.Query("SELECT id,username FROM account WHERE id IN (SELECT id FROM account_banned WHERE active = 1)");
- if(result)
- {
- found = true;
-
- zprintf("Currently Banned Accounts:\r\n");
- zprintf("===============================================================================\r\n");
- zprintf("| Account | BanDate | UnbanDate | Banned By | Ban Reason |\r\n");
- do
- {
- zprintf("-------------------------------------------------------------------------------\r\n");
- Field *fields = result->Fetch();
- // No SQL injection. id is uint32.
- QueryResult *banInfo = loginDatabase.PQuery("SELECT bandate,unbandate,bannedby,banreason FROM account_banned WHERE id = %u AND active = 1 ORDER BY unbandate", fields[0].GetUInt32());
- if (banInfo)
- {
- Field *fields2 = banInfo->Fetch();
- do
- {
- time_t t_ban = fields2[0].GetUInt64();
- tm* aTm_ban = localtime(&t_ban);
- zprintf("|%-15.15s|", fields[1].GetString());
- zprintf("%02d-%02d-%02d %02d:%02d|", aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min);
- if ( fields2[0].GetUInt64() == fields2[1].GetUInt64() )
- zprintf(" permanent |");
- else
- {
- time_t t_unban = fields2[1].GetUInt64();
- tm* aTm_unban = localtime(&t_unban);
- zprintf("%02d-%02d-%02d %02d:%02d|",aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min);
- }
- zprintf("%-15.15s|%-15.15s|\r\n",fields2[2].GetString(),fields2[3].GetString());
- }while ( banInfo->NextRow() );
- delete banInfo;
- }
- }while( result->NextRow() );
- zprintf("===============================================================================\r\n");
- delete result;
- }
-
- ///- Get the list of banned IP addresses and display them
- result = loginDatabase.Query( "SELECT ip,bandate,unbandate,bannedby,banreason FROM ip_banned WHERE (bandate=unbandate OR unbandate>UNIX_TIMESTAMP()) ORDER BY unbandate" );
- if(result)
- {
- found = true;
-
- zprintf("Currently Banned IPs:\r\n");
- zprintf("===============================================================================\r\n");
- zprintf("| IP | BanDate | UnbanDate | Banned By | Ban Reason |\r\n");
- do
- {
- zprintf("-------------------------------------------------------------------------------\r\n");
- Field *fields = result->Fetch();
- time_t t_ban = fields[1].GetUInt64();
- tm* aTm_ban = localtime(&t_ban);
- zprintf("|%-15.15s|", fields[0].GetString());
- zprintf("%02d-%02d-%02d %02d:%02d|", aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min);
- if ( fields[1].GetUInt64() == fields[2].GetUInt64() )
- zprintf(" permanent |");
- else
- {
- time_t t_unban = fields[2].GetUInt64();
- tm* aTm_unban = localtime(&t_unban);
- zprintf("%02d-%02d-%02d %02d:%02d|", aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min);
- }
- zprintf("%-15.15s|%-15.15s|\r\n", fields[3].GetString(), fields[4].GetString());
- }while( result->NextRow() );
- zprintf("===============================================================================\r\n");
- delete result;
- }
-
- if(!found)
- zprintf("We do not have banned users\r\n");
-}
-
-/// Ban an IP address or a user account
-void CliBan(char*command,pPrintf zprintf)
-{
- ///- Get the command parameter
- char* type_str = strtok((char*)command, " ");
- char* nameOrIP_str = strtok(NULL, " ");
- char* duration_str = strtok(NULL," ");
- char* reason_str = strtok(NULL,"");
-
- if(!type_str||!nameOrIP_str||!duration_str||!reason_str)// ?!? input of single char "0"-"9" wouldn't detect when with: || !atoi(duration)
- {
- zprintf("Syntax: ban account|ip|character $AccountOrIpOrCharacter $duration[s|m|h|d] $reason \r\n");
- return;
- }
-
- std::string type;
- if(!consoleToUtf8(type_str,type)) // convert from console encoding to utf8
- return;
-
- std::string nameOrIP;
- if(!consoleToUtf8(nameOrIP_str,nameOrIP)) // convert from console encoding to utf8
- return;
-
- std::string duration;
- if(!consoleToUtf8(duration_str,duration)) // convert from console encoding to utf8
- return;
-
- std::string reason;
- if(!consoleToUtf8(reason_str,reason)) // convert from console encoding to utf8
- return;
-
- switch (sWorld.BanAccount(type, nameOrIP, duration, reason, "Set by console."))
- {
- case BAN_SUCCESS:
- if(atoi(duration_str)>0)
- zprintf("%s is banned for %s. Reason: %s.\r\n",nameOrIP.c_str(),secsToTimeString(TimeStringToSecs(duration_str),true,false).c_str(),reason.c_str());
- else
- zprintf("%s is banned permanently. Reason: %s.\r\n",nameOrIP.c_str(),reason.c_str());
- break;
- case BAN_NOTFOUND:
- zprintf("%s %s not found\r\n", type.c_str(), nameOrIP.c_str());
- break;
- case BAN_SYNTAX_ERROR:
- zprintf("Syntax: ban account|ip|character $AccountOrIpOrCharacter $duration[s|m|h|d] $reason \r\n");
- break;
- }
-}
-
-/// Display %TrinIty version
-void CliVersion(char*,pPrintf zprintf)
-{
- //<--maybe better append to info cmd
- zprintf( "%s (world-daemon)\r\n", _FULLVERSION );
-}
-
-/// Unban an IP adress or a user account
-void CliRemoveBan(char *command,pPrintf zprintf)
-{
- ///- Get the command parameter
- char *type_str = strtok(command," ");
- char *nameorip_str = strtok(NULL," ");
- if(!nameorip_str||!type_str)
- {
- zprintf("Syntax is: unban account|ip|character $nameorip\r\n");
- return;
- }
-
- std::string type;
- if(!consoleToUtf8(type_str,type)) // convert from console encoding to utf8
- return;
-
- std::string nameorip;
- if(!consoleToUtf8(nameorip_str,nameorip)) // convert from console encoding to utf8
- return;
-
- if (!sWorld.RemoveBanAccount(type, nameorip))
- zprintf("%s %s not found\r\n", type.c_str(), nameorip.c_str());
- else
- zprintf("We removed ban from %s: %s\r\n",type_str,nameorip.c_str());
-}
-
-/// Display the list of GMs
-void CliListGM(char*,pPrintf zprintf)
-{
-
- ///- Get the accounts with GM Level >0
- Field *fields;
-
- QueryResult *result = loginDatabase.Query( "SELECT username,gmlevel FROM account WHERE gmlevel > 0" );
- if(result)
- {
-
- zprintf("Current gamemasters:\r\n");
- zprintf("========================\r\n");
- zprintf("| Account | GM |\r\n");
- zprintf("========================\r\n");
-
- ///- Circle through them. Display username and GM level
- do
- {
- fields = result->Fetch();
- zprintf("|%15s|", fields[0].GetString());
- zprintf("%6s|\r\n",fields[1].GetString());
- }while( result->NextRow() );
-
- zprintf("========================\r\n");
- delete result;
- }
- else
- {
- zprintf("No gamemasters\r\n");
- }
-}
-
-/// Set the GM level of an account
-void CliSetGM(char *command,pPrintf zprintf)
-{
- ///- Get the command line arguments
- char *szAcc = strtok(command," ");
- char *szLevel = strtok(NULL," ");
-
- if(!szAcc||!szLevel) //wrong syntax 'setgm' without name
- {
- zprintf("Syntax is: setgm $account $number (0 - normal, 3 - gamemaster)>\r\n");
- return;
- }
-
- //wow it's ok,let's hope it was integer given
- int lev=atoi(szLevel); //get int anyway (0 if error)
-
- std::string safe_account_name;
- if(!consoleToUtf8(szAcc,safe_account_name)) // convert from console encoding to utf8
- return;
-
- ///- Convert Account name to Upper Format
- AccountMgr::normilizeString(safe_account_name);
-
- ///- Escape the account name to allow quotes in names
- loginDatabase.escape_string(safe_account_name);
-
- ///- Try to find the account, then update the GM level
- // No SQL injection (account name is escaped)
- QueryResult *result = loginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'",safe_account_name.c_str());
-
- if (result)
- {
- Field *fields = result->Fetch();
- uint32 account_id = fields[0].GetUInt32();
- delete result;
-
- WorldSession* session = sWorld.FindSession(account_id);
- if(session)
- session->SetSecurity(lev);
-
- // No SQL injection (account name is escaped)
- loginDatabase.PExecute("UPDATE account SET gmlevel = '%d' WHERE username = '%s'",lev,safe_account_name.c_str());
- zprintf("We set %s gmlevel %d\r\n",safe_account_name.c_str(),lev);
- }
- else
- {
- zprintf("No account %s found\r\n",safe_account_name.c_str());
- }
-}
-
-/// Set password for account
-void CliSetPassword(char *command,pPrintf zprintf)
-{
- ///- Get the command line arguments
- char *szAcc = strtok(command," ");
- char *szPassword1 = strtok(NULL," ");
- char *szPassword2 = strtok(NULL," ");
-
- if(!szAcc||!szPassword1 || !szPassword2)
- {
- zprintf("Syntax is: setpass $account $password $password\r\n");
- return;
- }
-
- std::string account_name;
- if(!consoleToUtf8(szAcc,account_name)) // convert from console encoding to utf8
- return;
-
- std::string pass1;
- if(!consoleToUtf8(szPassword1,pass1)) // convert from console encoding to utf8
- return;
-
- std::string pass2;
- if(!consoleToUtf8(szPassword2,pass2)) // convert from console encoding to utf8
- return;
-
- uint32 acc_id = accmgr.GetId(szAcc);
- if (!acc_id)
- {
- zprintf("Account '%s' does not exist!\r\n", account_name.c_str());
- return;
- }
-
- if (pass1 != pass2)
- {
- zprintf("Password does not match the confirm password, password not changed!\r\n");
- return;
- }
-
- AccountOpResult result = accmgr.ChangePassword(acc_id, pass1);
-
- switch(result)
- {
- case AOR_OK:
- zprintf("The password was changed for account '%s' (ID: %u).\r\n",account_name.c_str(),acc_id);
- break;
- case AOR_PASS_TOO_LONG:
- zprintf("Password can't be longer than 16 characters (client limit), password not changed!\r\n");
- break;
- case AOR_NAME_NOT_EXIST:
- zprintf("Account '%s' does not exist!\r\n", account_name.c_str());
- break;
- case AOR_DB_INTERNAL_ERROR:
- zprintf("Password not changed! (probably sql file format was updated)\r\n");
- break;
- default:
- zprintf("Password not changed! (unknown error\r\n");
- break;
- }
+ SendSysMessage("=====================================================================");
+ return true;
}
/// Create an account
-void CliCreate(char *command,pPrintf zprintf)
+bool ChatHandler::HandleAccountCreateCommand(const char* args)
{
- //I see no need in this function (why would an admin personally create accounts
- //instead of using account registration page or accessing db directly?)
- //but still let it be
+ if(!*args)
+ return false;
///- %Parse the command line arguments
- char *szAcc = strtok(command, " ");
+ char *szAcc = strtok((char*)args, " ");
char *szPassword = strtok(NULL, " ");
if(!szAcc || !szPassword)
- {
- zprintf("Syntax is: create $username $password\r\n");
- return;
- }
+ return false;
- std::string account_name;
- if(!consoleToUtf8(szAcc,account_name)) // convert from console encoding to utf8
- return;
-
- std::string password;
- if(!consoleToUtf8(szPassword,password)) // convert from console encoding to utf8
- return;
+ // normilized in accmgr.CreateAccount
+ std::string account_name = szAcc;
+ std::string password = szPassword;
AccountOpResult result = accmgr.CreateAccount(account_name, password);
switch(result)
{
case AOR_OK:
- zprintf("User %s with password %s created successfully\r\n",account_name.c_str(),password.c_str());
+ PSendSysMessage(LANG_ACCOUNT_CREATED,account_name.c_str());
break;
case AOR_NAME_TOO_LONG:
- zprintf("Username %s is too long\r\n", account_name.c_str());
- break;
+ SendSysMessage(LANG_ACCOUNT_TOO_LONG);
+ SetSentErrorMessage(true);
+ return false;
case AOR_NAME_ALREDY_EXIST:
- zprintf("User %s already exists\r\n",account_name.c_str());
- break;
+ SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST);
+ SetSentErrorMessage(true);
+ return false;
case AOR_DB_INTERNAL_ERROR:
- zprintf("User %s with password %s NOT created (probably sql file format was updated)\r\n",account_name.c_str(),password.c_str());
- break;
+ PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
default:
- zprintf("User %s with password %s NOT created (unknown error)\r\n",account_name.c_str(),password.c_str());
- break;
- }
-}
-
-/// Command parser and dispatcher
-void ParseCommand( pPrintf zprintf, char* input)
-{
- unsigned int x;
- bool bSuccess=false;
- if (!input)
- return;
-
- unsigned int l=strlen(input);
- char *supposedCommand=NULL,* arguments=(char*)("");
- if(l)
- {
- ///- Get the command and the arguments
- supposedCommand = strtok(input," ");
- if (supposedCommand)
- {
- if (l>strlen(supposedCommand))
- arguments=&input[strlen(supposedCommand)+1];
-
- ///- Circle through the command table and, if found, put the command in the queue
- for ( x=0;x<CliTotalCmds;x++)
- if(!strcmp(Commands[x].cmd,supposedCommand))
- {
- sWorld.QueueCliCommand(new CliCommandHolder(&Commands[x], arguments, zprintf));
- bSuccess=true;
- break;
- }
-
- ///- Display an error message if the command is unknown
- if(x==CliTotalCmds)
- zprintf("Unknown command: %s\r\n", input);
- }
+ PSendSysMessage(LANG_ACCOUNT_NOT_CREATED,account_name.c_str());
+ SetSentErrorMessage(true);
+ return false;
}
- if (!bSuccess)
- zprintf("TC>");
-}
-
-/// Kick a character out of the realm
-void CliKick(char*command,pPrintf zprintf)
-{
- char *kickName = strtok(command, " ");
-
- if (!kickName)
- {
- zprintf("Syntax is: kick $charactername\r\n");
- return;
- }
-
- std::string name;
- if(!consoleToUtf8(kickName,name)) // convert from console encoding to utf8
- return;
-
- if(!normalizePlayerName(name))
- return;
-
- sWorld.KickPlayer(name);
-}
-
-/// Teleport a character to location
-void CliTele(char*command,pPrintf zprintf)
-{
- char *charName = strtok(command, " ");
- char *locName = strtok(NULL, " ");
-
- if (!charName || !locName)
- {
- zprintf("Syntax is: tele $charactername $location\r\n");
- return;
- }
-
- std::string name = charName;
- if(!consoleToUtf8(charName,name)) // convert from console encoding to utf8
- return;
-
- if(!normalizePlayerName(name))
- return;
-
- std::string location;
- if(!consoleToUtf8(locName,location)) // convert from console encoding to utf8
- return;
-
- WorldDatabase.escape_string(location);
- QueryResult *result = WorldDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map FROM game_tele WHERE name = '%s'",location.c_str());
- if (!result)
- {
- zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_COMMAND_TELE_NOTFOUND),"\r\n");
- return;
- }
-
- Field *fields = result->Fetch();
- float x = fields[0].GetFloat();
- float y = fields[1].GetFloat();
- float z = fields[2].GetFloat();
- float ort = fields[3].GetFloat();
- int mapid = fields[4].GetUInt16();
- delete result;
-
- if(!MapManager::IsValidMapCoord(mapid,x,y,z,ort))
- {
- zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_INVALID_TARGET_COORD),"\r\n",x,y,mapid);
- return;
- }
-
- Player *chr = objmgr.GetPlayer(name.c_str());
- if (chr)
- {
-
- if(chr->IsBeingTeleported()==true)
- {
- zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_IS_TELEPORTED),"\r\n",chr->GetName());
- return;
- }
-
- if(chr->isInFlight())
- {
- zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_CHAR_IN_FLIGHT),"\r\n",chr->GetName());
- return;
- }
-
- zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_TELEPORTING_TO),"\r\n",chr->GetName(),"", location.c_str());
-
- chr->SaveRecallPosition();
-
- chr->TeleportTo(mapid,x,y,z,chr->GetOrientation());
- }
- else if (uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str()))
- {
- zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_TELEPORTING_TO),"\r\n",name.c_str(), objmgr.GetTrinityStringForDBCLocale(LANG_OFFLINE), location.c_str());
- Player::SavePositionInDB(mapid,x,y,z,ort,MapManager::Instance().GetZoneId(mapid,x,y),guid);
- }
- else
- zprintf(objmgr.GetTrinityStringForDBCLocale(LANG_NO_PLAYER),"\r\n",name.c_str());
-}
-
-/// Display/Define the 'Message of the day' for the realm
-void CliMotd(char*command,pPrintf zprintf)
-{
-
- if (strlen(command) == 0)
- {
- zprintf("Current Message of the day: \r\n%s\r\n", sWorld.GetMotd());
- return;
- }
- else
- {
- std::string commandUtf8;
- if(!consoleToUtf8(command,commandUtf8)) // convert from console encoding to utf8
- return;
-
- sWorld.SetMotd(commandUtf8);
- zprintf("Message of the day changed to:\r\n%s\r\n", commandUtf8.c_str());
- }
-}
-
-/// Comment me
-/// \todo What is CorpsesErase for?
-void CliCorpses(char*,pPrintf)
-{
- CorpsesErase();
+
+ return true;
}
/// Set the level of logging
-void CliSetLogLevel(char*command,pPrintf zprintf)
-{
- char *NewLevel = strtok(command, " ");
- if (!NewLevel)
- {
- zprintf("Syntax is: setloglevel $loglevel\r\n");
- return;
- }
- sLog.SetLogLevel(NewLevel);
-}
-
-/// Display the server uptime
-void CliUpTime(char*,pPrintf zprintf)
-{
- uint32 uptime = sWorld.GetUptime();
- std::string suptime = secsToTimeString(uptime,true,(uptime > 86400));
- zprintf("Server has been up for: %s\r\n", suptime.c_str());
-}
-
-/// Set/Unset the TBC flag for an account
-void CliSetAddon(char *command,pPrintf zprintf)
-{
- ///- Get the command line arguments
- char *szAcc = strtok(command," ");
- char *szExp = strtok(NULL," ");
-
- if(!szAcc||!szExp)
- {
- zprintf("Syntax is: setbc $account $number (0 - normal, 1 - tbc, 2 - wotlk)>\r\n");
- return;
- }
-
- int lev=atoi(szExp); //get int anyway (0 if error)
-
- if(lev < 0)
- {
- zprintf("Syntax is: setbc $account $number (0 - normal, 1 - tbc, 2 - wotlk)>\r\n");
- return;
- }
-
- ///- Escape the account name to allow quotes in names
- std::string safe_account_name;
- if(!consoleToUtf8(szAcc,safe_account_name)) // convert from console encoding to utf8
- return;
-
- ///- Convert Account name to Upper Format
- AccountMgr::normilizeString(safe_account_name);
-
- ///- Escape the account name to allow quotes in names
- loginDatabase.escape_string(safe_account_name);
-
- // No SQL injection (account name is escaped)
- QueryResult *result = loginDatabase.PQuery("SELECT 1 FROM account WHERE username = '%s'",safe_account_name.c_str());
-
- if (result)
- {
- // No SQL injection (account name is escaped)
- loginDatabase.PExecute("UPDATE account SET expansion = '%d' WHERE username = '%s'",lev,safe_account_name.c_str());
- zprintf("We set %s to expansion allowed %d\r\n",safe_account_name.c_str(),lev);
-
- delete result;
- }
- else
- {
- zprintf("No account %s found\r\n",safe_account_name.c_str());
- }
-}
-
-/// Save all players
-void CliSave(char*,pPrintf zprintf)
-{
- ///- Save players
- ObjectAccessor::Instance().SaveAllPlayers();
- zprintf( objmgr.GetTrinityStringForDBCLocale(LANG_PLAYERS_SAVED) );
-
- ///- Send a message
- sWorld.SendWorldText(LANG_PLAYERS_SAVED);
-}
-
-/// Send a message to a player in game
-void CliSend(char *playerN,pPrintf zprintf)
+bool ChatHandler::HandleServerSetLogLevelCommand(const char *args)
{
- ///- Get the command line arguments
- char* name_str = strtok((char*)playerN, " ");
- char* msg_str = strtok(NULL, "");
-
- if(!name_str || !msg_str)
- {
- zprintf("Syntax: send $player $message (Player name is case sensitive)\r\n");
- return;
- }
-
- std::string name;
- if(!consoleToUtf8(name_str,name)) // convert from console encoding to utf8
- return;
-
- std::string msg;
- if(!consoleToUtf8(msg_str,msg)) // convert from console encoding to utf8
- return;
-
- if(!normalizePlayerName(name))
- {
- zprintf("Syntax: send $player $message (Player name is case sensitive)\r\n");
- return;
- }
+ if(!*args)
+ return false;
- ///- Find the player and check that he is not logging out.
- Player *rPlayer = objmgr.GetPlayer(name.c_str());
- if(!rPlayer)
- {
- zprintf("Player %s not found!\r\n", name.c_str());
- return;
- }
-
- if (rPlayer->GetSession()->isLogingOut())
- {
- zprintf("Cannot send message while player %s is logging out!\r\n",name.c_str());
- return;
- }
-
- ///- Send the message
- //Use SendAreaTriggerMessage for fastest delivery.
- rPlayer->GetSession()->SendAreaTriggerMessage("%s", msg.c_str());
- rPlayer->GetSession()->SendAreaTriggerMessage("|cffff0000[Message from administrator]:|r");
-
- //Confirmation message
- zprintf("Message '%s' sent to %s\r\n",msg.c_str(), name.c_str());
-}
-
-void CliPLimit(char *args,pPrintf zprintf)
-{
- if(*args)
- {
- char* param = strtok((char*)args, " ");
- if(!param || !*param)
- return;
-
- int l = strlen(param);
-
- if( strncmp(param,"player",l) == 0 )
- sWorld.SetPlayerLimit(-SEC_PLAYER);
- else if(strncmp(param,"moderator",l) == 0 )
- sWorld.SetPlayerLimit(-SEC_MODERATOR);
- else if(strncmp(param,"gamemaster",l) == 0 )
- sWorld.SetPlayerLimit(-SEC_GAMEMASTER);
- else if(strncmp(param,"administrator",l) == 0 )
- sWorld.SetPlayerLimit(-SEC_ADMINISTRATOR);
- else if(strncmp(param,"reset",l) == 0 )
- sWorld.SetPlayerLimit(sConfig.GetIntDefault("PlayerLimit", DEFAULT_PLAYER_LIMIT));
- else
- {
- int val = atoi(param);
- if(val < -SEC_ADMINISTRATOR) val = -SEC_ADMINISTRATOR;
-
- sWorld.SetPlayerLimit(val);
- }
-
- // kick all low security level players
- if(sWorld.GetPlayerAmountLimit() > SEC_PLAYER)
- sWorld.KickAllLess(sWorld.GetPlayerSecurityLimit());
- }
-
- uint32 pLimit = sWorld.GetPlayerAmountLimit();
- AccountTypes allowedAccountType = sWorld.GetPlayerSecurityLimit();
- char const* secName = "";
- switch(allowedAccountType)
- {
- case SEC_PLAYER: secName = "Player"; break;
- case SEC_MODERATOR: secName = "Moderator"; break;
- case SEC_GAMEMASTER: secName = "Gamemaster"; break;
- case SEC_ADMINISTRATOR: secName = "Administrator"; break;
- default: secName = "<unknown>"; break;
- }
+ char *NewLevel = strtok((char*)args, " ");
+ if (!NewLevel)
+ return false;
- zprintf("Player limits: amount %u, min. security level %s.\r\n",pLimit,secName);
+ sLog.SetLogLevel(NewLevel);
+ return true;
}
/// @}
@@ -1221,13 +301,9 @@ void CliRunnable::run()
///- Display the list of available CLI functions then beep
sLog.outString();
- /// \todo Shoudn't we use here also the sLog singleton?
- CliHelp(NULL,&UTF8ZPRINTF);
if(sConfig.GetBoolDefault("BeepAtStart", true))
- {
printf("\a"); // \a = Alert
- }
// print this here the first time
// later it will be printed after command queue updates
@@ -1244,22 +320,33 @@ void CliRunnable::run()
if (World::m_stopEvent)
break;
#endif
- char *command = fgets(commandbuf,sizeof(commandbuf),stdin);
- if (command != NULL)
+ char *command_str = fgets(commandbuf,sizeof(commandbuf),stdin);
+ if (command_str != NULL)
{
- for(int x=0;command[x];x++)
- if(command[x]=='\r'||command[x]=='\n')
+ for(int x=0;command_str[x];x++)
+ if(command_str[x]=='\r'||command_str[x]=='\n')
+ {
+ command_str[x]=0;
+ break;
+ }
+
+ if(!*command_str)
{
- command[x]=0;
- break;
+ printf("TC>");
+ continue;
}
- //// \todo Shoudn't we use here also the sLog singleton?
- ParseCommand(&UTF8ZPRINTF,command);
+
+ std::string command;
+ if(!consoleToUtf8(command_str,command)) // convert from console encoding to utf8
+ {
+ printf("TC>");
+ continue;
+ }
+
+ sWorld.QueueCliCommand(&utf8print,command.c_str());
}
else if (feof(stdin))
- {
World::m_stopEvent = true;
- }
}
///- End the database thread
diff --git a/src/trinitycore/RASocket.cpp b/src/trinitycore/RASocket.cpp
index 36d6b497d3f..69295917d7c 100644
--- a/src/trinitycore/RASocket.cpp
+++ b/src/trinitycore/RASocket.cpp
@@ -44,7 +44,7 @@ unsigned int iUsers=0; ///< Number of activ
typedef int(* pPrintf)(const char*,...);
-void ParseCommand(pPrintf zprintf, char*command);
+void ParseCommand(CliCommandHolder::Print*, char*command);
/// RASocket constructor
RASocket::RASocket(ISocketHandler &h): TcpSocket(h)
@@ -222,7 +222,7 @@ void RASocket::OnRead()
if(strlen(buff))
{
sLog.outRALog("Got '%s' cmd.\n",buff);
- ParseCommand(&RASocket::zprintf , buff);
+ sWorld.QueueCliCommand(&RASocket::zprint , buff);
}
else
Sendf("TC>");
@@ -234,20 +234,23 @@ void RASocket::OnRead()
}
/// Output function
-int RASocket::zprintf( const char * szText, ... )
+void RASocket::zprint( const char * szText )
{
- if( !szText ) return 0;
- va_list ap;
- va_start(ap, szText);
- /// \todo Remove buffer length here. Can be >1024 (e.g. list of users)
- char *megabuffer=new char[1024];
- unsigned int sz=vsnprintf(megabuffer,1024,szText,ap);
+ if( !szText )
+ return;
+
#ifdef RA_CRYPT
- Encrypt(megabuffer,sz);
- #endif
- send(r,megabuffer,sz,0);
+ char *megabuffer=strdup(szText);
+ unsigned int sz=strlen(megabuffer);
+ Encrypt(megabuffer,sz);
+ send(r,megabuffer,sz,0);
delete [] megabuffer;
- va_end(ap);
- return 0;
+
+ #else
+
+ unsigned int sz=strlen(szText);
+ send(r,szText,sz,0);
+
+ #endif
}
diff --git a/src/trinitycore/RASocket.h b/src/trinitycore/RASocket.h
index f4b4d96f3f2..dd6ebbc572d 100644
--- a/src/trinitycore/RASocket.h
+++ b/src/trinitycore/RASocket.h
@@ -61,7 +61,7 @@ class RASocket: public TcpSocket
OK, //both login and pass were given, and they are correct and user have enough priv.
}stage;
- static int zprintf( const char * szText, ... );
+ static void zprint( const char * szText );
};
#endif
/// @}