From a738e6935cccfb0a942814e16b2e40a7e23ee63b Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 23 Mar 2026 16:13:10 +0100 Subject: [PATCH] Core/Transmog: Implemented TransmogHoliday.db2 transmog conditions --- src/server/game/Entities/Player/Player.cpp | 76 +++++++++++-------- .../Handlers/TransmogrificationHandler.cpp | 14 ++-- 2 files changed, 52 insertions(+), 38 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bd832a8ba5..0c79db078f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -11899,41 +11899,42 @@ void Player::SetVisibleItemSlot(uint8 slot, Item const* item) { if (ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(transmogOutfitItem.ItemModifiedAppearanceID)) { - itemId = itemModifiedAppearance->ItemID; - itemAppearanceModId = itemModifiedAppearance->ItemAppearanceModifierID; - itemModifiedAppearanceId = itemModifiedAppearance->ID; + TransmogHolidayEntry const* transmogHoliday = sTransmogHolidayStore.LookupEntry(itemModifiedAppearance->ItemID); + if (!transmogHoliday || IsHolidayActive(static_cast(transmogHoliday->RequiredTransmogHoliday))) + { + itemId = itemModifiedAppearance->ItemID; + itemAppearanceModId = itemModifiedAppearance->ItemAppearanceModifierID; + itemModifiedAppearanceId = itemModifiedAppearance->ID; + hasTransmog = true; + } } - - hasTransmog = true; } + auto getSecondaryItemModifiedAppearance = [isTransmogDisplayed](UF::TransmogOutfitSlotData const& secondaryTransmogOutfitItem) -> int32 + { + if (isTransmogDisplayed(static_cast(*secondaryTransmogOutfitItem.AppearanceDisplayType)) + || static_cast(*secondaryTransmogOutfitItem.AppearanceDisplayType) == TransmogOutfitDisplayType::Equipped) + { + if (ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(secondaryTransmogOutfitItem.ItemModifiedAppearanceID)) + { + TransmogHolidayEntry const* transmogHoliday = sTransmogHolidayStore.LookupEntry(itemModifiedAppearance->ItemID); + if (!transmogHoliday || IsHolidayActive(static_cast(transmogHoliday->RequiredTransmogHoliday))) + return secondaryTransmogOutfitItem.ItemModifiedAppearanceID; + } + } + return 0; + }; + if (TransmogOutfitSlotInfoEntry const* secondarySlot = sTransmogOutfitSlotInfoStore.LookupEntry(slotInfo->Slot->SecondarySlotID)) - { if (TransmogMgr::TransmogOutfitSlotAndOptionInfo const* secondarySlotInfo = TransmogMgr::GetSlotAndOption(secondarySlot->GetSlot(), transmogSlotOption)) - { - UF::TransmogOutfitSlotData const& secondaryTransmogOutfitItem = m_activePlayerData->ViewedOutfit->Slots[secondarySlotInfo->SlotIndex]; - if (isTransmogDisplayed(static_cast(*secondaryTransmogOutfitItem.AppearanceDisplayType)) - || static_cast(*secondaryTransmogOutfitItem.AppearanceDisplayType) == TransmogOutfitDisplayType::Equipped) - { - secondaryItemModifiedAppearanceId = secondaryTransmogOutfitItem.ItemModifiedAppearanceID; - hasTransmog = true; - } - } - } + secondaryItemModifiedAppearanceId = getSecondaryItemModifiedAppearance(m_activePlayerData->ViewedOutfit->Slots[secondarySlotInfo->SlotIndex]); if (TransmogOutfitSlotOptionEntry const* secondarySlotOption = sTransmogOutfitSlotOptionInfoStore.LookupEntry(slotInfo->SlotOption ? slotInfo->SlotOption->SecondaryOptionID : 0)) - { if (TransmogMgr::TransmogOutfitSlotAndOptionInfo const* secondarySlotInfo = TransmogMgr::GetSlotAndOption(slotInfo->Slot->GetSlot(), secondarySlotOption->GetOption())) - { - UF::TransmogOutfitSlotData const& secondaryTransmogOutfitItem = m_activePlayerData->ViewedOutfit->Slots[secondarySlotInfo->SlotIndex]; - if (isTransmogDisplayed(static_cast(*secondaryTransmogOutfitItem.AppearanceDisplayType)) - || static_cast(*secondaryTransmogOutfitItem.AppearanceDisplayType) == TransmogOutfitDisplayType::Equipped) - { - secondaryItemModifiedAppearanceId = secondaryTransmogOutfitItem.ItemModifiedAppearanceID; - hasTransmog = true; - } - } - } + secondaryItemModifiedAppearanceId = getSecondaryItemModifiedAppearance(m_activePlayerData->ViewedOutfit->Slots[secondarySlotInfo->SlotIndex]); + + if (secondaryItemModifiedAppearanceId) + hasTransmog = true; if (isTransmogDisplayed(static_cast(*transmogOutfitItem.IllusionDisplayType))) { @@ -31448,14 +31449,18 @@ std::string Player::GetCharacterSelectOutfit() const uint32 secondaryItemModifiedAppearanceId = 0; if (ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(itemModifiedAppearanceId)) { - if (ItemEntry const* item = sItemStore.LookupEntry(itemModifiedAppearance->ItemID)) + TransmogHolidayEntry const* transmogHoliday = sTransmogHolidayStore.LookupEntry(itemModifiedAppearance->ItemID); + if (!transmogHoliday || IsHolidayActive(static_cast(transmogHoliday->RequiredTransmogHoliday))) { - subClass = item->SubclassID; - inventoryType = static_cast(item->InventoryType); - } + if (ItemEntry const* item = sItemStore.LookupEntry(itemModifiedAppearance->ItemID)) + { + subClass = item->SubclassID; + inventoryType = static_cast(item->InventoryType); + } - if (ItemAppearanceEntry const* itemAppearance = sItemAppearanceStore.LookupEntry(itemModifiedAppearance->ItemAppearanceID)) - displayId = itemAppearance->ItemDisplayInfoID; + if (ItemAppearanceEntry const* itemAppearance = sItemAppearanceStore.LookupEntry(itemModifiedAppearance->ItemAppearanceID)) + displayId = itemAppearance->ItemDisplayInfoID; + } } if (SpellItemEnchantmentEntry const* spellItemEnchantment = sSpellItemEnchantmentStore.LookupEntry(transmogOutfitSlot.SpellItemEnchantmentID)) @@ -31473,6 +31478,11 @@ std::string Player::GetCharacterSelectOutfit() const secondaryItemModifiedAppearanceId = secondaryTransmogOutfitSlot.ItemModifiedAppearanceID; if (!isTransmogDisplayed(static_cast(*secondaryTransmogOutfitSlot.AppearanceDisplayType))) secondaryItemModifiedAppearanceId = m_playerData->VisibleItems[i].SecondaryItemModifiedAppearanceID; + + if (ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(secondaryItemModifiedAppearanceId)) + if (TransmogHolidayEntry const* transmogHoliday = sTransmogHolidayStore.LookupEntry(itemModifiedAppearance->ItemID)) + if (!IsHolidayActive(static_cast(transmogHoliday->RequiredTransmogHoliday))) + secondaryItemModifiedAppearanceId = 0; } } diff --git a/src/server/game/Handlers/TransmogrificationHandler.cpp b/src/server/game/Handlers/TransmogrificationHandler.cpp index 36f1622840..f75f5451aa 100644 --- a/src/server/game/Handlers/TransmogrificationHandler.cpp +++ b/src/server/game/Handlers/TransmogrificationHandler.cpp @@ -507,7 +507,7 @@ void WorldSession::HandleTransmogOutfitUpdateSlots(WorldPackets::Transmogrificat // calculate cost float baseCost = 0; if (uint32 curveId = sDB2Manager.GetGlobalCurveId(GlobalCurve::TransmogCost)) - baseCost = sDB2Manager.GetCurveValueAt(curveId, std::max(_player->GetLevel(), _player->m_activePlayerData->MaxLevel)); + baseCost = sDB2Manager.GetCurveValueAt(curveId, std::max(_player->GetLevel(), _player->m_activePlayerData->TransmogCostMinScalingLevel)); float costMultiplier = 1.0f; TransmogOutfitEntryEntry const* transmogOutfitEntry = sTransmogOutfitEntryStore.AssertEntry(transmogOutfitUpdateSlots.OutfitID); @@ -536,11 +536,15 @@ void WorldSession::HandleTransmogOutfitUpdateSlots(WorldPackets::Transmogrificat if (slot.AppearanceDisplayType == TransmogOutfitDisplayType::Assigned && oldSlotItr->ItemModifiedAppearanceID != slot.ItemModifiedAppearanceID) { - if (slotEntry) - cost = static_cast(std::floor(baseCost * slotEntry->ItemCostMultiplier)) + cost; + ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(slot.ItemModifiedAppearanceID); + if (!itemModifiedAppearance || !sTransmogHolidayStore.HasRecord(itemModifiedAppearance->ItemID)) + { + if (slotEntry) + cost = static_cast(std::floor(baseCost * slotEntry->ItemCostMultiplier)) + cost; - if (slotOptionEntry) - cost = static_cast(std::floor(baseCost * slotOptionEntry->ItemCostMultiplier)) + cost; + if (slotOptionEntry) + cost = static_cast(std::floor(baseCost * slotOptionEntry->ItemCostMultiplier)) + cost; + } } if (slot.IllusionDisplayType == TransmogOutfitDisplayType::Assigned && oldSlotItr->SpellItemEnchantmentID != slot.SpellItemEnchantmentID)