Core/Transmog: Implemented transmog sets

Closes #20133
Closes #20135
This commit is contained in:
Golrag
2017-08-24 20:39:22 +02:00
committed by Shauren
parent a93a5ad379
commit fd73bedd73
13 changed files with 333 additions and 2 deletions
@@ -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";
}
+66
View File
@@ -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()
+30
View File
@@ -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));
+6
View File
@@ -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;
+40
View File
@@ -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;
+1
View File
@@ -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;
+1
View File
@@ -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;
+12 -1
View File
@@ -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);
}