/
white.sheikh
/
mangoszero-server
Обзор
Документация
Войти
/
white.sheikh
/
mangoszero-server
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/game/ChatCommands/PlayerCommands.cpp
2 368 строк
59 KB
Antz
Happy New Year 2023 from everyone at getMangos.eu :tada:
01 янв 2023, 00:29
Не верифицирован
01 янв 2023, 00:29
ce8b12f
Код
Авторство
О чём код?
/** * MaNGOS is a full featured server for World of Warcraft, supporting * the following clients: 1.12.x, 2.4.3, 3.3.5a, 4.3.4a and 5.4.8 * * Copyright (C) 2005-2023 MaNGOS <https://getmangos.eu> * * 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 * * World of Warcraft, and all World of Warcraft or Warcraft art, images, * and lore are copyrighted by Blizzard Entertainment, Inc. */ #include "Chat.h" #include "Language.h" #include "World.h" #include "AccountMgr.h" #include "ObjectMgr.h" #include "SQLStorages.h" /********************************************************************** CommandTable : characterCommandTable /***********************************************************************/ bool ChatHandler::HandleCharacterEraseCommand(char* args) { char* nameStr = ExtractLiteralArg(&args); if (!nameStr) { return false; } Player* target; ObjectGuid target_guid; std::string target_name; if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) { return false; } uint32 account_id; if (target) { account_id = target->GetSession()->GetAccountId(); target->GetSession()->KickPlayer(); } else { account_id = sObjectMgr.GetPlayerAccountIdByGUID(target_guid); } std::string account_name; sAccountMgr.GetName(account_id, account_name); Player::DeleteFromDB(target_guid, account_id, true, true); PSendSysMessage(LANG_CHARACTER_DELETED, target_name.c_str(), target_guid.GetCounter(), account_name.c_str(), account_id); return true; } bool ChatHandler::HandleCharacterLevelCommand(char* args) { char* nameStr = ExtractOptNotLastArg(&args); int32 newlevel; bool nolevel = false; // exception opt second arg: .character level $name if (!ExtractInt32(&args, newlevel)) { if (!nameStr) { nameStr = ExtractArg(&args); if (!nameStr) { return false; } nolevel = true; } else { return false; } } Player* target; ObjectGuid target_guid; std::string target_name; if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) { return false; } int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid); if (nolevel) { newlevel = oldlevel; } if (newlevel < 1) { return false; // invalid level } if (newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level { newlevel = STRONG_MAX_LEVEL; } HandleCharacterLevel(target, target_guid, oldlevel, newlevel); if (!m_session || m_session->GetPlayer() != target) // including player==NULL { std::string nameLink = playerLink(target_name); PSendSysMessage(LANG_YOU_CHANGE_LVL, nameLink.c_str(), newlevel); } return true; } // rename characters bool ChatHandler::HandleCharacterRenameCommand(char* args) { Player* target; ObjectGuid target_guid; std::string target_name; if (!ExtractPlayerTarget(&args, &target, &target_guid, &target_name)) { return false; } if (target) { // check online security if (HasLowerSecurity(target)) { return false; } PSendSysMessage(LANG_RENAME_PLAYER, GetNameLink(target).c_str()); target->SetAtLoginFlag(AT_LOGIN_RENAME); CharacterDatabase.PExecute("UPDATE `characters` SET `at_login` = `at_login` | '1' WHERE `guid` = '%u'", target->GetGUIDLow()); } else { // check offline security if (HasLowerSecurity(NULL, target_guid)) { return false; } std::string oldNameLink = playerLink(target_name); PSendSysMessage(LANG_RENAME_PLAYER_GUID, oldNameLink.c_str(), target_guid.GetCounter()); CharacterDatabase.PExecute("UPDATE `characters` SET `at_login` = `at_login` | '1' WHERE `guid` = '%u'", target_guid.GetCounter()); } return true; } bool ChatHandler::HandleCharacterReputationCommand(char* args) { Player* target; if (!ExtractPlayerTarget(&args, &target)) { return false; } LocaleConstant loc = GetSessionDbcLocale(); FactionStateList const& targetFSL = target->GetReputationMgr().GetStateList(); for (FactionStateList::const_iterator itr = targetFSL.begin(); itr != targetFSL.end(); ++itr) { FactionEntry const* factionEntry = sFactionStore.LookupEntry(itr->second.ID); ShowFactionListHelper(factionEntry, loc, &itr->second, target); } return true; } /********************************************************************** CommandTable : characterDeletedCommandTable /***********************************************************************/ /** * Collects all GUIDs (and related info) from deleted characters which are still in the database. * * @param foundList a reference to an std::list which will be filled with info data * @param searchString the search string which either contains a player GUID (low part) or a part of the character-name * @return returns false if there was a problem while selecting the characters (e.g. player name not normalizeable) */ bool ChatHandler::GetDeletedCharacterInfoList(DeletedInfoList& foundList, std::string searchString) { QueryResult* resultChar; if (!searchString.empty()) { // search by GUID if (isNumeric(searchString)) { resultChar = CharacterDatabase.PQuery("SELECT `guid`, `deleteInfos_Name`, `deleteInfos_Account`, `deleteDate` FROM `characters` WHERE `deleteDate` IS NOT NULL AND `guid` = %u", uint32(atoi(searchString.c_str()))); } // search by name else { if (!normalizePlayerName(searchString)) { return false; } resultChar = CharacterDatabase.PQuery("SELECT `guid`, `deleteInfos_Name`, `deleteInfos_Account`, `deleteDate` FROM `characters` WHERE `deleteDate` IS NOT NULL AND `deleteInfos_Name` " _LIKE_ " " _CONCAT3_("'%%'", "'%s'", "'%%'"), searchString.c_str()); } } else { resultChar = CharacterDatabase.Query("SELECT `guid`, `deleteInfos_Name`, `deleteInfos_Account`, `deleteDate` FROM `characters` WHERE `deleteDate` IS NOT NULL"); } if (resultChar) { do { Field* fields = resultChar->Fetch(); DeletedInfo info; info.lowguid = fields[0].GetUInt32(); info.name = fields[1].GetCppString(); info.accountId = fields[2].GetUInt32(); // account name will be empty for nonexistent account sAccountMgr.GetName(info.accountId, info.accountName); info.deleteDate = time_t(fields[3].GetUInt64()); foundList.push_back(info); } while (resultChar->NextRow()); delete resultChar; } return true; } /** * Generate WHERE guids list by deleted info in way preventing return too long where list for existed query string length limit. * * @param itr a reference to an deleted info list iterator, it updated in function for possible next function call if list to long * @param itr_end a reference to an deleted info list iterator end() * @return returns generated where list string in form: 'guid IN (gui1, guid2, ...)' */ std::string ChatHandler::GenerateDeletedCharacterGUIDsWhereStr(DeletedInfoList::const_iterator& itr, DeletedInfoList::const_iterator const& itr_end) { std::ostringstream wherestr; wherestr << "guid IN ('"; for (; itr != itr_end; ++itr) { wherestr << itr->lowguid; if (wherestr.str().size() > MAX_QUERY_LEN - 50) // near to max query { ++itr; break; } DeletedInfoList::const_iterator itr2 = itr; if (++itr2 != itr_end) { wherestr << "','"; } } wherestr << "')"; return wherestr.str(); } /** * Shows all deleted characters which matches the given search string, expected non empty list * * @see ChatHandler::HandleCharacterDeletedListCommand * @see ChatHandler::HandleCharacterDeletedRestoreCommand * @see ChatHandler::HandleCharacterDeletedDeleteCommand * @see ChatHandler::DeletedInfoList * * @param foundList contains a list with all found deleted characters */ void ChatHandler::HandleCharacterDeletedListHelper(DeletedInfoList const& foundList) { if (!m_session) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR); SendSysMessage(LANG_CHARACTER_DELETED_LIST_HEADER); SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR); } for (DeletedInfoList::const_iterator itr = foundList.begin(); itr != foundList.end(); ++itr) { std::string dateStr = TimeToTimestampStr(itr->deleteDate); if (!m_session) PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CONSOLE, itr->lowguid, itr->name.c_str(), itr->accountName.empty() ? "<nonexistent>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); else PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CHAT, itr->lowguid, itr->name.c_str(), itr->accountName.empty() ? "<nonexistent>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); } if (!m_session) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR); } } /** * Restore a previously deleted character * * @see ChatHandler::HandleCharacterDeletedListHelper * @see ChatHandler::HandleCharacterDeletedRestoreCommand * @see ChatHandler::HandleCharacterDeletedDeleteCommand * @see ChatHandler::DeletedInfoList * * @param delInfo the informations about the character which will be restored */ void ChatHandler::HandleCharacterDeletedRestoreHelper(DeletedInfo const& delInfo) { if (delInfo.accountName.empty()) // account not exist { PSendSysMessage(LANG_CHARACTER_DELETED_SKIP_ACCOUNT, delInfo.name.c_str(), delInfo.lowguid, delInfo.accountId); return; } // check character count uint32 charcount = sAccountMgr.GetCharactersCount(delInfo.accountId); if (charcount >= 10) { PSendSysMessage(LANG_CHARACTER_DELETED_SKIP_FULL, delInfo.name.c_str(), delInfo.lowguid, delInfo.accountId); return; } if (sObjectMgr.GetPlayerGuidByName(delInfo.name)) { PSendSysMessage(LANG_CHARACTER_DELETED_SKIP_NAME, delInfo.name.c_str(), delInfo.lowguid, delInfo.accountId); return; } CharacterDatabase.PExecute("UPDATE `characters` SET `name`='%s', `account`='%u', `deleteDate`=NULL, `deleteInfos_Name`=NULL, `deleteInfos_Account`=NULL WHERE `deleteDate` IS NOT NULL AND `guid` = %u", delInfo.name.c_str(), delInfo.accountId, delInfo.lowguid); } /** * Handles the '.character deleted delete' command, which completely deletes all deleted characters which matches the given search string * * @see Player::GetDeletedCharacterGUIDs * @see Player::DeleteFromDB * @see ChatHandler::HandleCharacterDeletedListCommand * @see ChatHandler::HandleCharacterDeletedRestoreCommand * * @param args the search string which either contains a player GUID or a part of the character-name */ bool ChatHandler::HandleCharacterDeletedDeleteCommand(char* args) { // It is required to submit at least one argument if (!*args) { return false; } DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, args)) { return false; } if (foundList.empty()) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_EMPTY); return false; } SendSysMessage(LANG_CHARACTER_DELETED_DELETE); HandleCharacterDeletedListHelper(foundList); // Call the appropriate function to delete them (current account for deleted characters is 0) for (DeletedInfoList::const_iterator itr = foundList.begin(); itr != foundList.end(); ++itr) { Player::DeleteFromDB(ObjectGuid(HIGHGUID_PLAYER, itr->lowguid), 0, false, true); } return true; } /** * Handles the '.character deleted list' command, which shows all deleted characters which matches the given search string * * @see ChatHandler::HandleCharacterDeletedListHelper * @see ChatHandler::HandleCharacterDeletedRestoreCommand * @see ChatHandler::HandleCharacterDeletedDeleteCommand * @see ChatHandler::DeletedInfoList * * @param args the search string which either contains a player GUID or a part of the character-name */ bool ChatHandler::HandleCharacterDeletedListCommand(char* args) { DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, args)) { return false; } // if no characters have been found, output a warning if (foundList.empty()) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_EMPTY); return false; } HandleCharacterDeletedListHelper(foundList); return true; } /** * Handles the '.character deleted restore' command, which restores all deleted characters which matches the given search string * * The command automatically calls '.character deleted list' command with the search string to show all restored characters. * * @see ChatHandler::HandleCharacterDeletedRestoreHelper * @see ChatHandler::HandleCharacterDeletedListCommand * @see ChatHandler::HandleCharacterDeletedDeleteCommand * * @param args the search string which either contains a player GUID or a part of the character-name */ bool ChatHandler::HandleCharacterDeletedRestoreCommand(char* args) { // It is required to submit at least one argument if (!*args) { return false; } std::string searchString; std::string newCharName; uint32 newAccount = 0; // GCC by some strange reason fail build code without temporary variable std::istringstream params(args); params >> searchString >> newCharName >> newAccount; DeletedInfoList foundList; if (!GetDeletedCharacterInfoList(foundList, searchString)) { return false; } if (foundList.empty()) { SendSysMessage(LANG_CHARACTER_DELETED_LIST_EMPTY); return false; } SendSysMessage(LANG_CHARACTER_DELETED_RESTORE); HandleCharacterDeletedListHelper(foundList); if (newCharName.empty()) { // Drop nonexistent account cases for (DeletedInfoList::iterator itr = foundList.begin(); itr != foundList.end(); ++itr) { HandleCharacterDeletedRestoreHelper(*itr); } } else if (foundList.size() == 1 && normalizePlayerName(newCharName)) { DeletedInfo delInfo = foundList.front(); // update name delInfo.name = newCharName; // if new account provided update deleted info if (newAccount && newAccount != delInfo.accountId) { delInfo.accountId = newAccount; sAccountMgr.GetName(newAccount, delInfo.accountName); } HandleCharacterDeletedRestoreHelper(delInfo); } else { SendSysMessage(LANG_CHARACTER_DELETED_ERR_RENAME); } return true; } /** * Handles the '.character deleted old' command, which completely deletes all deleted characters deleted with some days ago * * @see Player::DeleteOldCharacters * @see Player::DeleteFromDB * @see ChatHandler::HandleCharacterDeletedDeleteCommand * @see ChatHandler::HandleCharacterDeletedListCommand * @see ChatHandler::HandleCharacterDeletedRestoreCommand * * @param args the search string which either contains a player GUID or a part of the character-name */ bool ChatHandler::HandleCharacterDeletedOldCommand(char* args) { int32 keepDays = sWorld.getConfig(CONFIG_UINT32_CHARDELETE_KEEP_DAYS); if (!ExtractOptInt32(&args, keepDays, sWorld.getConfig(CONFIG_UINT32_CHARDELETE_KEEP_DAYS))) { return false; } if (keepDays < 0) { return false; } Player::DeleteOldCharacters((uint32)keepDays); return true; } /********************************************************************** CommandTable : commandTable /***********************************************************************/ void ChatHandler::HandleCharacterLevel(Player* player, ObjectGuid player_guid, uint32 oldlevel, uint32 newlevel) { if (player) { player->GiveLevel(newlevel); player->InitTalentForLevel(); player->SetUInt32Value(PLAYER_XP, 0); if (needReportToTarget(player)) { if (oldlevel == newlevel) { ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_PROGRESS_RESET, GetNameLink().c_str()); } else if (oldlevel < newlevel) { ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_UP, GetNameLink().c_str(), newlevel); } else // if(oldlevel > newlevel) { ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_DOWN, GetNameLink().c_str(), newlevel); } } } else { // update level and XP at level, all other will be updated at loading CharacterDatabase.PExecute("UPDATE `characters` SET `level` = '%u', `xp` = 0 WHERE `guid` = '%u'", newlevel, player_guid.GetCounter()); } } bool ChatHandler::HandleReviveCommand(char* args) { Player* target; ObjectGuid target_guid; if (!ExtractPlayerTarget(&args, &target, &target_guid)) { return false; } if (target) { target->ResurrectPlayer(0.5f); target->SpawnCorpseBones(); } else // will resurrected at login without corpse { sObjectAccessor.ConvertCorpseForPlayer(target_guid); } return true; } bool ChatHandler::HandleDismountCommand(char* /*args*/) { Player* player = m_session->GetPlayer(); // If player is not mounted, so go out :) if (!player->IsMounted()) { SendSysMessage(LANG_CHAR_NON_MOUNTED); SetSentErrorMessage(true); return false; } if (player->IsTaxiFlying()) { SendSysMessage(LANG_YOU_IN_FLIGHT); SetSentErrorMessage(true); return false; } player->Unmount(); player->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); return true; } bool ChatHandler::HandleLinkGraveCommand(char* args) { uint32 g_id; if (!ExtractUInt32(&args, g_id)) { return false; } char* teamStr = ExtractLiteralArg(&args); Team g_team; if (!teamStr) { g_team = TEAM_BOTH_ALLOWED; } else if (strncmp(teamStr, "horde", strlen(teamStr)) == 0) { g_team = HORDE; } else if (strncmp(teamStr, "alliance", strlen(teamStr)) == 0) { g_team = ALLIANCE; } else { return false; } WorldSafeLocsEntry const* graveyard = sWorldSafeLocsStore.LookupEntry(g_id); if (!graveyard) { PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, g_id); SetSentErrorMessage(true); return false; } Player* player = m_session->GetPlayer(); uint32 zoneId = player->GetZoneId(); AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId); if (!areaEntry || areaEntry->zone != 0) { PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, g_id, zoneId); SetSentErrorMessage(true); return false; } if (sObjectMgr.AddGraveYardLink(g_id, zoneId, g_team)) { PSendSysMessage(LANG_COMMAND_GRAVEYARDLINKED, g_id, zoneId); } else { PSendSysMessage(LANG_COMMAND_GRAVEYARDALRLINKED, g_id, zoneId); } return true; } // move item to other slot bool ChatHandler::HandleItemMoveCommand(char* args) { if (!*args) { return false; } uint8 srcslot, dstslot; char* pParam1 = strtok(args, " "); if (!pParam1) { return false; } char* pParam2 = strtok(NULL, " "); if (!pParam2) { return false; } srcslot = (uint8)atoi(pParam1); dstslot = (uint8)atoi(pParam2); if (srcslot == dstslot) { return true; } Player* player = m_session->GetPlayer(); if (!player->IsValidPos(INVENTORY_SLOT_BAG_0, srcslot, true)) { return false; } // can be autostore pos if (!player->IsValidPos(INVENTORY_SLOT_BAG_0, dstslot, false)) { return false; } uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcslot); uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot); player->SwapItem(src, dst); return true; } bool ChatHandler::HandleCooldownCommand(char* args) { Player* target = getSelectedPlayer(); if (!target) { SendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); return false; } std::string tNameLink = GetNameLink(target); if (!*args) { target->RemoveAllSpellCooldown(); PSendSysMessage(LANG_REMOVEALL_COOLDOWN, tNameLink.c_str()); } else { // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form uint32 spell_id = ExtractSpellIdFromLink(&args); if (!spell_id) { return false; } if (!sSpellStore.LookupEntry(spell_id)) { PSendSysMessage(LANG_UNKNOWN_SPELL, target == m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str()); SetSentErrorMessage(true); return false; } target->RemoveSpellCooldown(spell_id, true); PSendSysMessage(LANG_REMOVE_COOLDOWN, spell_id, target == m_session->GetPlayer() ? GetMangosString(LANG_YOU) : tNameLink.c_str()); } return true; } bool ChatHandler::HandleSaveCommand(char* /*args*/) { Player* player = m_session->GetPlayer(); // save GM account without delay and output message (testing, etc) if (GetAccessLevel() > SEC_PLAYER) { 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_UINT32_INTERVAL_SAVE); if (save_interval == 0 || (save_interval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= save_interval - 20 * IN_MILLISECONDS)) { player->SaveToDB(); } return true; } // Save all players in the world bool ChatHandler::HandleSaveAllCommand(char* /*args*/) { sObjectAccessor.SaveAllPlayers(); SendSysMessage(LANG_PLAYERS_SAVED); return true; } bool ChatHandler::HandleStartCommand(char* /*args*/) { Player* chr = m_session->GetPlayer(); if (chr->IsTaxiFlying()) { 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; } // Enable On\OFF all taxi paths bool ChatHandler::HandleTaxiCheatCommand(char* args) { bool value; if (!ExtractOnOff(&args, value)) { SendSysMessage(LANG_USE_BOL); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (!chr) { chr = m_session->GetPlayer(); } // check online security else if (HasLowerSecurity(chr)) { return false; } if (value) { chr->SetTaxiCheater(true); PSendSysMessage(LANG_YOU_GIVE_TAXIS, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, GetNameLink().c_str()); } } else { chr->SetTaxiCheater(false); PSendSysMessage(LANG_YOU_REMOVE_TAXIS, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, GetNameLink().c_str()); } } return true; } bool ChatHandler::HandleExploreCheatCommand(char* args) { if (!*args) { return false; } int flag = atoi(args); Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } if (flag != 0) { PSendSysMessage(LANG_YOU_SET_EXPLORE_ALL, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_ALL, GetNameLink().c_str()); } } else { PSendSysMessage(LANG_YOU_SET_EXPLORE_NOTHING, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_EXPLORE_SET_NOTHING, GetNameLink().c_str()); } } for (uint8 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i) { if (flag != 0) { m_session->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1 + i, 0xFFFFFFFF); } else { m_session->GetPlayer()->SetFlag(PLAYER_EXPLORED_ZONES_1 + i, 0); } } return true; } bool ChatHandler::HandleLevelUpCommand(char* args) { int32 addlevel = 1; char* nameStr = NULL; if (*args) { nameStr = ExtractOptNotLastArg(&args); // exception opt second arg: .levelup $name if (!ExtractInt32(&args, addlevel)) { if (!nameStr) { nameStr = ExtractArg(&args); } else { return false; } } } Player* target; ObjectGuid target_guid; std::string target_name; if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) { return false; } int32 oldlevel = target ? target->getLevel() : Player::GetLevelFromDB(target_guid); int32 newlevel = oldlevel + addlevel; if (newlevel < 1) { newlevel = 1; } if (newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level { newlevel = STRONG_MAX_LEVEL; } HandleCharacterLevel(target, target_guid, oldlevel, newlevel); if (!m_session || m_session->GetPlayer() != target) // including chr==NULL { std::string nameLink = playerLink(target_name); PSendSysMessage(LANG_YOU_CHANGE_LVL, nameLink.c_str(), newlevel); } return true; } bool ChatHandler::HandleShowAreaCommand(char* args) { if (!*args) { return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } int area = GetAreaFlagByAreaID(atoi(args)); int offset = area / 32; uint32 val = (uint32)(1 << (area % 32)); if (area < 0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } uint32 currFields = chr->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); chr->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val)); SendSysMessage(LANG_EXPLORE_AREA); return true; } bool ChatHandler::HandleHideAreaCommand(char* args) { if (!*args) { return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } int area = GetAreaFlagByAreaID(atoi(args)); int offset = area / 32; uint32 val = (uint32)(1 << (area % 32)); if (area < 0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } uint32 currFields = chr->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); chr->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields ^ val)); SendSysMessage(LANG_UNEXPLORE_AREA); return true; } bool ChatHandler::HandleAddItemCommand(char* args) { char* cId = ExtractKeyFromLink(&args, "Hitem"); if (!cId) { return false; } uint32 itemId = 0; if (!ExtractUInt32(&cId, itemId)) // [name] manual form { std::string itemName = cId; WorldDatabase.escape_string(itemName); QueryResult* result = WorldDatabase.PQuery("SELECT `entry` FROM `item_template` WHERE `name` = '%s'", itemName.c_str()); if (!result) { PSendSysMessage(LANG_COMMAND_COULDNOTFIND, cId); SetSentErrorMessage(true); return false; } itemId = result->Fetch()->GetUInt16(); delete result; } int32 count; if (!ExtractOptInt32(&args, count, 1)) { return false; } uint32 enchant_id = 0; if (!ExtractOptUInt32(&args, enchant_id, 0)) { return false; } // Check enchant id if (enchant_id > 0) { SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id); if (!pEnchant) { return false; } } Player* pl = m_session->GetPlayer(); Player* plTarget = getSelectedPlayer(); if (!plTarget) { plTarget = pl; } DETAIL_LOG(GetMangosString(LANG_ADDITEM), itemId, count); ItemPrototype const* pProto = ObjectMgr::GetItemPrototype(itemId); if (!pProto) { PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); SetSentErrorMessage(true); return false; } // Subtract if (count < 0) { uint32 deletedCount = plTarget->DestroyItemCount(itemId, -count, true, false, /* delete_from_bank */ true, /* delete_from_buyback*/ true); PSendSysMessage(LANG_REMOVEITEM, itemId, -count , deletedCount, GetNameLink(plTarget).c_str()); return true; } // Adding items uint32 noSpaceForCount = 0; // check space and find places ItemPosCountVec dest; uint8 msg = plTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount); if (msg != EQUIP_ERR_OK) // convert to possible store amount { count -= noSpaceForCount; } if (count == 0 || dest.empty()) // can't add any { PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); SetSentErrorMessage(true); return false; } Item* item = plTarget->StoreNewItem(dest, itemId, true, Item::GenerateItemRandomPropertyId(itemId)); if (count > 0 && item) { // Perhaps we can enchant the item if (enchant_id) { item->SetEnchantment(PERM_ENCHANTMENT_SLOT, enchant_id, 0, 0); } // If player is GM, then remove item binding to allow to give it later toplayer // WARNING : If enchant is applied, the item can stay souldbound if it is a soulbound enchant id. // e.g : enchant id is 1900 (Crusader) => Item stays "LINKED WHEN PICKED UP" // if enchant id is 2606 (+30AP) => Item becomes is Soulbound even if added on a GM character if (pl == plTarget) { item->SetBinding(false); } pl->SendNewItem(item, count, false, true); if (pl != plTarget) { plTarget->SendNewItem(item, count, true, false); } } if (noSpaceForCount > 0) { PSendSysMessage(LANG_ITEM_CANNOT_CREATE, itemId, noSpaceForCount); } return true; } bool ChatHandler::HandleAddItemSetCommand(char* args) { uint32 itemsetId; if (!ExtractUint32KeyFromLink(&args, "Hitemset", itemsetId)) { return false; } // prevent generation all items with itemset field value '0' if (itemsetId == 0) { PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemsetId); SetSentErrorMessage(true); return false; } Player* pl = m_session->GetPlayer(); Player* plTarget = getSelectedPlayer(); if (!plTarget) { plTarget = pl; } DETAIL_LOG(GetMangosString(LANG_ADDITEMSET), itemsetId); bool found = false; for (uint32 id = 0; id < sItemStorage.GetMaxEntry(); ++id) { ItemPrototype const* pProto = sItemStorage.LookupEntry<ItemPrototype>(id); if (!pProto) { continue; } if (pProto->ItemSet == itemsetId) { found = true; ItemPosCountVec dest; InventoryResult msg = plTarget->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, pProto->ItemId, 1); if (msg == EQUIP_ERR_OK) { Item* item = plTarget->StoreNewItem(dest, pProto->ItemId, true); // remove binding (let GM give it to another player later) if (pl == plTarget) { item->SetBinding(false); } pl->SendNewItem(item, 1, false, true); if (pl != plTarget) { plTarget->SendNewItem(item, 1, true, false); } } else { pl->SendEquipError(msg, NULL, NULL, pProto->ItemId); PSendSysMessage(LANG_ITEM_CANNOT_CREATE, pProto->ItemId, 1); } } } if (!found) { PSendSysMessage(LANG_NO_ITEMS_FROM_ITEMSET_FOUND, itemsetId); SetSentErrorMessage(true); return false; } return true; } bool ChatHandler::HandleMaxSkillCommand(char* /*args*/) { Player* SelectedPlayer = getSelectedPlayer(); if (!SelectedPlayer) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // each skills that have max skill value dependent from level seted to current level max skill value SelectedPlayer->UpdateSkillsToMaxSkillsForLevel(); return true; } bool ChatHandler::HandleSetSkillCommand(char* args) { Player* target = getSelectedPlayer(); if (!target) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // number or [name] Shift-click form |color|Hskill:skill_id|h[name]|h|r char* skill_p = ExtractKeyFromLink(&args, "Hskill"); if (!skill_p) { return false; } int32 skill; if (!ExtractInt32(&skill_p, skill)) { return false; } int32 level; if (!ExtractInt32(&args, level)) { return false; } int32 maxskill; if (!ExtractOptInt32(&args, maxskill, target->GetPureMaxSkillValue(skill))) { return false; } if (skill <= 0) { PSendSysMessage(LANG_INVALID_SKILL_ID, skill); SetSentErrorMessage(true); return false; } SkillLineEntry const* sl = sSkillLineStore.LookupEntry(skill); if (!sl) { PSendSysMessage(LANG_INVALID_SKILL_ID, skill); SetSentErrorMessage(true); return false; } std::string tNameLink = GetNameLink(target); if (!target->GetSkillValue(skill)) { PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, sl->name[GetSessionDbcLocale()]); SetSentErrorMessage(true); return false; } if (level <= 0 || level > maxskill || maxskill <= 0) { return false; } target->SetSkill(skill, level, maxskill); PSendSysMessage(LANG_SET_SKILL, skill, sl->name[GetSessionDbcLocale()], tNameLink.c_str(), level, maxskill); return true; } bool ChatHandler::HandleCombatStopCommand(char* args) { Player* target; if (!ExtractPlayerTarget(&args, &target)) { return false; } // check online security if (HasLowerSecurity(target)) { return false; } target->CombatStop(); target->GetHostileRefManager().deleteReferences(); return true; } bool ChatHandler::HandleRepairitemsCommand(char* args) { Player* target; if (!ExtractPlayerTarget(&args, &target)) { return false; } // check online security if (HasLowerSecurity(target)) { return false; } // Repair items target->DurabilityRepairAll(false, 0); PSendSysMessage(LANG_YOU_REPAIR_ITEMS, GetNameLink(target).c_str()); if (needReportToTarget(target)) { ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, GetNameLink().c_str()); } return true; } // Edit Player HP bool ChatHandler::HandleModifyHPCommand(char* args) { if (!*args) { return false; } int32 hp = atoi(args); int32 hpm = atoi(args); if (hp <= 0 || hpm <= 0 || hpm < hp) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } PSendSysMessage(LANG_YOU_CHANGE_HP, GetNameLink(chr).c_str(), hp, hpm); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_HP_CHANGED, GetNameLink().c_str(), hp, hpm); } chr->SetMaxHealth(hpm); chr->SetHealth(hp); return true; } // Edit Player Mana bool ChatHandler::HandleModifyManaCommand(char* args) { if (!*args) { return false; } int32 mana = atoi(args); int32 manam = atoi(args); if (mana <= 0 || manam <= 0 || manam < mana) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } PSendSysMessage(LANG_YOU_CHANGE_MANA, GetNameLink(chr).c_str(), mana, manam); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_MANA_CHANGED, GetNameLink().c_str(), mana, manam); } chr->SetMaxPower(POWER_MANA, manam); chr->SetPower(POWER_MANA, mana); return true; } // Edit Player Energy bool ChatHandler::HandleModifyEnergyCommand(char* args) { if (!*args) { return false; } int32 energy = atoi(args) * 10; int32 energym = atoi(args) * 10; if (energy <= 0 || energym <= 0 || energym < energy) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (!chr) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } PSendSysMessage(LANG_YOU_CHANGE_ENERGY, GetNameLink(chr).c_str(), energy / 10, energym / 10); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, GetNameLink().c_str(), energy / 10, energym / 10); } chr->SetMaxPower(POWER_ENERGY, energym); chr->SetPower(POWER_ENERGY, energy); DETAIL_LOG(GetMangosString(LANG_CURRENT_ENERGY), chr->GetMaxPower(POWER_ENERGY)); return true; } // Edit Player Rage bool ChatHandler::HandleModifyRageCommand(char* args) { if (!*args) { return false; } int32 rage = atoi(args) * 10; int32 ragem = atoi(args) * 10; if (rage <= 0 || ragem <= 0 || ragem < rage) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } PSendSysMessage(LANG_YOU_CHANGE_RAGE, GetNameLink(chr).c_str(), rage / 10, ragem / 10); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, GetNameLink().c_str(), rage / 10, ragem / 10); } chr->SetMaxPower(POWER_RAGE, ragem); chr->SetPower(POWER_RAGE, rage); return true; } // Edit Player TP bool ChatHandler::HandleModifyTalentCommand(char* args) { if (!*args) { return false; } int tp = atoi(args); if (tp < 0) { return false; } Player* target = getSelectedPlayer(); if (!target) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(target)) { return false; } target->SetFreeTalentPoints(tp); return true; } // Edit Player Aspeed bool ChatHandler::HandleModifyASpeedCommand(char* args) { if (!*args) { return false; } float modSpeed = (float)atof(args); if (modSpeed > sWorld.getConfig(CONFIG_UINT32_GM_MAX_SPEED_FACTOR) || modSpeed < 0.1) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } std::string chrNameLink = GetNameLink(chr); if (chr->IsTaxiFlying()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT, chrNameLink.c_str()); SetSentErrorMessage(true); return false; } PSendSysMessage(LANG_YOU_CHANGE_ASPEED, modSpeed, chrNameLink.c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, GetNameLink().c_str(), modSpeed); } chr->UpdateSpeed(MOVE_WALK, true, modSpeed); chr->UpdateSpeed(MOVE_RUN, true, modSpeed); chr->UpdateSpeed(MOVE_SWIM, true, modSpeed); // chr->UpdateSpeed(MOVE_TURN, true, modSpeed); return true; } // Edit Player Speed bool ChatHandler::HandleModifySpeedCommand(char* args) { if (!*args) { return false; } float modSpeed = (float)atof(args); if (modSpeed > sWorld.getConfig(CONFIG_UINT32_GM_MAX_SPEED_FACTOR) || modSpeed < 0.1) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } std::string chrNameLink = GetNameLink(chr); if (chr->IsTaxiFlying()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT, chrNameLink.c_str()); SetSentErrorMessage(true); return false; } PSendSysMessage(LANG_YOU_CHANGE_SPEED, modSpeed, chrNameLink.c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, GetNameLink().c_str(), modSpeed); } chr->UpdateSpeed(MOVE_RUN, true, modSpeed); return true; } // Edit Player Swim Speed bool ChatHandler::HandleModifySwimCommand(char* args) { if (!*args) { return false; } float modSpeed = (float)atof(args); if (modSpeed > sWorld.getConfig(CONFIG_UINT32_GM_MAX_SPEED_FACTOR) || modSpeed < 0.01f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } std::string chrNameLink = GetNameLink(chr); if (chr->IsTaxiFlying()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT, chrNameLink.c_str()); SetSentErrorMessage(true); return false; } PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, modSpeed, chrNameLink.c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, GetNameLink().c_str(), modSpeed); } chr->UpdateSpeed(MOVE_SWIM, true, modSpeed); return true; } // Edit Player Walk Speed bool ChatHandler::HandleModifyBWalkCommand(char* args) { if (!*args) { return false; } float modSpeed = (float)atof(args); if (modSpeed > sWorld.getConfig(CONFIG_UINT32_GM_MAX_SPEED_FACTOR) || modSpeed < 0.1f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } std::string chrNameLink = GetNameLink(chr); if (chr->IsTaxiFlying()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT, chrNameLink.c_str()); SetSentErrorMessage(true); return false; } PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, modSpeed, chrNameLink.c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetNameLink().c_str(), modSpeed); } chr->UpdateSpeed(MOVE_RUN_BACK, true, modSpeed); return true; } // Edit Player Scale bool ChatHandler::HandleModifyScaleCommand(char* args) { if (!*args) { return false; } float Scale = (float)atof(args); if (Scale > 10.0f || Scale <= 0.0f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } Unit* target = getSelectedUnit(); if (target == NULL) { SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); SetSentErrorMessage(true); return false; } if (target->GetTypeId() == TYPEID_PLAYER) { // check online security if (HasLowerSecurity((Player*)target)) { return false; } PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, GetNameLink((Player*)target).c_str()); if (needReportToTarget((Player*)target)) { ChatHandler((Player*)target).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, GetNameLink().c_str(), Scale); } } target->SetObjectScale(Scale); target->UpdateModelData(); return true; } // Enable Player mount bool ChatHandler::HandleModifyMountCommand(char* args) { if (!*args) { return false; } uint16 mId; float speed = (float)15; uint32 num = atoi(args); switch (num) { case 1: mId = 14340; break; case 2: mId = 4806; break; case 3: mId = 6471; break; case 4: mId = 12345; break; case 5: mId = 6472; break; case 6: mId = 6473; break; case 7: mId = 10670; break; case 8: mId = 10719; break; case 9: mId = 10671; break; case 10: mId = 10672; break; case 11: mId = 10720; break; case 12: mId = 14349; break; case 13: mId = 11641; break; case 14: mId = 12244; break; case 15: mId = 12242; break; case 16: mId = 14578; break; case 17: mId = 14579; break; case 18: mId = 14349; break; case 19: mId = 12245; break; case 20: mId = 14335; break; case 21: mId = 207; break; case 22: mId = 2328; break; case 23: mId = 2327; break; case 24: mId = 2326; break; case 25: mId = 14573; break; case 26: mId = 14574; break; case 27: mId = 14575; break; case 28: mId = 604; break; case 29: mId = 1166; break; case 30: mId = 2402; break; case 31: mId = 2410; break; case 32: mId = 2409; break; case 33: mId = 2408; break; case 34: mId = 2405; break; case 35: mId = 14337; break; case 36: mId = 6569; break; case 37: mId = 10661; break; case 38: mId = 10666; break; case 39: mId = 9473; break; case 40: mId = 9476; break; case 41: mId = 9474; break; case 42: mId = 14374; break; case 43: mId = 14376; break; case 44: mId = 14377; break; case 45: mId = 2404; break; case 46: mId = 2784; break; case 47: mId = 2787; break; case 48: mId = 2785; break; case 49: mId = 2736; break; case 50: mId = 2786; break; case 51: mId = 14347; break; case 52: mId = 14346; break; case 53: mId = 14576; break; case 54: mId = 9695; break; case 55: mId = 9991; break; case 56: mId = 6448; break; case 57: mId = 6444; break; case 58: mId = 6080; break; case 59: mId = 6447; break; case 60: mId = 4805; break; case 61: mId = 9714; break; case 62: mId = 6448; break; case 63: mId = 6442; break; case 64: mId = 14632; break; case 65: mId = 14332; break; case 66: mId = 14331; break; case 67: mId = 8469; break; case 68: mId = 2830; break; case 69: mId = 2346; break; default: SendSysMessage(LANG_NO_MOUNT); SetSentErrorMessage(true); return false; } Player* chr = getSelectedPlayer(); if (!chr) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } PSendSysMessage(LANG_YOU_GIVE_MOUNT, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_MOUNT_GIVED, GetNameLink().c_str()); } chr->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); chr->Mount(mId); WorldPacket data(SMSG_FORCE_RUN_SPEED_CHANGE, (8 + 4 + 4)); data << chr->GetPackGUID(); data << (uint32)0; data << float(speed); chr->SendMessageToSet(&data, true); data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, (8 + 4 + 4)); data << chr->GetPackGUID(); data << (uint32)0; data << float(speed); chr->SendMessageToSet(&data, true); return true; } // Edit Player money bool ChatHandler::HandleModifyMoneyCommand(char* args) { if (!*args) { return false; } Player* chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(chr)) { return false; } int32 addmoney = atoi(args); uint32 moneyuser = chr->GetMoney(); if (addmoney < 0) { int32 newmoney = int32(moneyuser) + addmoney; DETAIL_LOG(GetMangosString(LANG_CURRENT_MONEY), moneyuser, addmoney, newmoney); if (newmoney <= 0) { PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, GetNameLink().c_str()); } chr->SetMoney(0); } else { if (newmoney > MAX_MONEY_AMOUNT) { newmoney = MAX_MONEY_AMOUNT; } PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, GetNameLink().c_str(), abs(addmoney)); } chr->SetMoney(newmoney); } } else { PSendSysMessage(LANG_YOU_GIVE_MONEY, addmoney, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) { ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, GetNameLink().c_str(), addmoney); } if (addmoney >= MAX_MONEY_AMOUNT) { chr->SetMoney(MAX_MONEY_AMOUNT); } else { chr->ModifyMoney(addmoney); } } DETAIL_LOG(GetMangosString(LANG_NEW_MONEY), moneyuser, addmoney, chr->GetMoney()); return true; } bool ChatHandler::HandleModifyDrunkCommand(char* args) { if (!*args) { return false; } uint32 drunklevel = (uint32)atoi(args); if (drunklevel > 100) { drunklevel = 100; } uint16 drunkMod = drunklevel * 0xFFFF / 100; m_session->GetPlayer()->SetDrunkValue(drunkMod); return true; } bool ChatHandler::HandleModifyRepCommand(char* args) { if (!*args) { return false; } Player* target = getSelectedPlayer(); if (!target) { SendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); return false; } // check online security if (HasLowerSecurity(target)) { return false; } uint32 factionId; if (!ExtractUint32KeyFromLink(&args, "Hfaction", factionId)) { return false; } if (!factionId) { return false; } int32 amount = 0; if (!ExtractInt32(&args, amount)) { char* rankTxt = ExtractLiteralArg(&args); if (!rankTxt) { return false; } std::string rankStr = rankTxt; std::wstring wrankStr; if (!Utf8toWStr(rankStr, wrankStr)) { return false; } wstrToLower(wrankStr); int r = 0; amount = -42000; for (; r < MAX_REPUTATION_RANK; ++r) { std::string rank = GetMangosString(ReputationRankStrIndex[r]); if (rank.empty()) { continue; } std::wstring wrank; if (!Utf8toWStr(rank, wrank)) { continue; } wstrToLower(wrank); if (wrank.substr(0, wrankStr.size()) == wrankStr) { int32 delta; if (!ExtractOptInt32(&args, delta, 0) || (delta < 0) || (delta > ReputationMgr::PointsInRank[r] - 1)) { PSendSysMessage(LANG_COMMAND_FACTION_DELTA, (ReputationMgr::PointsInRank[r] - 1)); SetSentErrorMessage(true); return false; } amount += delta; break; } amount += ReputationMgr::PointsInRank[r]; } if (r >= MAX_REPUTATION_RANK) { PSendSysMessage(LANG_COMMAND_FACTION_INVPARAM, rankTxt); SetSentErrorMessage(true); return false; } } FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId); if (!factionEntry) { PSendSysMessage(LANG_COMMAND_FACTION_UNKNOWN, factionId); SetSentErrorMessage(true); return false; } if (factionEntry->reputationListID < 0) { PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[GetSessionDbcLocale()], factionId); SetSentErrorMessage(true); return false; } target->GetReputationMgr().SetReputation(factionEntry, amount); PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[GetSessionDbcLocale()], factionId, GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry)); return true; } bool ChatHandler::HandleModifyGenderCommand(char* args) { if (!*args) { return false; } Player* player = getSelectedPlayer(); if (!player) { PSendSysMessage(LANG_PLAYER_NOT_FOUND); SetSentErrorMessage(true); return false; } PlayerInfo const* info = sObjectMgr.GetPlayerInfo(player->getRace(), player->getClass()); if (!info) { return false; } char* gender_str = args; int gender_len = strlen(gender_str); Gender gender; if (!strncmp(gender_str, "male", gender_len)) // MALE { if (player->getGender() == GENDER_MALE) { return true; } gender = GENDER_MALE; } else if (!strncmp(gender_str, "female", gender_len)) // FEMALE { if (player->getGender() == GENDER_FEMALE) { return true; } gender = GENDER_FEMALE; } else { SendSysMessage(LANG_MUST_MALE_OR_FEMALE); SetSentErrorMessage(true); return false; } // Set gender player->SetByteValue(UNIT_FIELD_BYTES_0, 2, gender); player->SetUInt16Value(PLAYER_BYTES_3, 0, uint16(gender) | (player->GetDrunkValue() & 0xFFFE)); // Change display ID player->InitDisplayIds(); char const* gender_full = gender ? "female" : "male"; PSendSysMessage(LANG_YOU_CHANGE_GENDER, player->GetName(), gender_full); if (needReportToTarget(player)) { ChatHandler(player).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full, GetNameLink().c_str()); } return true; }