diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-07-12 16:29:00 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-07-12 16:29:00 +0200 |
commit | 0cea730fa23473a85c47451c3bd13df816f2b6e4 (patch) | |
tree | 960078875798c5846a1aa465051da876642067e1 /src/server/game/Handlers/CharacterHandler.cpp | |
parent | 252da139adedd20c297ce7bdd2abed2234fa1bb6 (diff) |
Core: Update to 10.1.5
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b2a58835e5a..e7f44b18640 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -433,7 +433,7 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder const& holder) charInfo.Customizations.clear(); - if (!(charInfo.Flags2 == CHAR_CUSTOMIZE_FLAG_CUSTOMIZE)) + if (!(charInfo.Flags2 & (CHAR_CUSTOMIZE_FLAG_CUSTOMIZE | CHAR_CUSTOMIZE_FLAG_FACTION | CHAR_CUSTOMIZE_FLAG_RACE))) { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG); stmt->setUInt16(0, uint16(AT_LOGIN_CUSTOMIZE)); @@ -508,7 +508,7 @@ void WorldSession::HandleCharUndeleteEnumOpcode(WorldPackets::Character::EnumCha }); } -bool WorldSession::MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req, Classes playerClass, +bool WorldSession::MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req, Races race, Classes playerClass, bool checkRequiredDependentChoices, Trinity::IteratorPair<UF::ChrCustomizationChoice const*> selectedChoices) const { if (!req->GetFlags().HasFlag(ChrCustomizationReqFlag::HasRequirements)) @@ -517,6 +517,9 @@ bool WorldSession::MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req, if (req->ClassMask && !(req->ClassMask & (1 << (playerClass - 1)))) return false; + if (race != RACE_NONE && !req->RaceMask.IsEmpty() && req->RaceMask.RawValue != -1 && !req->RaceMask.HasRace(race)) + return false; + if (req->AchievementID /*&& !HasAchieved(req->AchievementID)*/) return false; @@ -589,7 +592,7 @@ bool WorldSession::ValidateAppearance(Races race, Classes playerClass, Gender ge return false; if (ChrCustomizationReqEntry const* req = sChrCustomizationReqStore.LookupEntry((*customizationOptionDataItr)->ChrCustomizationReqID)) - if (!MeetsChrCustomizationReq(req, playerClass, false, customizations)) + if (!MeetsChrCustomizationReq(req, race, playerClass, false, customizations)) return false; std::vector<ChrCustomizationChoiceEntry const*> const* choicesForOption = sDB2Manager.GetCustomiztionChoices(playerChoice.ChrCustomizationOptionID); @@ -606,7 +609,7 @@ bool WorldSession::ValidateAppearance(Races race, Classes playerClass, Gender ge return false; if (ChrCustomizationReqEntry const* req = sChrCustomizationReqStore.LookupEntry((*customizationChoiceDataItr)->ChrCustomizationReqID)) - if (!MeetsChrCustomizationReq(req, playerClass, true, customizations)) + if (!MeetsChrCustomizationReq(req, race, playerClass, true, customizations)) return false; } @@ -1202,10 +1205,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder const& holder) pCurrChar->SetGuildLevel(0); } - // Send stable contents to display icons on Call Pet spells - if (pCurrChar->HasSpell(CALL_PET_SPELL_ID)) - SendStablePet(ObjectGuid::Empty); - pCurrChar->GetSession()->GetBattlePetMgr()->SendJournalLockStatus(); pCurrChar->SendInitialPacketsBeforeAddToMap(); @@ -1736,7 +1735,23 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPackets::Character::SetPlay void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance& packet) { - if (!ValidateAppearance(Races(_player->GetRace()), Classes(_player->GetClass()), Gender(packet.NewSex), MakeChrCustomizationChoiceRange(packet.Customizations))) + Trinity::IteratorPair<UF::ChrCustomizationChoice const*> customizations = MakeChrCustomizationChoiceRange(packet.Customizations); + if (packet.CustomizedChrModelID) + { + ConditionalChrModelEntry const* conditionalChrModel = sConditionalChrModelStore.LookupEntry(packet.CustomizedChrModelID); + if (!conditionalChrModel) + return; + + if (ChrCustomizationReqEntry const* req = sChrCustomizationReqStore.LookupEntry(conditionalChrModel->ChrCustomizationReqID)) + if (!MeetsChrCustomizationReq(req, Races(packet.CustomizedRace), Classes(_player->GetClass()), false, customizations)) + return; + + if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(conditionalChrModel->PlayerConditionID)) + if (!ConditionMgr::IsPlayerMeetingCondition(_player, condition)) + return; + } + + if (!ValidateAppearance(Races(_player->GetRace()), Classes(_player->GetClass()), Gender(packet.NewSex), customizations)) return; GameObject* go = _player->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_BARBER_CHAIR, 5.0f); @@ -1752,7 +1767,7 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance return; } - int64 cost = _player->GetBarberShopCost(MakeChrCustomizationChoiceRange(packet.Customizations)); + int64 cost = _player->GetBarberShopCost(customizations); // 0 - ok // 1, 3 - not enough money |