aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorfluxurion <zoltan@fatalerror.hu>2022-06-01 14:05:54 +0200
committerShauren <shauren.trinity@gmail.com>2022-06-09 21:27:02 +0200
commit125ada42f6be220a52315d06d61e472a2ba83395 (patch)
tree9d6dcaf77654b98a1610fe2e162d988708f03081 /src/server/game/Entities
parentb11574871e11e5e34b59e1d89b7fcad428fdfb56 (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.cpp88
-rw-r--r--src/server/game/Entities/Player/CollectionMgr.h7
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.h4
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)
{