Index: src/game/CharacterHandler.cpp =================================================================== --- src/game/CharacterHandler.cpp (revision 3636) +++ src/game/CharacterHandler.cpp (working copy) @@ -35,6 +35,9 @@ #include "Transports.h" #include "Group.h" +// check used symbols in playwer name at creating and rename +static std::string const notAllowedChars = "\t\v\b\f\a\n\r\\\0\"\'\? <>[](){}_=+-|/!@#$%^&*~`.,0123456789"; + void WorldSession::HandleCharEnumOpcode( WorldPacket & recv_data ) { // keys can be non cleared if player open realm list and close it by 'cancel' @@ -105,9 +108,6 @@ normalizePlayerName(name); - // check used symbols - static std::string const notAllowedChars = "\t\v\b\f\a\n\r\\\0\"\'\? <>[](){}_=+-|/!@#$%^&*~`.,0123456789"; - if(name.find_first_of(notAllowedChars)!=name.npos) { data.Initialize( SMSG_CHAR_CREATE, 1 ); @@ -686,3 +686,40 @@ else _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK); } + +void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data) +{ + uint64 guid; + std::string newname; + + recv_data >> guid; + recv_data >> newname; + + // prevent character rename to invalid name + if(newname.size() == 0)/**************/ + { + WorldPacket data( SMSG_CHAR_RENAME, 1 ); + data << (uint8)CHAR_NAME_INVALID_CHARACTER; + SendPacket( &data ); + return; + } + + normalizePlayerName(newname); + + if(newname.find_first_of(notAllowedChars)!=newname.npos) + { + WorldPacket data( SMSG_CHAR_RENAME, 1 ); + data << (uint8)CHAR_NAME_INVALID_CHARACTER;; + SendPacket( &data ); + return; + } + + sDatabase.escape_string(newname); + sDatabase.PQuery("UPDATE `character` set `name` = '%s' WHERE `guid` ='%u'", newname.c_str(), GUID_LOPART(guid)); + + WorldPacket data(SMSG_CHAR_RENAME,1+8+(newname.size()+1)); + data << uint8(0); + data << guid; + data << newname; + SendPacket(&data); +} Index: src/game/Chat.cpp =================================================================== --- src/game/Chat.cpp (revision 3636) +++ src/game/Chat.cpp (working copy) @@ -283,6 +283,7 @@ { "ps", 3, &ChatHandler::HandlePlaySound2Command, "", NULL }, { "scn", 3, &ChatHandler::HandleSendChannelNotifyCommand,"", NULL }, { "scm", 3, &ChatHandler::HandleSendChatMsgCommand, "", NULL }, + { "rename", 2, &ChatHandler::HandleRenameCommand, "", NULL }, //! Development Commands { "setvalue", 3, &ChatHandler::HandleSetValue, "", NULL }, Index: src/game/Chat.h =================================================================== --- src/game/Chat.h (revision 3636) +++ src/game/Chat.h (working copy) @@ -299,6 +299,7 @@ bool HandleRemoveQuest(const char * args); bool HandleSaveAllCommand(const char* args); bool HandleGetItemState(const char * args); + bool HandleRenameCommand(const char * args); Player* getSelectedPlayer(); Creature* getSelectedCreature(); Index: src/game/Level2.cpp =================================================================== --- src/game/Level2.cpp (revision 3636) +++ src/game/Level2.cpp (working copy) @@ -2608,3 +2608,48 @@ return true; } // HandleWpShowCommand + +bool ChatHandler::HandleRenameCommand(const char* args) +{ + Player* target = NULL; + uint64 targetGUID = 0; + + char* px = strtok((char*)args, " "); + + if (px) + { + std::string oldname = px; + normalizePlayerName(oldname); + target = objmgr.GetPlayer(oldname.c_str()); + + if (!target) + targetGUID = objmgr.GetPlayerGUIDByName(oldname.c_str()); + } + + if(!target && !targetGUID) + { + target = getSelectedPlayer(); + } + + if(!target && !targetGUID) + { + SendSysMessage(LANG_PLAYER_NOT_FOUND); + return true; + } + + if(target) + { + target->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_NEED_RENAME); + } + else + { + std::vector values; + Player::LoadValuesArrayFromDB(values, targetGUID); + uint32 flags = Player::GetUInt32ValueFromArray(values, PLAYER_FLAGS); + + Player::SetUInt32ValueInArray(values,PLAYER_FLAGS, flags | PLAYER_FLAGS_NEED_RENAME); + Player::SaveValuesArrayInDB(values,targetGUID); + } + + return true; +} Index: src/game/MiscHandler.cpp =================================================================== --- src/game/MiscHandler.cpp (revision 3636) +++ src/game/MiscHandler.cpp (working copy) @@ -1090,12 +1090,6 @@ GetPlayer()->SetUInt32Value( PLAYER_FIELD_BYTES, temp); } -void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data) -{ - // TODO - // need to be written -} - void WorldSession::HandleWardenDataOpcode(WorldPacket& recv_data) { CHECK_PACKET_SIZE(recv_data,1); Index: src/game/Player.h =================================================================== --- src/game/Player.h (revision 3636) +++ src/game/Player.h (working copy) @@ -289,6 +289,7 @@ PLAYER_FLAGS_GM = 0x00000008, PLAYER_FLAGS_GHOST = 0x00000010, PLAYER_FLAGS_RESTING = 0x00000020, + PLAYER_FLAGS_NEED_RENAME = 0x00000040, // if (flag) then need rename character on next login PLAYER_FLAGS_FFA_PVP = 0x00000080, PLAYER_FLAGS_UNK = 0x00000100, // show PvP in tooltip PLAYER_FLAGS_IN_PVP = 0x00000200,