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); WorldPacket data(SMSG_CHAR_CREATE, 1); if(!sWorld.VerifyName(name.c_str(), name.length())) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if(g_characterNameFilter->Parse(name, false)) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } //reserved for console whisper if(name == "Console" || name == "console") { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if(objmgr.GetPlayerInfoByName(name.c_str()) != 0) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if(!sHookInterface.OnNewCharacter(race, class_, this, name.c_str())) { data << uint8(CHAR_CREATE_NAME_IN_USE); SendPacket(&data); return; } if( class_ == DEATHKNIGHT ) { if(!HasFlag(ACCOUNT_FLAG_XPACK_02)) { data << uint8(CHAR_CREATE_EXPANSION); SendPacket(&data); return; } else if(!CanCreateDeathKnight() && !HasGMPermissions()) { if(sWorld.m_deathKnightReqLevel > m_highestLevel) data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT); else data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT); SendPacket(&data); 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! data << uint8(CHAR_NAME_PROFANE); SendPacket(&data); 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; pNewChar->Destruct(); pNewChar = NULLPLR; 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; memset(pn, 0, sizeof(PlayerInfo)); pn->guid = pNewChar->GetLowGUID(); pn->name = strdup(pNewChar->GetName()); pn->_class = 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->Destruct(); pNewChar = NULLPLR; // CHAR_CREATE_SUCCESS data << uint8(CHAR_CREATE_SUCCESS); SendPacket(&data); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); }
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::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(!sWorld.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_ == 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 )) { // failed. pNewChar->ok_to_remove = true; pNewChar->Destructor(); return; } //Same Faction limitation only applies to PVP and RPPVP realms, after 3.1.0 the Blizzard is disable this function, so actually we are disable this. /*uint32 realmType = sLogonCommHandler.GetRealmType(); if(!HasGMPermissions() && (realmType == REALMTYPE_PVP || realmType == REALMTYPE_RPPVP) && _side >= 0) { if( ((pNewChar->GetTeam() == 0) && (_side == 1)) || ((pNewChar->GetTeam() == 1) && (_side == 0)) ) { pNewChar->ok_to_remove = true; pNewChar->Destructor(); 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; 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(); #ifdef VOICE_CHAT pn->groupVoiceId = -1; #endif objmgr.AddPlayerInfo(pn); pNewChar->ok_to_remove = true; pNewChar->Destructor(); // CHAR_CREATE_SUCCESS OutPacket(SMSG_CHAR_CREATE, 1, "\x2F"); sLogonCommHandler.UpdateAccountCount(GetAccountId(), 1); m_lastEnumTime = 0; }