diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-06-09 20:50:03 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-06-09 21:27:02 +0200 |
| commit | f820ff178decf7d844b7c398b79be7269feeb53e (patch) | |
| tree | b4bf6e9b854364e6d9ae29ebb30aa2bd74267781 /src/server/game/Entities | |
| parent | 125ada42f6be220a52315d06d61e472a2ba83395 (diff) | |
Core/Transmog: Implemented TransmogIllusionFlags::PlayerConditionGrantsOnLogin and fixed transmog illusion validation when transmogging items
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Player/CollectionMgr.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/CollectionMgr.h | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 |
3 files changed, 30 insertions, 8 deletions
diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp index ff77b19e6f7..296b03b6720 100644 --- a/src/server/game/Entities/Player/CollectionMgr.cpp +++ b/src/server/game/Entities/Player/CollectionMgr.cpp @@ -950,21 +950,26 @@ void CollectionMgr::SaveAccountTransmogIllusions(LoginDatabaseTransaction trans) })); } -void CollectionMgr::AddTransmogIllusion(uint16 illusionId) +void CollectionMgr::AddTransmogIllusion(uint32 transmogIllusionId) { Player* owner = _owner->GetPlayer(); - if (_transmogIllusions->size() <= illusionId) + if (_transmogIllusions->size() <= transmogIllusionId) { std::size_t numBlocks = _transmogIllusions->num_blocks(); - _transmogIllusions->resize(illusionId + 1); + _transmogIllusions->resize(transmogIllusionId + 1); numBlocks = _transmogIllusions->num_blocks() - numBlocks; while (numBlocks--) owner->AddIllusionBlock(0); } - _transmogIllusions->set(illusionId); - uint32 blockIndex = illusionId / 32; - uint32 bitIndex = illusionId % 32; + _transmogIllusions->set(transmogIllusionId); + uint32 blockIndex = transmogIllusionId / 32; + uint32 bitIndex = transmogIllusionId % 32; owner->AddIllusionFlag(blockIndex, 1 << bitIndex); } + +bool CollectionMgr::HasTransmogIllusion(uint32 transmogIllusionId) const +{ + return transmogIllusionId < _transmogIllusions->size() && _transmogIllusions->test(transmogIllusionId); +} diff --git a/src/server/game/Entities/Player/CollectionMgr.h b/src/server/game/Entities/Player/CollectionMgr.h index 7c757f0d64e..ea245dbf285 100644 --- a/src/server/game/Entities/Player/CollectionMgr.h +++ b/src/server/game/Entities/Player/CollectionMgr.h @@ -140,9 +140,10 @@ public: // Illusions void LoadTransmogIllusions(); - void LoadAccountTransmogIllusions(PreparedQueryResult knownIllusions); + void LoadAccountTransmogIllusions(PreparedQueryResult knownTransmogIllusions); void SaveAccountTransmogIllusions(LoginDatabaseTransaction trans); - void AddTransmogIllusion(uint16 illusionId); + void AddTransmogIllusion(uint32 transmogIllusionId); + bool HasTransmogIllusion(uint32 transmogIllusionId) const; enum class FavoriteAppearanceState { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index cf02d2e5e6b..db92c47349b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18715,6 +18715,22 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol m_questObjectiveCriteriaMgr->CheckAllQuestObjectiveCriteria(this); PushQuests(); + + for (TransmogIllusionEntry const* transmogIllusion : sTransmogIllusionStore) + { + if (!transmogIllusion->GetFlags().HasFlag(TransmogIllusionFlags::PlayerConditionGrantsOnLogin)) + continue; + + if (GetSession()->GetCollectionMgr()->HasTransmogIllusion(transmogIllusion->ID)) + continue; + + if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(transmogIllusion->UnlockConditionID)) + if (!ConditionMgr::IsPlayerMeetingCondition(this, playerCondition)) + continue; + + GetSession()->GetCollectionMgr()->AddTransmogIllusion(transmogIllusion->ID); + } + return true; } |
