mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-21 07:22:02 -04:00
@@ -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;
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user