From 192bf4736bd0c5c8e84751d2d17a7dbb2e2945f7 Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 24 Oct 2022 22:43:46 -0300 Subject: [PATCH] feat(Scripts/Commands): Implement character changeaccount command (#13532) * feat(Scripts/Commands): Implement character changeaccount command * strings and stuff * clear unused --- .../rev_1666552438715725700.sql | 8 +++ src/server/game/Miscellaneous/Language.h | 2 + src/server/scripts/Commands/cs_character.cpp | 50 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1666552438715725700.sql diff --git a/data/sql/updates/pending_db_world/rev_1666552438715725700.sql b/data/sql/updates/pending_db_world/rev_1666552438715725700.sql new file mode 100644 index 000000000..f1235ee5c --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1666552438715725700.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `acore_string` WHERE `entry` = 5083; +INSERT INTO `acore_string` (`entry`, `content_default`) VALUES +(5083, 'Character %s (%u) moved from account %s (%u) to account %s (%u).'); + +DELETE FROM `command` WHERE `name` = 'character changeaccount'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('character changeaccount', 3, 'Syntax: .character changeaccount $NewAccountName $Name.\nMoves the specified character to the provided account. \nKicks the player if the character is online.'); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index df6bf3d71..f907ddaf8 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1146,6 +1146,8 @@ enum AcoreStrings LANG_CMD_GOQUEST_INVALID_SYNTAX = 5082, + LANG_CMD_CHAR_CHANGE_ACC_SUCCESS = 5083, + // Room for more strings 5083-9999 // Level requirement notifications diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index e720cda0d..bd34f10bb 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -72,6 +72,7 @@ public: { "customize", HandleCharacterCustomizeCommand, SEC_GAMEMASTER, Console::Yes }, { "changefaction", HandleCharacterChangeFactionCommand, SEC_GAMEMASTER, Console::Yes }, { "changerace", HandleCharacterChangeRaceCommand, SEC_GAMEMASTER, Console::Yes }, + { "changeaccount", HandleCharacterChangeAccountCommand, SEC_ADMINISTRATOR, Console::Yes }, { "check", characterCheckCommandTable }, { "erase", HandleCharacterEraseCommand, SEC_CONSOLE, Console::Yes }, { "deleted", characterDeletedCommandTable }, @@ -1061,6 +1062,55 @@ public: handler->PSendSysMessage("--------------------------------------"); return true; } + + static bool HandleCharacterChangeAccountCommand(ChatHandler* handler, std::string accountName, Optional player) + { + if (!player) + { + player = PlayerIdentifier::FromTargetOrSelf(handler); + } + + if (!player) + { + handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); + handler->SetSentErrorMessage(true); + return false; + } + + if (uint32 accountId = AccountMgr::GetId(accountName)) + { + if (AccountMgr::GetCharactersCount(accountId) >= 10) + { + handler->PSendSysMessage(LANG_ACCOUNT_CHARACTER_LIST_FULL, accountName, accountId); + handler->SetSentErrorMessage(true); + return true; + } + + if (CharacterCacheEntry const* cache = sCharacterCache->GetCharacterCacheByName(player->GetName())) + { + std::string accName; + AccountMgr::GetName(cache->AccountId, accName); + handler->PSendSysMessage(LANG_CMD_CHAR_CHANGE_ACC_SUCCESS, player->GetName(), player->GetGUID().GetCounter(), accName, cache->AccountId, accountName, accountId); + } + + if (player->IsConnected()) + { + player->GetConnectedPlayer()->GetSession()->KickPlayer("CMD char changeaccount"); + } + + CharacterDatabase.Query("UPDATE characters SET account = {} WHERE guid = {}", accountId, player->GetGUID().GetCounter()); + sCharacterCache->UpdateCharacterAccountId(player->GetGUID(), accountId); + + } + else + { + handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName); + handler->SetSentErrorMessage(true); + return true; + } + + return true; + } }; void AddSC_character_commandscript()