29#include <boost/dynamic_bitset.hpp>
44 TC_LOG_INFO(
"server.loading",
">> Loaded 0 mount definitions. DB table `mount_definitions` is empty.");
50 Field* fields = result->Fetch();
57 TC_LOG_ERROR(
"sql.sql",
"Mount spell {} defined in `mount_definitions` does not exist in Mount.db2, skipped", spellId);
61 if (otherFactionSpellId && !
sDB2Manager.GetMount(otherFactionSpellId))
63 TC_LOG_ERROR(
"sql.sql",
"otherFactionSpellId {} defined in `mount_definitions` for spell {} does not exist in Mount.db2, skipped", otherFactionSpellId, spellId);
67 FactionSpecificMounts[spellId] = otherFactionSpellId;
68 }
while (result->NextRow());
98 for (
auto const& t :
_toys)
120 Field* fields = result->Fetch();
122 _toys.emplace(itemId, GetToyFlags(fields[1].GetBool(), fields[2].GetBool()));
123 }
while (result->NextRow());
129 for (
auto const& toy :
_toys)
142 return _toys.insert(ToyBoxContainer::value_type(itemId, GetToyFlags(isFavourite, hasFanfare))).second;
147 ToyBoxContainer::iterator itr =
_toys.find(itemId);
148 if (itr ==
_toys.end())
159 auto itr =
_toys.find(itemId);
160 if (itr ==
_toys.end())
181 Field* fields = result->Fetch();
193 if (
flags & (1 << upgradeLevel))
201 }
while (result->NextRow());
212 stmt->
setUInt32(2, heirloom.second.flags);
224 HeirloomContainer::const_iterator itr =
_heirlooms.find(itemId);
226 return itr->second.bonusId;
253 HeirloomContainer::iterator itr =
_heirlooms.find(itemId);
264 flags |= 1 << upgradeLevel;
270 item->AddBonuses(bonusId);
274 uint32 offset =
uint32(std::distance(heirlooms.begin(), std::find(heirlooms.begin(), heirlooms.end(),
int32(itemId))));
277 itr->second.flags =
flags;
278 itr->second.bonusId = bonusId;
295 uint32 heirloomItemId = heirloom->StaticUpgradedItemID;
300 newItemId = heirloomDiff->ItemID;
304 heirloomItemId = heirloomSub->ItemID;
314 uint32 offset =
uint32(std::distance(heirlooms.begin(), std::find(heirlooms.begin(), heirlooms.end(),
int32(itr->first))));
327 for (
uint32 bonusId : bonusListIDs)
329 if (bonusId != itr->second.bonusId)
336 if (std::find(bonusListIDs.begin(), bonusListIDs.end(),
int32(itr->second.bonusId)) == bonusListIDs.end())
344 AddMount(m.first, m.second,
false,
false);
354 Field* fields = result->Fetch();
362 }
while (result->NextRow());
367 for (
auto const& mount :
_mounts)
387 MountDefinitionMap::const_iterator itr = FactionSpecificMounts.find(spellId);
388 if (itr != FactionSpecificMounts.end() && !factionMount)
391 _mounts.insert(MountContainer::value_type(spellId,
flags));
414 auto itr =
_mounts.find(spellId);
434 tempMounts.insert(mount);
438 mountUpdate.
Mounts = &tempMounts;
480 if (knownAppearances)
482 std::vector<uint32> blocks;
485 Field* fields = knownAppearances->Fetch();
487 if (blobIndex >= blocks.size())
488 blocks.resize(blobIndex + 1);
490 blocks[blobIndex] = fields[1].
GetUInt32();
492 }
while (knownAppearances->NextRow());
494 _appearances->init_from_block_range(blocks.begin(), blocks.end());
497 if (favoriteAppearances)
502 }
while (favoriteAppearances->NextRow());
506 static uint32 constexpr hiddenAppearanceItems[] =
520 for (
uint32 hiddenItem : hiddenAppearanceItems)
620 std::vector<TransmogSetItemEntry const*>
const* items =
sDB2Manager.GetTransmogSetItems(transmogSetId);
627 if (!itemModifiedAppearance)
636 std::vector<TransmogSetItemEntry const*>
const* transmogSetItems =
sDB2Manager.GetTransmogSetItems(transmogSetId);
637 if (!transmogSetItems)
640 std::array<int8, EQUIPMENT_SLOT_END> knownPieces;
641 knownPieces.fill(-1);
645 if (!itemModifiedAppearance)
653 if (transmogSlot < 0 || knownPieces[transmogSlot] == 1)
656 auto [hasAppearance, isTemporary] =
HasItemAppearance(transmogSetItem->ItemModifiedAppearanceID);
658 knownPieces[transmogSlot] = (hasAppearance && !isTemporary) ? 1 : 0;
661 return std::find(knownPieces.begin(), knownPieces.end(), 0) == knownPieces.end();
666 if (!itemModifiedAppearance)
756 uint32 blockIndex = itemModifiedAppearance->
ID / 32;
757 uint32 bitIndex = itemModifiedAppearance->
ID % 32;
769 if (transmogSlot >= 0)
773 if (std::vector<TransmogSetEntry const*>
const* sets =
sDB2Manager.GetTransmogSetsForItemModifiedAppearance(itemModifiedAppearance->
ID))
782 if (itemsWithAppearance.empty())
785 itemsWithAppearance.insert(itemGuid);
791 if (!itemModifiedAppearance)
798 itr->second.erase(item->
GetGUID());
799 if (itr->second.empty())
808 if (itemModifiedAppearanceId < _appearances->
size() &&
_appearances->test(itemModifiedAppearanceId))
809 return{
true,
false };
814 return{
false,
false };
821 return temporaryAppearance->second;
823 return std::unordered_set<ObjectGuid>();
828 std::unordered_set<uint32> appearances;
830 while (
id != boost::dynamic_bitset<uint32>::npos)
892 if (knownTransmogIllusions)
894 std::vector<uint32> blocks;
897 Field* fields = knownTransmogIllusions->Fetch();
899 if (blobIndex >= blocks.size())
900 blocks.resize(blobIndex + 1);
902 blocks[blobIndex] = fields[1].
GetUInt32();
904 }
while (knownTransmogIllusions->NextRow());
910 static uint16 constexpr defaultIllusions[] =
921 for (
uint16 illusionId : defaultIllusions)
961 uint32 blockIndex = transmogIllusionId / 32;
962 uint32 bitIndex = transmogIllusionId % 32;
uint32 const PlayerClassByArmorSubclass[MAX_ITEM_SUBCLASS_ARMOR]
std::map< uint32, MountStatusFlags > MountContainer
std::unordered_map< uint32, uint32 > MountDefinitionMap
DB2Storage< ItemEntry > sItemStore("Item.db2", &ItemLoadInfo::Instance)
DB2Storage< ItemSearchNameEntry > sItemSearchNameStore("ItemSearchName.db2", &ItemSearchNameLoadInfo::Instance)
DB2Storage< ItemModifiedAppearanceEntry > sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", &ItemModifiedAppearanceLoadInfo::Instance)
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
@ CollectTransmogSetFromGroup
SQLTransaction< LoginDatabaseConnection > LoginDatabaseTransaction
std::shared_ptr< ResultSet > QueryResult
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
@ ITEM_FLAG2_NO_SOURCE_FOR_ITEM_VISUAL
@ ITEM_SUBCLASS_WEAPON_MISCELLANEOUS
@ ITEM_SUBCLASS_WEAPON_SPEAR
@ ITEM_SUBCLASS_WEAPON_EXOTIC2
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
@ ITEM_SUBCLASS_WEAPON_EXOTIC
@ ITEM_SUBCLASS_WEAPON_THROWN
@ ITEM_SUBCLASS_ARMOR_MISCELLANEOUS
#define MAX_ITEM_SUBCLASS_ARMOR
int32 const ItemTransmogrificationSlots[MAX_INVTYPE]
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
@ LOGIN_INS_BNET_TRANSMOG_ILLUSIONS
@ LOGIN_REP_ACCOUNT_MOUNTS
@ LOGIN_REP_ACCOUNT_HEIRLOOMS
@ LOGIN_INS_BNET_ITEM_FAVORITE_APPEARANCE
@ LOGIN_INS_BNET_ITEM_APPEARANCES
@ LOGIN_DEL_BNET_ITEM_FAVORITE_APPEARANCE
#define CLASSMASK_ALL_PLAYABLE
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
void AddTemporaryAppearance(ObjectGuid const &itemGuid, ItemModifiedAppearanceEntry const *itemModifiedAppearance)
bool UpdateAccountToys(uint32 itemId, bool isFavourite, bool hasFanfare)
void RemoveTemporaryAppearance(Item *item)
void AddItemAppearance(Item *item)
void LoadAccountMounts(PreparedQueryResult result)
void MountSetFavorite(uint32 spellId, bool favorite)
std::unordered_map< uint32, FavoriteAppearanceState > _favoriteAppearances
bool IsSetCompleted(uint32 transmogSetId) const
void SaveAccountToys(LoginDatabaseTransaction trans)
bool UpdateAccountHeirlooms(uint32 itemId, uint32 flags)
void ToyClearFanfare(uint32 itemId)
void AddTransmogSet(uint32 transmogSetId)
void OnItemAdded(Item *item)
HeirloomContainer _heirlooms
void SendSingleMountUpdate(std::pair< uint32, MountStatusFlags > mount)
void SaveAccountTransmogIllusions(LoginDatabaseTransaction trans)
std::unordered_map< uint32, std::unordered_set< ObjectGuid > > _temporaryAppearances
uint32 GetHeirloomBonus(uint32 itemId) const
void SaveAccountMounts(LoginDatabaseTransaction trans)
void ToySetFavorite(uint32 itemId, bool favorite)
bool HasTransmogIllusion(uint32 transmogIllusionId) const
void SaveAccountHeirlooms(LoginDatabaseTransaction trans)
bool AddMount(uint32 spellId, MountStatusFlags flags, bool factionMount=false, bool learned=false)
std::unique_ptr< boost::dynamic_bitset< uint32 > > _appearances
void LoadTransmogIllusions()
std::unordered_set< ObjectGuid > GetItemsProvidingTemporaryAppearance(uint32 itemModifiedAppearanceId) const
void UpgradeHeirloom(uint32 itemId, int32 castItem)
void LoadAccountHeirlooms(PreparedQueryResult result)
std::unordered_set< uint32 > GetAppearanceIds() const
std::unique_ptr< boost::dynamic_bitset< uint32 > > _transmogIllusions
void LoadAccountTransmogIllusions(PreparedQueryResult knownTransmogIllusions)
CollectionMgr(WorldSession *owner)
bool AddToy(uint32 itemId, bool isFavourite, bool hasFanfare)
void AddHeirloom(uint32 itemId, uint32 flags)
void CheckHeirloomUpgrades(Item *item)
void LoadAccountItemAppearances(PreparedQueryResult knownAppearances, PreparedQueryResult favoriteAppearances)
std::pair< bool, bool > HasItemAppearance(uint32 itemModifiedAppearanceId) const
bool CanAddAppearance(ItemModifiedAppearanceEntry const *itemModifiedAppearance) const
void SetAppearanceIsFavorite(uint32 itemModifiedAppearanceId, bool apply)
static void LoadMountDefinitions()
void SendFavoriteAppearances() const
void SaveAccountItemAppearances(LoginDatabaseTransaction trans)
void AddTransmogIllusion(uint32 transmogIllusionId)
void LoadAccountToys(PreparedQueryResult result)
void LoadItemAppearances()
static bool IsPlayerMeetingCondition(Player const *player, PlayerConditionEntry const *condition)
Class used to access individual fields of database query result.
void AddBonuses(uint32 bonusListID)
std::vector< int32 > const & GetBonusListIDs() const
bool IsBOPTradeable() const
bool IsRefundable() const
ItemModifiedAppearanceEntry const * GetItemModifiedAppearance() const
static ObjectGuid GetGUID(Object const *o)
void LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill=0, bool suppressMessaging=false, Optional< int32 > traitDefinitionId={})
void SendDirectMessage(WorldPacket const *data) const
Item * GetItemByEntry(uint32 entry, ItemSearchLocation where=ItemSearchLocation::Default) const
void AddTransmogFlag(uint32 slot, uint32 flag)
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
void AddConditionalTransmog(uint32 itemModifiedAppearanceId)
uint32 GetWeaponProficiency() const
void AddIllusionBlock(uint32 blockValue)
void RemoveConditionalTransmog(uint32 itemModifiedAppearanceId)
void AddIllusionFlag(uint32 slot, uint32 flag)
void SetHeirloom(uint32 slot, int32 itemId)
UF::UpdateField< UF::ActivePlayerData, 0, TYPEID_ACTIVE_PLAYER > m_activePlayerData
bool HasSpell(uint32 spell) const override
void AddToy(int32 itemId, uint32 flags)
std::vector< Item * > GetItemListByEntry(uint32 entry, bool inBankAlso=false) const
void AddHeirloom(int32 itemId, uint32 flags)
void AddTransmogBlock(uint32 blockValue)
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
void SetHeirloomFlags(uint32 slot, uint32 flags)
void setUInt8(const uint8 index, const uint8 value)
void setBool(const uint8 index, const bool value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt16(const uint8 index, const uint16 value)
uint32 GetClassMask() const
MountContainer const * Mounts
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< uint32 > FavoriteAppearances
Player session in the World.
Player * GetPlayer() const
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
uint32 GetBattlenetAccountId() const
constexpr std::size_t size()
DynamicBitsetBlockOutputIterator & operator*()
std::function< void(uint32)> _action
std::output_iterator_tag iterator_category
DynamicBitsetBlockOutputIterator operator++(int)
DynamicBitsetBlockOutputIterator(std::function< void(uint32)> &&action)
DynamicBitsetBlockOutputIterator & operator++()
DynamicBitsetBlockOutputIterator & operator=(uint32 value)
std::array< uint16, 6 > UpgradeItemBonusListID
std::array< int32, 6 > UpgradeItemID
uint8 TransmogSourceTypeEnum
uint32 GetQuality() const
InventoryType GetInventoryType() const
bool HasFlag(ItemFlags flag) const
uint32 GetSubClass() const