diff options
| author | fluxurion <zoltan@fatalerror.hu> | 2022-06-01 14:05:54 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-06-09 21:27:02 +0200 |
| commit | 125ada42f6be220a52315d06d61e472a2ba83395 (patch) | |
| tree | 9d6dcaf77654b98a1610fe2e162d988708f03081 /src/server/game/Entities | |
| parent | b11574871e11e5e34b59e1d89b7fcad428fdfb56 (diff) | |
Core/Transmog: Implemented Transmog Illusions + Spelleffect to unlock them
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Player/CollectionMgr.cpp | 88 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/CollectionMgr.h | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 4 |
4 files changed, 100 insertions, 1 deletions
diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp index c7d2966ea0f..ff77b19e6f7 100644 --- a/src/server/game/Entities/Player/CollectionMgr.cpp +++ b/src/server/game/Entities/Player/CollectionMgr.cpp @@ -85,7 +85,7 @@ namespace } } -CollectionMgr::CollectionMgr(WorldSession* owner) : _owner(owner), _appearances(std::make_unique<boost::dynamic_bitset<uint32>>()) +CollectionMgr::CollectionMgr(WorldSession* owner) : _owner(owner), _appearances(std::make_unique<boost::dynamic_bitset<uint32>>()), _transmogIllusions(std::make_unique<boost::dynamic_bitset<uint32>>()) { } @@ -882,3 +882,89 @@ void CollectionMgr::SendFavoriteAppearances() const _owner->SendPacket(accountTransmogUpdate.Write()); } + +void CollectionMgr::LoadTransmogIllusions() +{ + Player* owner = _owner->GetPlayer(); + boost::to_block_range(*_transmogIllusions, DynamicBitsetBlockOutputIterator([owner](uint32 blockValue) + { + owner->AddIllusionBlock(blockValue); + })); +} + +void CollectionMgr::LoadAccountTransmogIllusions(PreparedQueryResult knownTransmogIllusions) +{ + if (knownTransmogIllusions) + { + std::vector<uint32> blocks; + do + { + Field* fields = knownTransmogIllusions->Fetch(); + uint16 blobIndex = fields[0].GetUInt16(); + if (blobIndex >= blocks.size()) + blocks.resize(blobIndex + 1); + + blocks[blobIndex] = fields[1].GetUInt32(); + + } while (knownTransmogIllusions->NextRow()); + + _transmogIllusions->init_from_block_range(blocks.begin(), blocks.end()); + } + + // Static illusions known by every player + static uint16 constexpr defaultIllusions[] = + { + 3, // Lifestealing + 13, // Crusader + 22, // Striking + 23, // Agility + 34, // Hide Weapon Enchant + 43, // Beastslayer + 44, // Titanguard + }; + + for (uint16 illusionId : defaultIllusions) + { + if (_transmogIllusions->size() <= illusionId) + _transmogIllusions->resize(illusionId + 1); + + _transmogIllusions->set(illusionId); + } +} + +void CollectionMgr::SaveAccountTransmogIllusions(LoginDatabaseTransaction trans) +{ + uint16 blockIndex = 0; + + boost::to_block_range(*_transmogIllusions, DynamicBitsetBlockOutputIterator([this, &blockIndex, trans](uint32 blockValue) + { + if (blockValue) // this table is only appended/bits are set (never cleared) so don't save empty blocks + { + LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BNET_TRANSMOG_ILLUSIONS); + stmt->setUInt32(0, _owner->GetBattlenetAccountId()); + stmt->setUInt16(1, blockIndex); + stmt->setUInt32(2, blockValue); + trans->Append(stmt); + } + ++blockIndex; + })); +} + +void CollectionMgr::AddTransmogIllusion(uint16 illusionId) +{ + Player* owner = _owner->GetPlayer(); + if (_transmogIllusions->size() <= illusionId) + { + std::size_t numBlocks = _transmogIllusions->num_blocks(); + _transmogIllusions->resize(illusionId + 1); + numBlocks = _transmogIllusions->num_blocks() - numBlocks; + while (numBlocks--) + owner->AddIllusionBlock(0); + } + + _transmogIllusions->set(illusionId); + uint32 blockIndex = illusionId / 32; + uint32 bitIndex = illusionId % 32; + + owner->AddIllusionFlag(blockIndex, 1 << bitIndex); +} diff --git a/src/server/game/Entities/Player/CollectionMgr.h b/src/server/game/Entities/Player/CollectionMgr.h index 7c3c5d9c014..7c757f0d64e 100644 --- a/src/server/game/Entities/Player/CollectionMgr.h +++ b/src/server/game/Entities/Player/CollectionMgr.h @@ -138,6 +138,12 @@ public: // returns ItemAppearance::ID, not ItemModifiedAppearance::ID std::unordered_set<uint32> GetAppearanceIds() const; + // Illusions + void LoadTransmogIllusions(); + void LoadAccountTransmogIllusions(PreparedQueryResult knownIllusions); + void SaveAccountTransmogIllusions(LoginDatabaseTransaction trans); + void AddTransmogIllusion(uint16 illusionId); + enum class FavoriteAppearanceState { New, @@ -161,6 +167,7 @@ private: std::unique_ptr<boost::dynamic_bitset<uint32>> _appearances; std::unordered_map<uint32, std::unordered_set<ObjectGuid>> _temporaryAppearances; std::unordered_map<uint32, FavoriteAppearanceState> _favoriteAppearances; + std::unique_ptr<boost::dynamic_bitset<uint32>> _transmogIllusions; }; #endif // CollectionMgr_h__ diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e35a3a80aa4..cf02d2e5e6b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -18500,6 +18500,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol GetSession()->GetCollectionMgr()->LoadHeirlooms(); GetSession()->GetCollectionMgr()->LoadMounts(); GetSession()->GetCollectionMgr()->LoadItemAppearances(); + GetSession()->GetCollectionMgr()->LoadTransmogIllusions(); LearnSpecializationSpells(); @@ -20784,6 +20785,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba GetSession()->GetCollectionMgr()->SaveAccountHeirlooms(loginTransaction); GetSession()->GetCollectionMgr()->SaveAccountMounts(loginTransaction); GetSession()->GetCollectionMgr()->SaveAccountItemAppearances(loginTransaction); + GetSession()->GetCollectionMgr()->SaveAccountTransmogIllusions(loginTransaction); LoginDatabasePreparedStatement* loginStmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BNET_LAST_PLAYER_CHARACTERS); loginStmt->setUInt32(0, GetSession()->GetAccountId()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b9936e39af2..3f366b41c72 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2761,6 +2761,10 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> if (index >= 0) RemoveDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ConditionalTransmog), uint32(index)); } + + void AddIllusionBlock(uint32 blockValue) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TransmogIllusions)) = blockValue; } + void AddIllusionFlag(uint32 slot, uint32 flag) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TransmogIllusions, slot), flag); } + void AddSelfResSpell(int32 spellId) { AddDynamicUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::SelfResSpells)) = spellId; } void RemoveSelfResSpell(int32 spellId) { |
