/* * Copyright (C) 2008 Trinity * * Thanks to the original authors: MaNGOS * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "Common.h" #include "Database/DatabaseEnv.h" #include "WorldPacket.h" #include "WorldSession.h" #include "World.h" #include "Player.h" #include "Opcodes.h" #include "Chat.h" #include "MapManager.h" #include "ObjectAccessor.h" #include "Language.h" #include "AccountMgr.h" #include "SystemConfig.h" #include "Util.h" bool ChatHandler::HandleHelpCommand(const char* args) { if(!*args) return false; char* cmd = strtok((char*)args, " "); if(!cmd) return false; if(!ShowHelpForCommand(getCommandTable(), cmd)) SendSysMessage(LANG_NO_HELP_CMD); return true; } bool ChatHandler::HandleCommandsCommand(const char* args) { ShowHelpForCommand(getCommandTable(), ""); return true; } bool ChatHandler::HandleAcctCommand(const char* /*args*/) { uint32 gmlevel = m_session->GetSecurity(); PSendSysMessage(LANG_ACCOUNT_LEVEL, gmlevel); return true; } bool ChatHandler::HandleStartCommand(const char* /*args*/) { Player *chr = m_session->GetPlayer(); if(chr->isInFlight()) { SendSysMessage(LANG_YOU_IN_FLIGHT); SetSentErrorMessage(true); return false; } if(chr->isInCombat()) { SendSysMessage(LANG_YOU_IN_COMBAT); SetSentErrorMessage(true); return false; } // cast spell Stuck chr->CastSpell(chr,7355,false); return true; } bool ChatHandler::HandleInfoCommand(const char* /*args*/) { uint32 activeClientsNum = sWorld.GetActiveSessionCount(); uint32 queuedClientsNum = sWorld.GetQueuedSessionCount(); uint32 maxActiveClientsNum = sWorld.GetMaxActiveSessionCount(); uint32 maxQueuedClientsNum = sWorld.GetMaxQueuedSessionCount(); std::string str = secsToTimeString(sWorld.GetUptime()); PSendSysMessage(_FULLVERSION); PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum); PSendSysMessage(LANG_UPTIME, str.c_str()); return true; } bool ChatHandler::HandleDismountCommand(const char* /*args*/) { //If player is not mounted, so go out :) if (!m_session->GetPlayer( )->IsMounted()) { SendSysMessage(LANG_CHAR_NON_MOUNTED); SetSentErrorMessage(true); return false; } if(m_session->GetPlayer( )->isInFlight()) { SendSysMessage(LANG_YOU_IN_FLIGHT); SetSentErrorMessage(true); return false; } m_session->GetPlayer()->Unmount(); m_session->GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); return true; } bool ChatHandler::HandleSaveCommand(const char* /*args*/) { Player *player=m_session->GetPlayer(); // save GM account without delay and output message (testing, etc) if(m_session->GetSecurity()) { player->SaveToDB(); SendSysMessage(LANG_PLAYER_SAVED); return true; } // save or plan save after 20 sec (logout delay) if current next save time more this value and _not_ output any messages to prevent cheat planning uint32 save_interval = sWorld.getConfig(CONFIG_INTERVAL_SAVE); if(save_interval==0 || save_interval > 20*1000 && player->GetSaveTimer() <= save_interval - 20*1000) player->SaveToDB(); return true; } bool ChatHandler::HandleGMListCommand(const char* /*args*/) { bool first = true; HashMapHolder::MapType &m = HashMapHolder::GetContainer(); HashMapHolder::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(first) { SendSysMessage(LANG_GMS_ON_SRV); first = false; } SendSysMessage(itr->second->GetName()); } } if(first) SendSysMessage(LANG_GMS_NOT_LOGGED); return true; } bool ChatHandler::HandlePasswordCommand(const char* args) { if(!*args) return false; char *old_pass = strtok ((char*)args, " "); char *new_pass = strtok (NULL, " "); char *new_pass_c = strtok (NULL, " "); 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) { SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD); SetSentErrorMessage(true); return false; } AccountOpResult result = accmgr.ChangePassword(m_session->GetAccountId(), password_new); switch(result) { case AOR_OK: SendSysMessage(LANG_COMMAND_PASSWORD); break; default: SendSysMessage(LANG_COMMAND_NOTCHANGEPASSWORD); SetSentErrorMessage(true); return false; } return true; } bool ChatHandler::HandleLockAccountCommand(const char* args) { if (!*args) { SendSysMessage(LANG_USE_BOL); return true; } std::string argstr = (char*)args; if (argstr == "on") { loginDatabase.PExecute( "UPDATE account SET locked = '1' WHERE id = '%d'",m_session->GetAccountId()); PSendSysMessage(LANG_COMMAND_ACCLOCKLOCKED); return true; } if (argstr == "off") { loginDatabase.PExecute( "UPDATE account SET locked = '0' WHERE id = '%d'",m_session->GetAccountId()); PSendSysMessage(LANG_COMMAND_ACCLOCKUNLOCKED); return true; } SendSysMessage(LANG_USE_BOL); return true; }