aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp15
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h10
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp15
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h66
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp30
-rw-r--r--src/server/game/DataStores/DB2Stores.h6
-rw-r--r--src/server/game/DataStores/DB2Structure.h40
-rw-r--r--src/server/game/DataStores/DBCEnums.h1
-rw-r--r--src/server/game/Entities/Player/CollectionMgr.cpp59
-rw-r--r--src/server/game/Entities/Player/CollectionMgr.h2
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp13
12 files changed, 256 insertions, 2 deletions
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index 2e7674fcc47..930d215a354 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -947,6 +947,21 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PrepareStatement(HOTFIX_SEL_TOY, "SELECT ItemID, Description, Flags, CategoryFilter, ID FROM toy ORDER BY ID DESC", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_TOY, "SELECT ID, Description_lang FROM toy_locale WHERE locale = ?", CONNECTION_SYNCH);
+ // TransmogHoliday.db2
+ PrepareStatement(HOTFIX_SEL_TRANSMOG_HOLIDAY, "SELECT ID, HolidayID FROM transmog_holiday ORDER BY ID DESC", CONNECTION_SYNCH);
+
+ // TransmogSet.db2
+ PrepareStatement(HOTFIX_SEL_TRANSMOG_SET, "SELECT Name, BaseSetID, UIOrder, ExpansionID, ID, Flags, QuestID, ClassMask, ItemNameDescriptionID, "
+ "TransmogSetGroupID FROM transmog_set ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_TRANSMOG_SET, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?", CONNECTION_SYNCH);
+
+ // TransmogSetGroup.db2
+ PrepareStatement(HOTFIX_SEL_TRANSMOG_SET_GROUP, "SELECT Label, ID FROM transmog_set_group ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_TRANSMOG_SET_GROUP, "SELECT ID, Label_lang FROM transmog_set_group_locale WHERE locale = ?", CONNECTION_SYNCH);
+
+ // TransmogSetItem.db2
+ PrepareStatement(HOTFIX_SEL_TRANSMOG_SET_ITEM, "SELECT ID, TransmogSetID, ItemModifiedAppearanceID, Flags FROM transmog_set_item ORDER BY ID DESC", CONNECTION_SYNCH);
+
// TransportAnimation.db2
PrepareStatement(HOTFIX_SEL_TRANSPORT_ANIMATION, "SELECT ID, TransportID, TimeIndex, PosX, PosY, PosZ, SequenceID FROM transport_animation"
" ORDER BY ID DESC", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index 5d2b1f77765..88d43f21476 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -507,6 +507,16 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_TOY,
HOTFIX_SEL_TOY_LOCALE,
+ HOTFIX_SEL_TRANSMOG_HOLIDAY,
+
+ HOTFIX_SEL_TRANSMOG_SET,
+ HOTFIX_SEL_TRANSMOG_SET_LOCALE,
+
+ HOTFIX_SEL_TRANSMOG_SET_GROUP,
+ HOTFIX_SEL_TRANSMOG_SET_GROUP_LOCALE,
+
+ HOTFIX_SEL_TRANSMOG_SET_ITEM,
+
HOTFIX_SEL_TRANSPORT_ANIMATION,
HOTFIX_SEL_TRANSPORT_ROTATION,
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index f3bb97ecf4b..9cb9a61386f 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -700,6 +700,16 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
case CRITERIA_TYPE_REACH_GUILD_LEVEL:
SetCriteriaProgress(criteria, miscValue1, referencePlayer);
break;
+ case CRITERIA_TYPE_TRANSMOG_SET_UNLOCKED:
+ if (miscValue1 != criteria->Entry->Asset.TransmogSetGroupID)
+ continue;
+ SetCriteriaProgress(criteria, 1, referencePlayer, PROGRESS_ACCUMULATE);
+ break;
+ case CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT:
+ if (!miscValue2 /*login case*/ || miscValue1 != criteria->Entry->Asset.EquipmentSlot)
+ continue;
+ SetCriteriaProgress(criteria, 1, referencePlayer, PROGRESS_ACCUMULATE);
+ break;
// FIXME: not triggered in code as result, need to implement
case CRITERIA_TYPE_COMPLETE_RAID:
case CRITERIA_TYPE_PLAY_ARENA:
@@ -774,7 +784,6 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
case CRITERIA_TYPE_ARTIFACT_POWER_EARNED:
case CRITERIA_TYPE_ARTIFACT_TRAITS_UNLOCKED:
case CRITERIA_TYPE_ORDER_HALL_TALENT_LEARNED:
- case CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT:
case CRITERIA_TYPE_ORDER_HALL_RECRUIT_TROOP:
case CRITERIA_TYPE_COMPLETE_WORLD_QUEST:
break; // Not implemented yet :(
@@ -1135,6 +1144,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi
case CRITERIA_TYPE_CURRENCY:
case CRITERIA_TYPE_PLACE_GARRISON_BUILDING:
case CRITERIA_TYPE_OWN_BATTLE_PET_COUNT:
+ case CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT:
return progress->Counter >= requiredAmount;
case CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
case CRITERIA_TYPE_COMPLETE_QUEST:
@@ -1144,6 +1154,7 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi
case CRITERIA_TYPE_OWN_BATTLE_PET:
case CRITERIA_TYPE_HONOR_LEVEL_REACHED:
case CRITERIA_TYPE_PRESTIGE_REACHED:
+ case CRITERIA_TYPE_TRANSMOG_SET_UNLOCKED:
return progress->Counter >= 1;
case CRITERIA_TYPE_LEARN_SKILL_LEVEL:
return progress->Counter >= (requiredAmount * 75);
@@ -2125,6 +2136,8 @@ char const* CriteriaMgr::GetCriteriaTypeString(CriteriaTypes type)
return "ORDER_HALL_RECRUIT_TROOP";
case CRITERIA_TYPE_COMPLETE_WORLD_QUEST:
return "COMPLETE_WORLD_QUEST";
+ case CRITERIA_TYPE_TRANSMOG_SET_UNLOCKED:
+ return "TRANSMOG_SET_UNLOCKED";
}
return "MISSING_TYPE";
}
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index c5f09946ce3..8cd1be9c7b3 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -4781,6 +4781,72 @@ struct ToyLoadInfo
}
};
+struct TransmogHolidayLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "HolidayID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransmogHolidayMeta::Instance(), HOTFIX_SEL_TRANSMOG_HOLIDAY);
+ return &loadInfo;
+ }
+};
+
+struct TransmogSetLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_STRING, "Name" },
+ { false, FT_SHORT, "BaseSetID" },
+ { false, FT_SHORT, "UIOrder" },
+ { false, FT_BYTE, "ExpansionID" },
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "Flags" },
+ { true, FT_INT, "QuestID" },
+ { true, FT_INT, "ClassMask" },
+ { true, FT_INT, "ItemNameDescriptionID" },
+ { false, FT_INT, "TransmogSetGroupID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransmogSetMeta::Instance(), HOTFIX_SEL_TRANSMOG_SET);
+ return &loadInfo;
+ }
+};
+
+struct TransmogSetGroupLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_STRING, "Label" },
+ { false, FT_INT, "ID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransmogSetGroupMeta::Instance(), HOTFIX_SEL_TRANSMOG_SET_GROUP);
+ return &loadInfo;
+ }
+};
+
+struct TransmogSetItemLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { false, FT_INT, "TransmogSetID" },
+ { false, FT_INT, "ItemModifiedAppearanceID" },
+ { true, FT_INT, "Flags" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransmogSetItemMeta::Instance(), HOTFIX_SEL_TRANSMOG_SET_ITEM);
+ return &loadInfo;
+ }
+};
+
struct TransportAnimationLoadInfo
{
static DB2LoadInfo const* Instance()
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index e7bcd266a65..d8903360d80 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -241,6 +241,10 @@ DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", T
DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeLoadInfo::Instance());
DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryLoadInfo::Instance());
DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyLoadInfo::Instance());
+DB2Storage<TransmogHolidayEntry> sTransmogHolidayStore("TransmogHoliday.db2", TransmogHolidayLoadInfo::Instance());
+DB2Storage<TransmogSetEntry> sTransmogSetStore("TransmogSet.db2", TransmogSetLoadInfo::Instance());
+DB2Storage<TransmogSetGroupEntry> sTransmogSetGroupStore("TransmogSetGroup.db2", TransmogSetGroupLoadInfo::Instance());
+DB2Storage<TransmogSetItemEntry> sTransmogSetItemStore("TransmogSetItem.db2", TransmogSetItemLoadInfo::Instance());
DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationLoadInfo::Instance());
DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationLoadInfo::Instance());
DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarLoadInfo::Instance());
@@ -354,6 +358,8 @@ namespace
SpellProcsPerMinuteModContainer _spellProcsPerMinuteMods;
TalentsByPosition _talentsByPosition;
ToyItemIdsContainer _toys;
+ std::unordered_map<uint32, std::vector<TransmogSetEntry const*>> _transmogSetsByItemModifiedAppearance;
+ std::unordered_map<uint32, std::vector<TransmogSetItemEntry const*>> _transmogSetItemsByTransmogSet;
WMOAreaTableLookupContainer _wmoAreaTableLookup;
WorldMapAreaByAreaIDContainer _worldMapAreaByAreaID;
}
@@ -643,6 +649,10 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sTaxiPathNodeStore);
LOAD_DB2(sTotemCategoryStore);
LOAD_DB2(sToyStore);
+ LOAD_DB2(sTransmogHolidayStore);
+ LOAD_DB2(sTransmogSetStore);
+ LOAD_DB2(sTransmogSetGroupStore);
+ LOAD_DB2(sTransmogSetItemStore);
LOAD_DB2(sTransportAnimationStore);
LOAD_DB2(sTransportRotationStore);
LOAD_DB2(sUnitPowerBarStore);
@@ -1022,6 +1032,16 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (ToyEntry const* toy : sToyStore)
_toys.insert(toy->ItemID);
+ for (TransmogSetItemEntry const* transmogSetItem : sTransmogSetItemStore)
+ {
+ TransmogSetEntry const* set = sTransmogSetStore.LookupEntry(transmogSetItem->TransmogSetID);
+ if (!set)
+ continue;
+
+ _transmogSetsByItemModifiedAppearance[transmogSetItem->ItemModifiedAppearanceID].push_back(set);
+ _transmogSetItemsByTransmogSet[transmogSetItem->TransmogSetID].push_back(transmogSetItem);
+ }
+
for (WMOAreaTableEntry const* entry : sWMOAreaTableStore)
_wmoAreaTableLookup[WMOAreaTableKey(entry->WMOID, entry->NameSet, entry->WMOGroupID)] = entry;
@@ -1958,6 +1978,16 @@ bool DB2Manager::IsToyItem(uint32 toy) const
return _toys.count(toy) > 0;
}
+std::vector<TransmogSetEntry const*> const* DB2Manager::GetTransmogSetsForItemModifiedAppearance(uint32 itemModifiedAppearanceId) const
+{
+ return Trinity::Containers::MapGetValuePtr(_transmogSetsByItemModifiedAppearance, itemModifiedAppearanceId);
+}
+
+std::vector<TransmogSetItemEntry const*> const* DB2Manager::GetTransmogSetItems(uint32 transmogSetId) const
+{
+ return Trinity::Containers::MapGetValuePtr(_transmogSetItemsByTransmogSet, transmogSetId);
+}
+
WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const
{
auto i = _wmoAreaTableLookup.find(WMOAreaTableKey(int16(rootId), int8(adtId), groupId));
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 0b52feacb77..b25655d3ddc 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -193,6 +193,10 @@ TC_GAME_API extern DB2Storage<SummonPropertiesEntry> sSummonPrope
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<TransmogSetEntry> sTransmogSetStore;
+TC_GAME_API extern DB2Storage<TransmogSetGroupEntry> sTransmogSetGroupStore;
+TC_GAME_API extern DB2Storage<TransmogSetItemEntry> sTransmogSetItemStore;
TC_GAME_API extern DB2Storage<TransportAnimationEntry> sTransportAnimationStore;
TC_GAME_API extern DB2Storage<TransportRotationEntry> sTransportRotationStore;
TC_GAME_API extern DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore;
@@ -312,6 +316,8 @@ public:
std::vector<TalentEntry const*> const& GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const;
static bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId);
bool IsToyItem(uint32 toy) const;
+ std::vector<TransmogSetEntry const*> const* GetTransmogSetsForItemModifiedAppearance(uint32 itemModifiedAppearanceId) const;
+ std::vector<TransmogSetItemEntry const*> const* GetTransmogSetItems(uint32 transmogSetId) const;
WMOAreaTableEntry const* GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const;
uint32 GetVirtualMapForMapAndZone(uint32 mapId, uint32 zoneId) const;
void Zone2MapCoordinates(uint32 areaId, float& x, float& y) const;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 14d9465e7ba..325b5108673 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -727,6 +727,12 @@ struct CriteriaEntry
// CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182
uint32 CharShipmentContainerID;
+
+ // CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT
+ uint32 EquipmentSlot;
+
+ // CRITERIA_TYPE_TRANSMOG_SET_UNLOCKED = 205
+ uint32 TransmogSetGroupID;
} Asset;
uint32 StartAsset;
uint32 FailAsset;
@@ -2767,6 +2773,40 @@ struct ToyEntry
uint32 ID;
};
+struct TransmogHolidayEntry
+{
+ uint32 ID;
+ int32 HolidayID;
+};
+
+struct TransmogSetEntry
+{
+ LocalizedString* Name;
+ uint16 BaseSetID;
+ uint16 UIOrder;
+ uint8 ExpansionID;
+ uint32 ID;
+ int32 Flags;
+ int32 QuestID;
+ int32 ClassMask;
+ int32 ItemNameDescriptionID;
+ uint32 TransmogSetGroupID;
+};
+
+struct TransmogSetGroupEntry
+{
+ LocalizedString* Label;
+ uint32 ID;
+};
+
+struct TransmogSetItemEntry
+{
+ uint32 ID;
+ uint32 TransmogSetID;
+ uint32 ItemModifiedAppearanceID;
+ int32 Flags;
+};
+
struct TransportAnimationEntry
{
uint32 ID;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index aa7a208e9e7..cdb52accfbf 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -479,6 +479,7 @@ enum CriteriaTypes : uint8
// 202 - 0 criterias (Legion - 23420)
CRITERIA_TYPE_COMPLETE_WORLD_QUEST = 203,
// 204 - Special criteria type to award players for some external events? Comes with what looks like an identifier, so guessing it's not unique.
+ CRITERIA_TYPE_TRANSMOG_SET_UNLOCKED = 205
};
#define CRITERIA_TYPE_TOTAL 208
diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp
index 80fbacd59bb..7952f0ca053 100644
--- a/src/server/game/Entities/Player/CollectionMgr.cpp
+++ b/src/server/game/Entities/Player/CollectionMgr.cpp
@@ -603,6 +603,53 @@ void CollectionMgr::AddItemAppearance(uint32 itemId, uint32 appearanceModId /*=
AddItemAppearance(itemModifiedAppearance);
}
+void CollectionMgr::AddTransmogSet(uint32 transmogSetId)
+{
+ std::vector<TransmogSetItemEntry const*> const* items = sDB2Manager.GetTransmogSetItems(transmogSetId);
+ if (!items)
+ return;
+
+ for (TransmogSetItemEntry const* item : *items)
+ {
+ ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(item->ItemModifiedAppearanceID);
+ if (!itemModifiedAppearance)
+ continue;
+
+ AddItemAppearance(itemModifiedAppearance);
+ }
+}
+
+bool CollectionMgr::IsSetCompleted(uint32 transmogSetId) const
+{
+ std::vector<TransmogSetItemEntry const*> const* transmogSetItems = sDB2Manager.GetTransmogSetItems(transmogSetId);
+ if (!transmogSetItems)
+ return false;
+
+ std::array<int8, EQUIPMENT_SLOT_END> knownPieces;
+ knownPieces.fill(-1);
+ for (TransmogSetItemEntry const* transmogSetItem : *transmogSetItems)
+ {
+ ItemModifiedAppearanceEntry const* itemModifiedAppearance = sItemModifiedAppearanceStore.LookupEntry(transmogSetItem->ItemModifiedAppearanceID);
+ if (!itemModifiedAppearance)
+ continue;
+
+ ItemEntry const* item = sItemStore.LookupEntry(itemModifiedAppearance->ItemID);
+ if (!item)
+ continue;
+
+ int32 transmogSlot = ItemTransmogrificationSlots[item->InventoryType];
+ if (transmogSlot < 0 || knownPieces[transmogSlot] == 1)
+ continue;
+
+ bool hasAppearance, isTemporary;
+ std::tie(hasAppearance, isTemporary) = HasItemAppearance(transmogSetItem->ItemModifiedAppearanceID);
+
+ knownPieces[transmogSlot] = (hasAppearance && !isTemporary) ? 1 : 0;
+ }
+
+ return std::find(knownPieces.begin(), knownPieces.end(), 0) == knownPieces.end();
+}
+
bool CollectionMgr::CanAddAppearance(ItemModifiedAppearanceEntry const* itemModifiedAppearance) const
{
if (!itemModifiedAppearance)
@@ -705,6 +752,18 @@ void CollectionMgr::AddItemAppearance(ItemModifiedAppearanceEntry const* itemMod
_owner->GetPlayer()->RemoveDynamicValue(PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG, itemModifiedAppearance->ID);
_temporaryAppearances.erase(temporaryAppearance);
}
+
+ if (ItemEntry const* item = sItemStore.LookupEntry(itemModifiedAppearance->ItemID))
+ {
+ int32 transmogSlot = ItemTransmogrificationSlots[item->InventoryType];
+ if (transmogSlot >= 0)
+ _owner->GetPlayer()->UpdateCriteria(CRITERIA_TYPE_APPEARANCE_UNLOCKED_BY_SLOT, transmogSlot, 1);
+ }
+
+ if (std::vector<TransmogSetEntry const*> const* sets = sDB2Manager.GetTransmogSetsForItemModifiedAppearance(itemModifiedAppearance->ID))
+ for (TransmogSetEntry const* set : *sets)
+ if (IsSetCompleted(set->ID))
+ _owner->GetPlayer()->UpdateCriteria(CRITERIA_TYPE_TRANSMOG_SET_UNLOCKED, set->TransmogSetGroupID);
}
void CollectionMgr::AddTemporaryAppearance(ObjectGuid const& itemGuid, ItemModifiedAppearanceEntry const* itemModifiedAppearance)
diff --git a/src/server/game/Entities/Player/CollectionMgr.h b/src/server/game/Entities/Player/CollectionMgr.h
index 3036d879041..3b7eee4f060 100644
--- a/src/server/game/Entities/Player/CollectionMgr.h
+++ b/src/server/game/Entities/Player/CollectionMgr.h
@@ -116,6 +116,8 @@ public:
void SaveAccountItemAppearances(SQLTransaction& trans);
void AddItemAppearance(Item* item);
void AddItemAppearance(uint32 itemId, uint32 appearanceModId = 0);
+ void AddTransmogSet(uint32 transmogSetId);
+ bool IsSetCompleted(uint32 transmogSetId) const;
void RemoveTemporaryAppearance(Item* item);
// returns pair<hasAppearance, isTemporary>
std::pair<bool, bool> HasItemAppearance(uint32 itemModifiedAppearanceId) const;
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 881e578813e..be318a0d541 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -477,6 +477,7 @@ class TC_GAME_API Spell
void EffectGiveArtifactPowerNoBonus(SpellEffIndex effIndex);
void EffectPlayScene(SpellEffIndex effIndex);
void EffectGiveHonor(SpellEffIndex effIndex);
+ void EffectLearnTransmogSet(SpellEffIndex effIndex);
typedef std::unordered_set<Aura*> UsedSpellMods;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index cdc6aeb4751..53bb34eae34 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -328,7 +328,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectTeleportUnits, //252 SPELL_EFFECT_TELEPORT_UNITS
&Spell::EffectGiveHonor, //253 SPELL_EFFECT_GIVE_HONOR
&Spell::EffectNULL, //254 SPELL_EFFECT_254
- &Spell::EffectNULL, //255 SPELL_EFFECT_LEARN_TRANSMOG_SET
+ &Spell::EffectLearnTransmogSet, //255 SPELL_EFFECT_LEARN_TRANSMOG_SET
};
void Spell::EffectNULL(SpellEffIndex /*effIndex*/)
@@ -5901,3 +5901,14 @@ void Spell::EffectGiveHonor(SpellEffIndex /*effIndex*/)
playerTarget->AddHonorXP(damage);
playerTarget->SendDirectMessage(packet.Write());
}
+
+void Spell::EffectLearnTransmogSet(SpellEffIndex /*effIndex*/)
+{
+ if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
+ return;
+
+ if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ unitTarget->ToPlayer()->GetSession()->GetCollectionMgr()->AddTransmogSet(effectInfo->MiscValue);
+}