29struct TransmogOutfitSlotOptionInfo
35struct TransmogOutfitSlotInfo
38 std::variant<int32, std::unique_ptr<TransmogOutfitSlotOptionInfo[]>> SlotIndexOrOptions;
42 switch (SlotIndexOrOptions.index())
45 return std::get<0>(SlotIndexOrOptions);
47 return std::get<1>(SlotIndexOrOptions)[
AsUnderlyingType(slotOption)].SlotIndex;
55std::unordered_map<uint32, TransmogIllusionEntry const*> TransmogIllusionBySpellItemEnchantment;
56std::unordered_map<uint32, Trinity::Containers::FlatSet<TransmogSetEntry const*>> TransmogSetsByItemModifiedAppearance;
57std::vector<TransmogSetItemEntry const*> TransmogSetItemsByTransmogSet;
59std::vector<TransmogOutfitEntryEntry const*> TransmogOutfitsAutomaticallyCreated;
60std::vector<TransmogMgr::TransmogOutfitSlotAndOptionInfo> AllSlots;
62std::array<TransmogOutfitSlotInfo const*, EQUIPMENT_SLOT_END> SlotInfoByInvSlot;
63std::vector<TransmogSituationEntry const*> DefaultSituations;
92 if (IsArtifactTransmogOutfitSlotOption(option))
146 ItemModifiedAppearancesByItem[{ appearanceMod->ItemID, appearanceMod->ItemAppearanceModifierID }] = appearanceMod;
149 TransmogIllusionBySpellItemEnchantment[transmogIllusion->SpellItemEnchantmentID] = transmogIllusion;
157 TransmogSetsByItemModifiedAppearance[transmogSetItem->ItemModifiedAppearanceID].insert(set);
158 TransmogSetItemsByTransmogSet.push_back(transmogSetItem);
166 TransmogOutfitsAutomaticallyCreated.push_back(transmogOutfitEntry);
169 TransmogOutfitsBySource[
AsUnderlyingType(transmogOutfitEntry->GetSource())].push_back(transmogOutfitEntry);
172 for (std::vector<TransmogOutfitEntryEntry const*>& transmogOutfitEntries : TransmogOutfitsBySource)
179 TransmogOutfitSlotInfo* slot = &SlotInfoByOutfitSlot[
AsUnderlyingType(transmogOutfitSlot->GetSlot())];
180 slot->Data = transmogOutfitSlot;
185 SlotInfoByInvSlot[transmogOutfitSlot->InventorySlotEnum] = slot;
196 if (!std::holds_alternative<std::unique_ptr<TransmogOutfitSlotOptionInfo[]>>(slotInfo.SlotIndexOrOptions))
199 std::get<std::unique_ptr<TransmogOutfitSlotOptionInfo[]>>(slotInfo.SlotIndexOrOptions)[
AsUnderlyingType(transmogOutfitSlotOption->GetOption())].
Data = transmogOutfitSlotOption;
202 for (TransmogOutfitSlotInfo& slotInfo : SlotInfoByOutfitSlot)
208 slot.
Slot = slotInfo.Data;
211 if (std::holds_alternative<std::unique_ptr<TransmogOutfitSlotOptionInfo[]>>(slotInfo.SlotIndexOrOptions))
214 auto options = std::span<TransmogOutfitSlotOptionInfo, AsUnderlyingType(TransmogOutfitSlotOption::Max)>(
215 &std::get<std::unique_ptr<TransmogOutfitSlotOptionInfo[]>>(slotInfo.SlotIndexOrOptions)[0],
218 auto optionItr = std::ranges::find_if(options,
220 &TransmogOutfitSlotOptionInfo::Data);
223 optionItr->SlotIndex = AllSlots.size() - 1;
225 while (++optionItr != options.end())
227 if (!optionItr->Data)
231 newSlot.
Slot = slotInfo.Data;
234 optionItr->SlotIndex = AllSlots.size() - 1;
237 if (std::holds_alternative<int32>(slotInfo.SlotIndexOrOptions))
238 std::get<int32>(slotInfo.SlotIndexOrOptions) = AllSlots.size() - 1;
243 DefaultSituations.push_back(transmogSituation);
248 auto itr = ItemModifiedAppearancesByItem.find({ itemId, appearanceModId });
249 if (itr != ItemModifiedAppearancesByItem.end())
271 std::span<TransmogSetEntry const* const> result;
272 auto itr = TransmogSetsByItemModifiedAppearance.find(itemModifiedAppearanceId);
273 if (itr != TransmogSetsByItemModifiedAppearance.end())
274 result = itr->second;
286 return TransmogOutfitsAutomaticallyCreated;
298 return &AllSlots[slotIndex];
305 if (TransmogOutfitSlotInfo
const* slotInfo = SlotInfoByInvSlot[inventorySlot])
306 if (
int32 slotIndex = slotInfo->GetSlotIndex(slotOption); slotIndex >= 0)
307 return &AllSlots[slotIndex];
314 return DefaultSituations;
326 if (!transmogOutfitEntry || transmogOutfitEntry->
GetSource() != source)
330 lastOwnedOutfit = transmogOutfitEntry;
333 if (!lastOwnedOutfit)
336 auto itr = std::ranges::find(TransmogOutfitsBySource[
AsUnderlyingType(source)], lastOwnedOutfit) + 1;
345 struct SituationTriggerStatus
347 uint8 AllSituationCount = 0;
348 uint8 NoneSituationCount = 0;
349 uint8 RegularSituationCount = 0;
357 if (!transmogSituation)
361 if (!transmogSituationGroup)
365 if (!transmogSituationTrigger)
369 uint8* count =
nullptr;
371 count = &triggers.AllSituationCount;
373 count = &triggers.NoneSituationCount;
375 count = &triggers.RegularSituationCount;
382 for (SituationTriggerStatus
const& triggers : statusByTrigger)
383 if ((triggers.AllSituationCount > 0) + (triggers.NoneSituationCount > 0) + (triggers.RegularSituationCount > 0) > 1)
411 if (slot.ItemModifiedAppearanceID)
414 if (!itemModifiedAppearance)
421 if (!IsValidTransmogOutfitSlotForItem(itemTemplate, slot.Slot, slot.SlotOption))
425 if (appearanceSlotOption != slot.SlotOption
436 if (slot.SpellItemEnchantmentID && !TransmogIllusionBySpellItemEnchantment.contains(slot.SpellItemEnchantmentID))
DB2Storage< TransmogOutfitSlotInfoEntry > sTransmogOutfitSlotInfoStore("TransmogOutfitSlotInfo.db2", &TransmogOutfitSlotInfoLoadInfo::Instance)
DB2Storage< ArtifactEntry > sArtifactStore("Artifact.db2", &ArtifactLoadInfo::Instance)
DB2Storage< TransmogOutfitSlotOptionEntry > sTransmogOutfitSlotOptionInfoStore("TransmogOutfitSlotOption.db2", &TransmogOutfitSlotOptionLoadInfo::Instance)
DB2Storage< TransmogSituationEntry > sTransmogSituationStore("TransmogSituation.db2", &TransmogSituationLoadInfo::Instance)
DB2Storage< TransmogOutfitEntryEntry > sTransmogOutfitEntryStore("TransmogOutfitEntry.db2", &TransmogOutfitEntryLoadInfo::Instance)
DB2Storage< TransmogIllusionEntry > sTransmogIllusionStore("TransmogIllusion.db2", &TransmogIllusionLoadInfo::Instance)
DB2Storage< TransmogSetEntry > sTransmogSetStore("TransmogSet.db2", &TransmogSetLoadInfo::Instance)
DB2Storage< TransmogSituationGroupEntry > sTransmogSituationGroupStore("TransmogSituationGroup.db2", &TransmogSituationGroupLoadInfo::Instance)
DB2Storage< ChrSpecializationEntry > sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance)
DB2Storage< ItemModifiedAppearanceEntry > sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", &ItemModifiedAppearanceLoadInfo::Instance)
DB2Storage< TransmogSituationTriggerEntry > sTransmogSituationTriggerStore("TransmogSituationTrigger.db2", &TransmogSituationTriggerLoadInfo::Instance)
DB2Storage< TransmogSetItemEntry > sTransmogSetItemStore("TransmogSetItem.db2", &TransmogSetItemLoadInfo::Instance)
TransmogOutfitEntrySource
@ AutomaticallyAwardedOnLogin
@ ITEM_SUBCLASS_WEAPON_WAND
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
UF::UpdateField< UF::ActivePlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_ACTIVE_PLAYER > m_activePlayerData
std::span< TransmogSetItemEntry const *const > GetTransmogSetItems(uint32 transmogSetId)
bool ValidateSituations(std::span< WorldPackets::Transmogrification::TransmogOutfitSituationInfo const > situations)
TransmogIllusionEntry const * GetTransmogIllusionForSpellItemEnchantment(uint32 spellItemEnchantmentId)
ItemModifiedAppearanceEntry const * GetDefaultItemModifiedAppearance(uint32 itemId)
std::span< TransmogSetEntry const *const > GetTransmogSetsForItemModifiedAppearance(uint32 itemModifiedAppearanceId)
ItemModifiedAppearanceEntry const * GetItemModifiedAppearance(uint32 itemId, uint32 appearanceModId)
std::span< TransmogSituationEntry const *const > GetDefaultSituations()
std::span< TransmogOutfitSlotAndOptionInfo const > GetAllSlots()
bool ValidateSlots(std::span< WorldPackets::Transmogrification::TransmogOutfitSlotData const > slots)
TransmogOutfitSlotAndOptionInfo const * GetSlotAndOption(TransmogOutfitSlot slot, TransmogOutfitSlotOption slotOption)
std::span< TransmogOutfitEntryEntry const *const > GetAutomaticallyUnlockedOutfits()
TransmogOutfitEntryEntry const * GetNextOutfitToUnlock(TransmogOutfitEntrySource source, Player const *player)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
TransmogOutfitSlotOption GetWeaponTransmogOutfitSlotOption() const
InventoryType GetInventoryType() const
ItemSheatheType GetSheatheType() const
uint8 GetArtifactID() const
uint32 GetSubClass() const
TransmogOutfitSlotInfoEntry const * Slot
TransmogOutfitSlotOptionEntry const * SlotOption
TransmogOutfitEntrySource GetSource() const
TransmogOutfitSlot GetSlot() const
bool HasFlag(TransmogSituationFlags flag) const
uint32 TransmogSituationGroupID
uint32 TransmogSituationTriggerID
TransmogSituationTrigger GetTrigger() const
bool HasFlag(TransmogSituationTriggerFlags flag) const