diff options
author | jackpoz <giacomopoz@gmail.com> | 2021-04-05 19:44:54 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-07 22:25:50 +0100 |
commit | 1039f166de782d4c22cb12ab9d8a4496bfc0306f (patch) | |
tree | 7a29799ee9329111d505691b731558f2442ee7aa /src | |
parent | 6855c81df1226a4086e2587b3f1800579f078321 (diff) |
Scripts/Commands: Restore ".character level" command behavior
Restore ".character level" command behavior by setting the level instead of adding the level
(cherry picked from commit 2cea7d000c2205ed06ca3263e61dee51b11a5b0b)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Commands/cs_character.cpp | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 3f57fc91325..b62445e9f4c 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -69,7 +69,7 @@ public: { "changeaccount", HandleCharacterChangeAccountCommand, rbac::RBAC_PERM_COMMAND_CHARACTER_CHANGEACCOUNT, Console::Yes }, { "deleted", characterDeletedCommandTable }, { "erase", HandleCharacterEraseCommand, rbac::RBAC_PERM_COMMAND_CHARACTER_ERASE, Console::Yes }, - { "level", HandleLevelUpCommand, rbac::RBAC_PERM_COMMAND_CHARACTER_LEVEL, Console::Yes }, + { "level", HandleCharacterLevelCommand, rbac::RBAC_PERM_COMMAND_CHARACTER_LEVEL, Console::Yes }, { "rename", HandleCharacterRenameCommand, rbac::RBAC_PERM_COMMAND_CHARACTER_RENAME, Console::Yes }, { "reputation", HandleCharacterReputationCommand, rbac::RBAC_PERM_COMMAND_CHARACTER_REPUTATION, Console::Yes }, { "titles", HandleCharacterTitlesCommand, rbac::RBAC_PERM_COMMAND_CHARACTER_TITLES, Console::Yes }, @@ -734,6 +734,52 @@ public: return true; } + static bool HandleCharacterLevelCommand(ChatHandler* handler, Optional<PlayerIdentifier> player, int16 newlevel) + { + if (!player) + player = PlayerIdentifier::FromTargetOrSelf(handler); + if (!player) + return false; + + uint8 oldlevel = static_cast<uint8>(player->IsConnected() ? player->GetConnectedPlayer()->GetLevel() : sCharacterCache->GetCharacterLevelByGuid(*player)); + + if (newlevel < 1) + newlevel = 1; + + if (newlevel > static_cast<int16>(STRONG_MAX_LEVEL)) + newlevel = static_cast<int16>(STRONG_MAX_LEVEL); + + if (Player* target = player->GetConnectedPlayer()) + { + target->GiveLevel(static_cast<uint8>(newlevel)); + target->InitTalentForLevel(); + target->SetXP(0); + + if (handler->needReportToTarget(target)) + { + if (oldlevel == newlevel) + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_PROGRESS_RESET, handler->GetNameLink().c_str()); + else if (oldlevel < static_cast<uint8>(newlevel)) + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_UP, handler->GetNameLink().c_str(), newlevel); + else // if (oldlevel > newlevel) + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_LEVEL_DOWN, handler->GetNameLink().c_str(), newlevel); + } + } + else + { + // Update level and reset XP, everything else will be updated at login + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_LEVEL); + stmt->setUInt8(0, static_cast<uint8>(newlevel)); + stmt->setUInt64(1, player->GetGUID().GetCounter()); + CharacterDatabase.Execute(stmt); + } + + if (!handler->GetSession() || (handler->GetSession()->GetPlayer() != player->GetConnectedPlayer())) // including chr == NULL + handler->PSendSysMessage(LANG_YOU_CHANGE_LVL, handler->playerLink(*player).c_str(), newlevel); + + return true; + } + static bool HandleLevelUpCommand(ChatHandler* handler, Optional<PlayerIdentifier> player, int16 level) { if (!player) |