aboutsummaryrefslogtreecommitdiff
path: root/src/game/Level3.cpp
diff options
context:
space:
mode:
authormegamage <none@none>2009-04-27 18:15:30 -0500
committermegamage <none@none>2009-04-27 18:15:30 -0500
commitf9c40474410c5d54e408f5074b2dee1ff329c0d5 (patch)
tree1c75e3a8fec6b88f2dec9d482a1d4ca6b27a7fb6 /src/game/Level3.cpp
parent34599a46f78bc008233001e68220442a5cf4984a (diff)
[7714] Implement new command .character level for set level provided level. Author: VladimirMangos
--HG-- branch : trunk
Diffstat (limited to 'src/game/Level3.cpp')
-rw-r--r--src/game/Level3.cpp140
1 files changed, 116 insertions, 24 deletions
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
{