aboutsummaryrefslogtreecommitdiff
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
parent34599a46f78bc008233001e68220442a5cf4984a (diff)
[7714] Implement new command .character level for set level provided level. Author: VladimirMangos
--HG-- branch : trunk
-rw-r--r--sql/mangos.sql3
-rw-r--r--sql/updates/7714_01_mangos_command.sql6
-rw-r--r--src/game/Chat.cpp3
-rw-r--r--src/game/Chat.h2
-rw-r--r--src/game/Level3.cpp140
5 files changed, 128 insertions, 26 deletions
diff --git a/sql/mangos.sql b/sql/mangos.sql
index 922be358717..19aba5af7b0 100644
--- a/sql/mangos.sql
+++ b/sql/mangos.sql
@@ -23,7 +23,7 @@ DROP TABLE IF EXISTS `db_version`;
CREATE TABLE `db_version` (
`version` varchar(120) default NULL,
`creature_ai_version` varchar(120) default NULL,
- `required_7706_01_mangos_command` bit(1) default NULL
+ `required_7714_01_mangos_command` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
--
@@ -284,6 +284,7 @@ INSERT INTO `command` VALUES
('cast target',3,'Syntax: .cast target #spellid [triggered]\r\n Selected target will cast #spellid to his victim. If \'trigered\' or part provided then spell casted with triggered flag.'),
('character customize',2,'Syntax: .character customize [$name]\r\n\r\nMark selected in game or by $name in command character for customize at next login.'),
('character delete',4,'Syntax: .character delete $name\r\n\r\nDelete character $name.'),
+('character level',3,'Syntax: .character level [$playername] [#level]\r\n\r\nSet the level of character with $playername (or the selected if not name provided) by #numberoflevels Or +1 if no #numberoflevels provided). If #numberoflevels is omitted, the level will be increase by 1. If #numberoflevels is 0, the same level will be restarted. If no character is selected and name not provided, increase your level. Command can be used for offline character. All stats and dependent values recalculated. At level decrease talents can be reset if need. Also at level decrease equipped items with greater level requirement can be lost.'),
('character rename',2,'Syntax: .character rename [$name]\r\n\r\nMark selected in game or by $name in command character for rename at next login.'),
('combatstop',2,'Syntax: .combatstop [$playername]\r\nStop combat for selected character. If selected non-player then command applied to self. If $playername provided then attempt applied to online player $playername.'),
('commands',0,'Syntax: .commands\r\n\r\nDisplay a list of available commands for your account level.'),
diff --git a/sql/updates/7714_01_mangos_command.sql b/sql/updates/7714_01_mangos_command.sql
new file mode 100644
index 00000000000..a5eeec48b13
--- /dev/null
+++ b/sql/updates/7714_01_mangos_command.sql
@@ -0,0 +1,6 @@
+ALTER TABLE db_version CHANGE COLUMN required_7706_01_mangos_command required_7714_01_mangos_command bit;
+
+DELETE FROM `command` WHERE `name` IN ('character level');
+
+INSERT INTO `command` VALUES
+('character level',3,'Syntax: .character level [$playername] [#level]\r\n\r\nSet the level of character with $playername (or the selected if not name provided) by #numberoflevels Or +1 if no #numberoflevels provided). If #numberoflevels is omitted, the level will be increase by 1. If #numberoflevels is 0, the same level will be restarted. If no character is selected and name not provided, increase your level. Command can be used for offline character. All stats and dependent values recalculated. At level decrease talents can be reset if need. Also at level decrease equipped items with greater level requirement can be lost.');
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
{