diff options
author | Golrag <golrag.jeremy@gmail.com> | 2017-08-24 20:39:22 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-08-24 20:39:22 +0200 |
commit | fd73bedd735596ac6ddb3db4ead3938732b2ec43 (patch) | |
tree | cfa9c42b745581128f061607a7f21ff9283341d9 | |
parent | a93a5ad379635bbf4a50d48eee810e7673b07168 (diff) |
Core/Transmog: Implemented transmog sets
Closes #20133
Closes #20135
-rw-r--r-- | sql/updates/hotfixes/master/2017_08_24_00_hotfixes.sql | 77 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp | 15 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h | 10 | ||||
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 15 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 66 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 30 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 6 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 40 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Player/CollectionMgr.cpp | 59 | ||||
-rw-r--r-- | src/server/game/Entities/Player/CollectionMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 13 |
13 files changed, 333 insertions, 2 deletions
diff --git a/sql/updates/hotfixes/master/2017_08_24_00_hotfixes.sql b/sql/updates/hotfixes/master/2017_08_24_00_hotfixes.sql new file mode 100644 index 00000000000..d98ef18bd12 --- /dev/null +++ b/sql/updates/hotfixes/master/2017_08_24_00_hotfixes.sql @@ -0,0 +1,77 @@ +-- +-- Table structure for table `transmog_holiday` +-- +DROP TABLE IF EXISTS `transmog_holiday`; +CREATE TABLE `transmog_holiday` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `HolidayID` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `transmog_set` +-- +DROP TABLE IF EXISTS `transmog_set`; +CREATE TABLE `transmog_set` ( + `Name` text, + `BaseSetID` smallint(5) unsigned NOT NULL DEFAULT '0', + `UIOrder` smallint(5) unsigned NOT NULL DEFAULT '0', + `ExpansionID` tinyint(3) unsigned NOT NULL DEFAULT '0', + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(11) NOT NULL DEFAULT '0', + `QuestID` int(11) NOT NULL DEFAULT '0', + `ClassMask` int(11) NOT NULL DEFAULT '0', + `ItemNameDescriptionID` int(11) NOT NULL DEFAULT '0', + `TransmogSetGroupID` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `transmog_set_locale` +-- +DROP TABLE IF EXISTS `transmog_set_locale`; +CREATE TABLE `transmog_set_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Name_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `transmog_set_group` +-- +DROP TABLE IF EXISTS `transmog_set_group`; +CREATE TABLE `transmog_set_group` ( + `Label` text, + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `transmog_set_group_locale` +-- +DROP TABLE IF EXISTS `transmog_set_group_locale`; +CREATE TABLE `transmog_set_group_locale` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `locale` varchar(4) NOT NULL, + `Label_lang` text, + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`,`locale`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `transmog_set_item` +-- +DROP TABLE IF EXISTS `transmog_set_item`; +CREATE TABLE `transmog_set_item` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `TransmogSetID` int(10) unsigned NOT NULL DEFAULT '0', + `ItemModifiedAppearanceID` int(10) unsigned NOT NULL DEFAULT '0', + `Flags` int(11) NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; 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); +} |