diff options
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 1 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 8 | ||||
-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 | ||||
-rw-r--r-- | src/server/game/Handlers/TransmogrificationHandler.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 4 |
8 files changed, 47 insertions, 24 deletions
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index c06cf1df70d..5283c66d5db 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -236,6 +236,7 @@ TC_GAME_API extern DB2Storage<TalentEntry> sTalentStore TC_GAME_API extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore; TC_GAME_API extern DB2Storage<TaxiPathEntry> sTaxiPathStore; TC_GAME_API extern DB2Storage<TransmogHolidayEntry> sTransmogHolidayStore; +TC_GAME_API extern DB2Storage<TransmogIllusionEntry> sTransmogIllusionStore; TC_GAME_API extern DB2Storage<TransmogSetEntry> sTransmogSetStore; TC_GAME_API extern DB2Storage<TransmogSetGroupEntry> sTransmogSetGroupStore; TC_GAME_API extern DB2Storage<TransmogSetItemEntry> sTransmogSetItemStore; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index a3ed7822986..13da4dff96d 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -3763,6 +3763,8 @@ struct TransmogIllusionEntry int32 TransmogCost; int32 SpellItemEnchantmentID; int32 Flags; + + EnumFlag<TransmogIllusionFlags> GetFlags() const { return static_cast<TransmogIllusionFlags>(Flags); } }; struct TransmogSetEntry diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index ed76c1d1d97..5824e8e7839 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -1612,6 +1612,14 @@ enum TotemCategoryType TOTEM_CATEGORY_TYPE_SPANNER = 24 }; +enum class TransmogIllusionFlags : int32 +{ + HideUntilCollected = 0x1, + PlayerConditionGrantsOnLogin = 0x2, +}; + +DEFINE_ENUM_FLAG(TransmogIllusionFlags); + // SummonProperties.dbc, col 1 enum SummonPropGroup { 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; } diff --git a/src/server/game/Handlers/TransmogrificationHandler.cpp b/src/server/game/Handlers/TransmogrificationHandler.cpp index d94d66fadee..855fd3bebb3 100644 --- a/src/server/game/Handlers/TransmogrificationHandler.cpp +++ b/src/server/game/Handlers/TransmogrificationHandler.cpp @@ -128,34 +128,22 @@ void WorldSession::HandleTransmogrifyItems(WorldPackets::Transmogrification::Tra return; } - SpellItemEnchantmentEntry const* illusion = sSpellItemEnchantmentStore.LookupEntry(transmogItem.SpellItemEnchantmentID); + TransmogIllusionEntry const* illusion = sDB2Manager.GetTransmogIllusionForEnchantment(transmogItem.SpellItemEnchantmentID); if (!illusion) { TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using invalid enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); return; } - if (!illusion->ItemVisual || !illusion->GetFlags().HasFlag(SpellItemEnchantmentFlags::AllowTransmog)) + if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->UnlockConditionID)) { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using not allowed enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); - return; - } - - if (PlayerConditionEntry const* condition = sPlayerConditionStore.LookupEntry(illusion->TransmogUseConditionID)) - { - if (!sConditionMgr->IsPlayerMeetingCondition(player, condition)) + if (!ConditionMgr::IsPlayerMeetingCondition(player, condition)) { TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using not allowed enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); return; } } - if (illusion->ScalingClassRestricted > 0 && uint8(illusion->ScalingClassRestricted) != player->GetClass()) - { - TC_LOG_DEBUG("network", "WORLD: HandleTransmogrifyItems - %s, Name: %s tried to transmogrify illusion using not allowed class enchant (%d).", player->GetGUID().ToString().c_str(), player->GetName().c_str(), transmogItem.SpellItemEnchantmentID); - return; - } - illusionItems[itemTransmogrified] = transmogItem.SpellItemEnchantmentID; cost += illusion->TransmogCost; } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index dadff88a498..e90fc821a49 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5853,7 +5853,9 @@ void Spell::EffectLearnTransmogIllusion() if (!player) return; - uint16 illusionId = effectInfo->MiscValue; + uint32 illusionId = effectInfo->MiscValue; + if (!sTransmogIllusionStore.LookupEntry(illusionId)) + return; player->GetSession()->GetCollectionMgr()->AddTransmogIllusion(illusionId); } |