bool ChatHandler::HandleRenameAllCharacter(const char * args, WorldSession * m_session) { uint32 uCount = 0; uint32 ts = getMSTime(); QueryResult * result = CharacterDatabase.Query("SELECT guid, name FROM characters"); if( result ) { do { uint32 uGuid = result->Fetch()[0].GetUInt32(); const char * pName = result->Fetch()[1].GetString(); size_t szLen = strlen(pName); if( !VerifyName(pName, szLen) ) { printf("renaming character %s, %u\n", pName,uGuid); Player* pPlayer = objmgr.GetPlayer(uGuid); if( pPlayer != NULL ) { pPlayer->rename_pending = true; pPlayer->GetSession()->SystemMessage("Your character has had a force rename set, you will be prompted to rename your character at next login in conformance with server rules."); } CharacterDatabase.WaitExecute("UPDATE characters SET forced_rename_pending = 1 WHERE guid = %u", uGuid); ++uCount; } } while (result->NextRow()); delete result; } SystemMessage(m_session, "Procedure completed in %u ms. %u character(s) forced to rename.", getMSTime() - ts, uCount); return true; }
bool ChatHandler::HandleRenameCommand(const char * args, WorldSession * m_session) { // prevent buffer overflow if(strlen(args) > 100) return false; char name1[100]; char name2[100]; if(sscanf(args, "%s %s", name1, name2) != 2) return false; if(VerifyName(name2, strlen(name2)) == false) { RedSystemMessage(m_session, "That name is invalid or contains invalid characters."); return true; } string new_name = name2; PlayerInfo * pi = objmgr.GetPlayerInfoByName(name1); if(pi == 0) { RedSystemMessage(m_session, "Player not found with this name."); return true; } if( objmgr.GetPlayerInfoByName(new_name.c_str()) != NULL ) { RedSystemMessage(m_session, "Player found with this name in use already."); return true; } objmgr.RenamePlayerInfo(pi, pi->name, new_name.c_str()); free(pi->name); pi->name = strdup(new_name.c_str()); // look in world for him Player* plr = objmgr.GetPlayer(pi->guid); if(plr != 0) { plr->SetName(new_name); BlueSystemMessageToPlr(plr, "%s changed your name to '%s'.", m_session->GetPlayer()->GetName(), new_name.c_str()); plr->SaveToDB(false); } else { CharacterDatabase.WaitExecute("UPDATE characters SET name = '%s' WHERE guid = %u", CharacterDatabase.EscapeString(new_name).c_str(), (uint32)pi->guid); } GreenSystemMessage(m_session, "Changed name of '%s' to '%s'.", (char*)name1, (char*)name2); sGMLog.writefromsession(m_session, "renamed character %s (GUID: %u) to %s", (char*)name1, pi->guid, (char*)name2); sPlrLog.writefromsession(m_session, "GM renamed character %s (GUID: %u) to %s", (char*)name1, pi->guid, ((char*)name2)); return true; }
void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 10); std::string name; uint8 race, class_; recv_data >> name >> race >> class_; recv_data.rpos(0); if(!VerifyName(name.c_str(), name.length())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(g_characterNameFilter->Parse(name, false)) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } //reserved for console whisper if(name == "Console" || name == "console") { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(objmgr.GetPlayerInfoByName(name.c_str()) != 0) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(!sHookInterface.OnNewCharacter(race, class_, this, name.c_str())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if( class_ == CLASS_DEATHKNIGHT && (!HasFlag(ACCOUNT_FLAG_XPACK_02) || !CanCreateDeathKnight() ) ) { OutPacket(SMSG_CHAR_CREATE, 1, "\x3B"); return; } QueryResult * result = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if(result) { if(result->Fetch()[0].GetUInt32() > 0) { // That name is banned! OutPacket(SMSG_CHAR_CREATE, 1, "\x51"); // You cannot use that name delete result; return; } delete result; } // loading characters // checking number of chars is useless since client will not allow to create more than 10 chars // as the 'create' button will not appear (unless we want to decrease maximum number of characters) Player* pNewChar = objmgr.CreatePlayer(); pNewChar->SetSession(this); if(!pNewChar->Create( recv_data )) { // Player not create (race/class problem?) pNewChar->ok_to_remove = true; pNewChar->Destructor(); pNewChar = NULL; return; } pNewChar->UnSetBanned(); pNewChar->addSpell(22027); // Remove Insignia if(pNewChar->getClass() == CLASS_WARLOCK) { pNewChar->AddSummonSpell(416, 3110); // imp fireball pNewChar->AddSummonSpell(417, 19505); pNewChar->AddSummonSpell(1860, 3716); pNewChar->AddSummonSpell(1863, 7814); } // Player created, save it now pNewChar->SaveToDB(true); PlayerInfo *pn=new PlayerInfo; memset(pn, 0, sizeof(PlayerInfo)); pn->guid = pNewChar->GetLowGUID(); pn->name = strdup(pNewChar->GetName()); pn->cl = pNewChar->getClass(); pn->race = pNewChar->getRace(); pn->gender = pNewChar->getGender(); pn->lastLevel = pNewChar->getLevel(); pn->lastZone = pNewChar->GetZoneId(); pn->lastOnline = UNIXTIME; pn->team = pNewChar->GetTeam(); pn->acct = GetAccountId(); objmgr.AddPlayerInfo(pn); pNewChar->ok_to_remove = true; pNewChar->Destructor(); pNewChar = NULL; // CHAR_CREATE_SUCCESS OutPacket(SMSG_CHAR_CREATE, 1, "\x2F"); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); m_lastEnumTime = 0; }
void WorldSession::HandleCharacterCustomization( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 16); uint64 guid; recv_data >> guid; PlayerInfo * pInfo = objmgr.GetPlayerInfo((uint32)guid); if(pInfo == NULL) return; if(pInfo->acct != _accountId) { Disconnect(); // Cheater return; } QueryResult * result = CharacterDatabase.Query("SELECT recustomize FROM characters WHERE guid = %u AND acct = %u", (uint32)guid, _accountId); if(result == 0) { delete result; return; } uint32 recustomize = result[0].Fetch()[0].GetUInt32(); if(recustomize == 0 && !CanUseCommand('z')) { delete result; return; } delete result; string name; recv_data >> name; if(!VerifyName(name.c_str(), name.length())) { uint8 err = CHAR_NAME_INVALID_CHARACTER; OutPacket(SMSG_CHAR_CUSTOMIZE, 1, &err); return; } if(g_characterNameFilter->Parse(name, false)) { uint8 err = CHAR_NAME_RESERVED; OutPacket(SMSG_CHAR_CUSTOMIZE, 1, &err); return; } if(strcmp(pInfo->name, name.c_str()) && objmgr.GetPlayerInfoByName(name.c_str()) != 0) { uint8 err = CHAR_CREATE_NAME_IN_USE; OutPacket(SMSG_CHAR_CUSTOMIZE, 1, &err); return; } result = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if(result) { if(result->Fetch()[0].GetUInt32() > 0) { // That name is banned! uint8 err = CHAR_CREATE_NAME_IN_USE; OutPacket(SMSG_CHAR_CUSTOMIZE, 1, &err); // You cannot use that name delete result; return; } delete result; } CapitalizeString(name); // Correct capitalization uint8 gender,skin,face,hairStyle,hairColor,facialHair; recv_data >> gender >> skin >> hairColor >> hairStyle >> facialHair >> face; result = CharacterDatabase.Query("SELECT bytes2 FROM characters WHERE guid = '%u'", (uint32)guid); if(result == NULL) return; Field * f = result->Fetch(); uint32 bytes2 = f[0].GetUInt32(); bytes2 &= 0xFFFFFF00; // Delete facial hair bytes2 |= facialHair; uint32 bytes = ((skin) | (face << 8) | (hairStyle << 16) | (hairColor << 24)); pInfo->gender = gender; objmgr.RenamePlayerInfo(pInfo, pInfo->name, name.c_str()); CharacterDatabase.WaitExecute("UPDATE characters SET name = '%s', gender = '%u', bytes = '%u', bytes2 = '%u', recustomize = 0 WHERE guid = '%u'", name.c_str(), gender, bytes, bytes2, (uint32)guid); WorldPacket data(SMSG_CHAR_CUSTOMIZE, 15+(name.size()+1)); data << uint8(RESPONSE_SUCCESS); data << uint64(guid); data << name; data << uint8(gender); data << uint8(skin); data << uint8(face); data << uint8(hairStyle); data << uint8(hairColor); data << uint8(facialHair); SendPacket(&data); Log.Debug("CharacterHandler", "Received CMSG_CHAR_CUSTOMIZE."); }
void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) { CHECK_PACKET_SIZE(recv_data, 10); std::string name; uint8 race, class_; recv_data >> name >> race >> class_; recv_data.rpos(0); if(!VerifyName(name.c_str(), name.length())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(g_characterNameFilter->Parse(name, false)) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(objmgr.GetPlayerInfoByName(name.c_str()) != 0) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } if(!sHookInterface.OnNewCharacter(race, class_, this, name.c_str())) { OutPacket(SMSG_CHAR_CREATE, 1, "\x32"); return; } QueryResult * result = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if(result) { if(result->Fetch()[0].GetUInt32() > 0) { // That name is banned! OutPacket(SMSG_CHAR_CREATE, 1, "\x51"); // You cannot use that name delete result; return; } delete result; } // loading characters //checking number of chars is useless since client will not allow to create more than 10 chars //as the 'create' button will not appear (unless we want to decrease maximum number of characters) Player * pNewChar = objmgr.CreatePlayer(); pNewChar->SetSession(this); if(!pNewChar->Create( recv_data )) { // failed. pNewChar->ok_to_remove = true; delete pNewChar; return; } //Same Faction limitation only applies to PVP and RPPVP realms :) uint32 realmType = sLogonCommHandler.GetRealmType(); if( !HasGMPermissions() && realmType == REALM_PVP && _side < 0 ) { if( ((pNewChar->GetTeam()== 0) && (_side == 1)) || ((pNewChar->GetTeam()== 1) && (_side == 0)) ) { pNewChar->ok_to_remove = true; delete pNewChar; WorldPacket data(1); data.SetOpcode(SMSG_CHAR_CREATE); data << (uint8)ALL_CHARS_ON_PVP_REALM_MUST_AT_SAME_SIDE+1; SendPacket( &data ); return; } } pNewChar->UnSetBanned(); pNewChar->addSpell(22027); // Remove Insignia if(pNewChar->getClass() == WARLOCK) { pNewChar->AddSummonSpell(416, 3110); // imp fireball pNewChar->AddSummonSpell(417, 19505); pNewChar->AddSummonSpell(1860, 3716); pNewChar->AddSummonSpell(1863, 7814); } pNewChar->SaveToDB(true); PlayerInfo *pn=new PlayerInfo ; pn->guid = pNewChar->GetLowGUID(); pn->name = strdup(pNewChar->GetName()); pn->cl = pNewChar->getClass(); pn->race = pNewChar->getRace(); pn->gender = pNewChar->getGender(); pn->m_Group=0; pn->subGroup=0; pn->m_loggedInPlayer=NULL; pn->team = pNewChar->GetTeam (); pn->guild=NULL; pn->guildRank=NULL; pn->guildMember=NULL; #ifdef VOICE_CHAT pn->groupVoiceId = -1; #endif objmgr.AddPlayerInfo(pn); pNewChar->ok_to_remove = true; delete pNewChar; // CHAR_CREATE_SUCCESS OutPacket(SMSG_CHAR_CREATE, 1, "\x2F"); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); }
void WorldSession::HandleCharRenameOpcode(WorldPacket & recv_data) { WorldPacket data( SMSG_CHAR_RENAME, recv_data.size() + 1 ); uint64 guid; string name; recv_data >> guid >> name; PlayerInfo * pi = objmgr.GetPlayerInfo((uint32)guid); if(pi == 0) return; QueryResult * result = CharacterDatabase.Query("SELECT forced_rename_pending FROM characters WHERE guid = %u AND acct = %u", (uint32)guid, _accountId); if(result == 0) { delete result; return; } delete result; // Check name for rule violation. LoginErrorCode err = VerifyName( name.c_str(), name.length() ); if( err != CHAR_NAME_SUCCESS ) { data << uint8( err ); data << guid << name; SendPacket(&data); return; } QueryResult * result2 = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if(result2) { if(result2->Fetch()[0].GetUInt32() > 0) { // That name is banned! data << uint8( CHAR_NAME_PROFANE ); data << guid << name; SendPacket(&data); } delete result2; } // Check if name is in use. if( objmgr.GetPlayerInfoByName( name.c_str() ) != NULL ) { data << uint8( CHAR_CREATE_NAME_IN_USE ); data << guid << name; SendPacket(&data); return; } // correct capitalization CapitalizeString(name); objmgr.RenamePlayerInfo(pi, pi->name, name.c_str()); sPlrLog.writefromsession(this, "a rename was pending. renamed character %s (GUID: %u) to %s.", pi->name, pi->guid, name.c_str()); // If we're here, the name is okay. free(pi->name); pi->name = strdup(name.c_str()); CharacterDatabase.WaitExecute("UPDATE characters SET name = '%s' WHERE guid = %u", name.c_str(), (uint32)guid); CharacterDatabase.WaitExecute("UPDATE characters SET forced_rename_pending = 0 WHERE guid = %u", (uint32)guid); data << uint8( RESPONSE_SUCCESS ) << guid << name; SendPacket( &data ); }
void WorldSession::HandleCharCreateOpcode(WorldPacket & recv_data) { CHECK_PACKET_SIZE(recv_data, 10); std::string name; uint8 race, class_; recv_data >> name >> race >> class_; recv_data.rpos(0); LoginErrorCode res = VerifyName(name.c_str(), name.length()); if (res != E_CHAR_NAME_SUCCESS) { OutPacket(SMSG_CHAR_CREATE, 1, &res); return; } res = g_characterNameFilter->Parse(name, false) ? E_CHAR_NAME_PROFANE : E_CHAR_NAME_SUCCESS; if (res != E_CHAR_NAME_SUCCESS) { OutPacket(SMSG_CHAR_CREATE, 1, &res); return; } res = objmgr.GetPlayerInfoByName(name.c_str()) == NULL ? E_CHAR_CREATE_SUCCESS : E_CHAR_CREATE_NAME_IN_USE; if (res != E_CHAR_CREATE_SUCCESS) { OutPacket(SMSG_CHAR_CREATE, 1, &res); return; } res = sHookInterface.OnNewCharacter(race, class_, this, name.c_str()) ? E_CHAR_CREATE_SUCCESS : E_CHAR_CREATE_ERROR; if (res != E_CHAR_CREATE_SUCCESS) { OutPacket(SMSG_CHAR_CREATE, 1, &res); return; } QueryResult* result = CharacterDatabase.Query("SELECT COUNT(*) FROM banned_names WHERE name = '%s'", CharacterDatabase.EscapeString(name).c_str()); if (result) { if (result->Fetch()[0].GetUInt32() > 0) { // That name is banned! OutPacket(SMSG_CHAR_CREATE, 1, CHAR_NAME_PROFANE); delete result; return; } delete result; } // Check if player got Death Knight already on this realm. if (Config.OptionalConfig.GetBoolDefault("ClassOptions", "DeathKnightLimit", true) && has_dk && (class_ == DEATHKNIGHT)) { OutPacket(SMSG_CHAR_CREATE, 1, CHAR_CREATE_UNIQUE_CLASS_LIMIT); return; } // loading characters // Check the number of characters, so we can't make over 10. // They're able to manage to create >10 sometimes, not exactly sure how .. result = CharacterDatabase.Query("SELECT COUNT(*) FROM characters WHERE acct = %u", GetAccountId()); if (result) { if (result->Fetch()[0].GetUInt32() >= 10) { // We can't make any more characters. OutPacket(SMSG_CHAR_CREATE, 1, CHAR_CREATE_SERVER_LIMIT); delete result; return; } delete result; } Player* pNewChar = objmgr.CreatePlayer(class_); pNewChar->SetSession(this); if (!pNewChar->Create(recv_data)) { // failed. pNewChar->ok_to_remove = true; delete pNewChar; OutPacket(SMSG_CHAR_CREATE, 1, CHAR_CREATE_FAILED); return; } //Same Faction limitation only applies to PVP and RPPVP realms :) uint32 realmType = sLogonCommHandler.GetRealmType(); if (!HasGMPermissions() && realmType == REALMTYPE_PVP && _side >= 0 && !sWorld.crossover_chars) // ceberwow fixed bug { if ((pNewChar->IsTeamAlliance() && (_side == 1)) || (pNewChar->IsTeamHorde() && (_side == 0))) { pNewChar->ok_to_remove = true; delete pNewChar; OutPacket(SMSG_CHAR_CREATE, 1, CHAR_CREATE_PVP_TEAMS_VIOLATION); return; } } //Check if player has a level 55 or higher character on this realm and allow him to create DK. //This check can be turned off in optional.conf if (Config.OptionalConfig.GetBoolDefault("ClassOptions", "DeathKnightPreReq", false) && !has_level_55_char && (class_ == DEATHKNIGHT)) { pNewChar->ok_to_remove = true; delete pNewChar; /* WorldPacket data(1); data.SetOpcode(SMSG_CHAR_CREATE); data << (uint8)56 + 1; // This errorcode is not the actual one. Need to find a real error code. SendPacket( &data ); */ OutPacket(SMSG_CHAR_CREATE, 1, CHAR_CREATE_LEVEL_REQUIREMENT); return; } pNewChar->UnSetBanned(); pNewChar->addSpell(22027); // Remove Insignia if (pNewChar->getClass() == WARLOCK) { pNewChar->AddSummonSpell(416, 3110); // imp fireball pNewChar->AddSummonSpell(417, 19505); pNewChar->AddSummonSpell(1860, 3716); pNewChar->AddSummonSpell(1863, 7814); } pNewChar->SaveToDB(true); PlayerInfo* pn = new PlayerInfo; pn->guid = pNewChar->GetLowGUID(); pn->name = strdup(pNewChar->GetName()); pn->class_ = pNewChar->getClass(); pn->race = pNewChar->getRace(); pn->gender = pNewChar->getGender(); pn->acct = GetAccountId(); pn->m_Group = 0; pn->subGroup = 0; pn->m_loggedInPlayer = NULL; pn->team = pNewChar->GetTeam(); pn->guild = NULL; pn->guildRank = NULL; pn->guildMember = NULL; pn->lastOnline = UNIXTIME; objmgr.AddPlayerInfo(pn); pNewChar->ok_to_remove = true; delete pNewChar; OutPacket(SMSG_CHAR_CREATE, 1, CHAR_CREATE_SUCCESS); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); }