diff options
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 69 |
1 files changed, 35 insertions, 34 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 9461ebdb276..49283ac0c26 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -309,10 +309,6 @@ bool LoginQueryHolder::Initialize() void WorldSession::HandleCharEnum(PreparedQueryResult result) { - uint8 demonHunterCount = 0; // We use this counter to allow multiple demon hunter creations when allowed in config - bool canAlwaysCreateDemonHunter = HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEMON_HUNTER); - if (sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER) == 0) // char level = 0 means this check is disabled, so always true - canAlwaysCreateDemonHunter = true; WorldPackets::Character::EnumCharactersResult charEnum; charEnum.Success = true; charEnum.IsDeletedCharacters = false; @@ -358,21 +354,11 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) if (!sCharacterCache->HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. sCharacterCache->AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexID, charInfo.RaceID, charInfo.ClassID, charInfo.ExperienceLevel, false); - if (charInfo.ClassID == CLASS_DEMON_HUNTER) - demonHunterCount++; - - if (demonHunterCount >= sWorld->getIntConfig(CONFIG_DEMON_HUNTERS_PER_REALM) && !canAlwaysCreateDemonHunter) - charEnum.HasDemonHunterOnRealm = true; - else - charEnum.HasDemonHunterOnRealm = false; - charEnum.MaxCharacterLevel = std::max<int32>(charEnum.MaxCharacterLevel, charInfo.ExperienceLevel); } while (result->NextRow()); } - charEnum.IsTestDemonHunterCreationAllowed = canAlwaysCreateDemonHunter; - charEnum.IsDemonHunterCreationAllowed = GetAccountExpansion() >= EXPANSION_LEGION || canAlwaysCreateDemonHunter; charEnum.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= EXPANSION_BATTLE_FOR_AZEROTH; for (std::pair<uint8 const, RaceUnlockRequirement> const& requirement : sObjectMgr->GetRaceUnlockRequirements()) @@ -643,26 +629,12 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact if (result) { uint32 team = Player::TeamForRace(createInfo->Race); - uint32 freeDemonHunterSlots = sWorld->getIntConfig(CONFIG_DEMON_HUNTERS_PER_REALM); Field* field = result->Fetch(); uint8 accRace = field[1].GetUInt8(); if (checkDemonHunterReqs) { - uint8 accClass = field[2].GetUInt8(); - if (accClass == CLASS_DEMON_HUNTER) - { - if (freeDemonHunterSlots > 0) - --freeDemonHunterSlots; - - if (freeDemonHunterSlots == 0) - { - SendCharCreate(CHAR_CREATE_FAILED); - return; - } - } - if (!hasDemonHunterReqLevel) { uint8 accLevel = field[0].GetUInt8(); @@ -1376,6 +1348,40 @@ void WorldSession::HandleRequestForcedReactionsOpcode(WorldPackets::Reputation:: _player->GetReputationMgr().SendForceReactions(); } +void WorldSession::HandleCheckCharacterNameAvailability(WorldPackets::Character::CheckCharacterNameAvailability& checkCharacterNameAvailability) +{ + // prevent character rename to invalid name + if (!normalizePlayerName(checkCharacterNameAvailability.Name)) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, CHAR_NAME_NO_NAME).Write()); + return; + } + + ResponseCodes res = ObjectMgr::CheckPlayerName(checkCharacterNameAvailability.Name, GetSessionDbcLocale(), true); + if (res != CHAR_NAME_SUCCESS) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, res).Write()); + return; + } + + // check name limitations + if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(checkCharacterNameAvailability.Name)) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, CHAR_NAME_RESERVED).Write()); + return; + } + + // Ensure that there is no character with the desired new name + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME); + stmt->setString(0, checkCharacterNameAvailability.Name); + + _queryProcessor.AddCallback(CharacterDatabase.AsyncQuery(stmt) + .WithPreparedCallback([this, sequenceIndex = checkCharacterNameAvailability.SequenceIndex](PreparedQueryResult result) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(sequenceIndex, result ? CHAR_CREATE_NAME_IN_USE : RESPONSE_SUCCESS).Write()); + })); +} + void WorldSession::HandleCharRenameOpcode(WorldPackets::Character::CharacterRenameRequest& request) { if (!IsLegitCharacterForAccount(request.RenameInfo->Guid)) @@ -2670,13 +2676,8 @@ void WorldSession::SendCharFactionChange(ResponseCodes result, WorldPackets::Cha packet.Display = boost::in_place(); packet.Display->Name = factionChangeInfo->Name; packet.Display->SexID = factionChangeInfo->SexID; - packet.Display->SkinID = factionChangeInfo->SkinID; - packet.Display->HairColorID = factionChangeInfo->HairColorID; - packet.Display->HairStyleID = factionChangeInfo->HairStyleID; - packet.Display->FacialHairStyleID = factionChangeInfo->FacialHairStyleID; - packet.Display->FaceID = factionChangeInfo->FaceID; + packet.Display->Customizations = &factionChangeInfo->Customizations; packet.Display->RaceID = factionChangeInfo->RaceID; - packet.Display->CustomDisplay = factionChangeInfo->CustomDisplay; } SendPacket(packet.Write()); |