diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Chat.cpp | 3 | ||||
-rw-r--r-- | src/game/Chat.h | 2 | ||||
-rw-r--r-- | src/game/Level3.cpp | 140 |
3 files changed, 120 insertions, 25 deletions
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 865f1a8c38d..0a09326e064 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -112,9 +112,10 @@ ChatCommand * ChatHandler::getCommandTable() static ChatCommand characterCommandTable[] = { - { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterRenameCommand, "", NULL }, { "customize", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterCustomizeCommand, "", NULL }, { "delete", SEC_CONSOLE, true, &ChatHandler::HandleCharacterDeleteCommand, "", NULL }, + { "level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleCharacterLevelCommand, "", NULL }, + { "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleCharacterRenameCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; diff --git a/src/game/Chat.h b/src/game/Chat.h index bcfb676510c..6675094e942 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -127,6 +127,7 @@ class ChatHandler bool HandleCharacterCustomizeCommand(const char * args); bool HandleCharacterDeleteCommand(const char* args); bool HandleCharacterRenameCommand(const char * args); + bool HandleCharacterLevelCommand(const char* args); bool HandleDebugAnimCommand(const char* args); bool HandleDebugArenaCommand(const char * args); @@ -574,6 +575,7 @@ class ChatHandler bool HandleBanHelper(BanMode mode,char const* args); bool HandleBanInfoHelper(uint32 accountid, char const* accountname); bool HandleUnBanHelper(BanMode mode,char const* args); + void HandleCharacterLevel(Player* player, uint64 player_guid, uint32 oldlevel, uint32 newlevel); void SetSentErrorMessage(bool val){ sentErrorMessage = val;}; private: diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index ae1b0933bbf..1253faf03a0 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -4486,6 +4486,121 @@ bool ChatHandler::HandleHoverCommand(const char* args) return true; } +void ChatHandler::HandleCharacterLevel(Player* player, uint64 player_guid, uint32 oldlevel, uint32 newlevel) +{ + if(player) + { + player->GiveLevel(newlevel); + player->InitTalentForLevel(); + player->SetUInt32Value(PLAYER_XP,0); + + if(oldlevel == newlevel) + ChatHandler(player).SendSysMessage(LANG_YOURS_LEVEL_PROGRESS_RESET); + else if(oldlevel < newlevel) + ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_UP,newlevel-oldlevel); + else // if(oldlevel > newlevel) + ChatHandler(player).PSendSysMessage(LANG_YOURS_LEVEL_DOWN,newlevel-oldlevel); + } + else + { + // update level and XP at level, all other will be updated at loading + Tokens values; + Player::LoadValuesArrayFromDB(values,player_guid); + Player::SetUInt32ValueInArray(values,UNIT_FIELD_LEVEL,newlevel); + Player::SetUInt32ValueInArray(values,PLAYER_XP,0); + Player::SaveValuesArrayInDB(values,player_guid); + } +} + +bool ChatHandler::HandleCharacterLevelCommand(const char* args) +{ + char* px = strtok((char*)args, " "); + char* py = strtok((char*)NULL, " "); + + // command format parsing + char* pname = (char*)NULL; + int32 newlevel = 0; + + if(px && py) // .character level $name #level + { + newlevel = atoi(py); + pname = px; + } + else if(px && !py) // .character level $name OR .character level #level + { + if(isalpha(px[0])) // .character level $name + pname = px; + else // .character level #level + newlevel = atoi(px); + } + // // .character level - progress reset + + if(newlevel < 1) + return false; // invalid level + + if(newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level + newlevel = STRONG_MAX_LEVEL; + + // player + Player *chr = NULL; + uint64 chr_guid = 0; + + std::string name; + + if(pname) // player by name + { + name = extractPlayerNameFromLink(pname); + if(name.empty()) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + + chr = objmgr.GetPlayer(name.c_str()); + if(!chr) // not in game + { + chr_guid = objmgr.GetPlayerGUIDByName(name); + if (chr_guid == 0) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + SetSentErrorMessage(true); + return false; + } + } + } + else // player by selection + { + chr = getSelectedPlayer(); + + if (chr == NULL) + { + SendSysMessage(LANG_NO_CHAR_SELECTED); + SetSentErrorMessage(true); + return false; + } + + name = chr->GetName(); + } + + assert(chr || chr_guid); + + int32 oldlevel = chr ? chr->getLevel() : Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,chr_guid); + + if(!px && !py) // .character level - progress reset + newlevel = oldlevel; + + HandleCharacterLevel(chr,chr_guid,oldlevel,newlevel); + + if(m_session->GetPlayer() != chr) // including player==NULL + { + std::string nameLink = playerLink(name); + PSendSysMessage(LANG_YOU_CHANGE_LVL,nameLink.c_str(),newlevel); + } + + return true; +} + bool ChatHandler::HandleLevelUpCommand(const char* args) { char* px = strtok((char*)args, " "); @@ -4560,30 +4675,7 @@ bool ChatHandler::HandleLevelUpCommand(const char* args) if(newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level newlevel = STRONG_MAX_LEVEL; - if(chr) - { - chr->GiveLevel(newlevel); - chr->InitTalentForLevel(); - chr->SetUInt32Value(PLAYER_XP,0); - - if(oldlevel == newlevel) - ChatHandler(chr).SendSysMessage(LANG_YOURS_LEVEL_PROGRESS_RESET); - else - if(oldlevel < newlevel) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_LEVEL_UP,newlevel-oldlevel); - else - if(oldlevel > newlevel) - ChatHandler(chr).PSendSysMessage(LANG_YOURS_LEVEL_DOWN,newlevel-oldlevel); - } - else - { - // update level and XP at level, all other will be updated at loading - Tokens values; - Player::LoadValuesArrayFromDB(values,chr_guid); - Player::SetUInt32ValueInArray(values,UNIT_FIELD_LEVEL,newlevel); - Player::SetUInt32ValueInArray(values,PLAYER_XP,0); - Player::SaveValuesArrayInDB(values,chr_guid); - } + HandleCharacterLevel(chr,chr_guid,oldlevel,newlevel); if(m_session->GetPlayer() != chr) // including chr==NULL { |