aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-06-09 20:50:03 +0200
committerShauren <shauren.trinity@gmail.com>2022-06-09 21:27:02 +0200
commitf820ff178decf7d844b7c398b79be7269feeb53e (patch)
treeb4bf6e9b854364e6d9ae29ebb30aa2bd74267781 /src/server/game/Entities
parent125ada42f6be220a52315d06d61e472a2ba83395 (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.cpp17
-rw-r--r--src/server/game/Entities/Player/CollectionMgr.h5
-rw-r--r--src/server/game/Entities/Player/Player.cpp16
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;
}