aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2021-04-05 19:44:54 +0200
committerShauren <shauren.trinity@gmail.com>2022-03-07 22:25:50 +0100
commit1039f166de782d4c22cb12ab9d8a4496bfc0306f (patch)
tree7a29799ee9329111d505691b731558f2442ee7aa /src
parent6855c81df1226a4086e2587b3f1800579f078321 (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.cpp48
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)