diff options
author | jackpoz <giacomopoz@gmail.com> | 2021-04-05 19:44:54 +0200 |
---|---|---|
committer | jackpoz <giacomopoz@gmail.com> | 2021-04-05 19:44:54 +0200 |
commit | 2cea7d000c2205ed06ca3263e61dee51b11a5b0b (patch) | |
tree | bb50917dbfbc9a185f63246f2b90c467d234ca0d /src | |
parent | ee839fee1ec059e618ddcc296c19ed16d336e896 (diff) |
Scripts/Commands: Restore ".character level" command behavior
Restore ".character level" command behavior by setting the level instead of adding the level
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 5fada2a7944..d5a6e348ae2 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -68,7 +68,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 }, @@ -737,6 +737,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->setUInt32(1, player->GetGUID()); + 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) |