aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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)