TrinityCore
Loading...
Searching...
No Matches
AzeriteItem.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "AzeriteItem.h"
19#include "AzeritePackets.h"
20#include "ConditionMgr.h"
21#include "DB2Stores.h"
22#include "DatabaseEnv.h"
23#include "GameObject.h"
24#include "GameTime.h"
25#include "Player.h"
26#include "UpdateData.h"
27#include "WorldPacket.h"
28#include <boost/date_time/gregorian/gregorian_types.hpp>
29#include <boost/date_time/posix_time/conversion.hpp>
30
39
50
52{
54 stmt->setUInt64(0, GetGUID().GetCounter());
55 trans->Append(stmt);
56
58 stmt->setUInt64(0, GetGUID().GetCounter());
59 trans->Append(stmt);
60
62 stmt->setUInt64(0, GetGUID().GetCounter());
63 trans->Append(stmt);
64
65 switch (GetState())
66 {
67 case ITEM_NEW:
68 case ITEM_CHANGED:
69 {
70 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE);
71 stmt->setUInt64(0, GetGUID().GetCounter());
72 stmt->setUInt64(1, m_azeriteItemData->Xp);
73 stmt->setUInt32(2, m_azeriteItemData->Level);
74 stmt->setUInt32(3, m_azeriteItemData->KnowledgeLevel);
75 std::size_t specIndex = 0;
76 for (; specIndex < m_azeriteItemData->SelectedEssences.size(); ++specIndex)
77 {
78 stmt->setUInt32(4 + specIndex * 5, m_azeriteItemData->SelectedEssences[specIndex].SpecializationID);
79 for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j)
80 stmt->setUInt32(5 + specIndex * 5 + j, m_azeriteItemData->SelectedEssences[specIndex].AzeriteEssenceID[j]);
81 }
82 for (; specIndex < 4; ++specIndex)
83 {
84 stmt->setUInt32(4 + specIndex * 5, 0);
85 for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j)
86 stmt->setUInt32(5 + specIndex * 5 + j, 0);
87 }
88
89 trans->Append(stmt);
90
91 for (uint32 azeriteItemMilestonePowerId : m_azeriteItemData->UnlockedEssenceMilestones)
92 {
94 stmt->setUInt64(0, GetGUID().GetCounter());
95 stmt->setUInt32(1, azeriteItemMilestonePowerId);
96 trans->Append(stmt);
97 }
98
99 for (UF::UnlockedAzeriteEssence const& azeriteEssence : m_azeriteItemData->UnlockedEssences)
100 {
102 stmt->setUInt64(0, GetGUID().GetCounter());
103 stmt->setUInt32(1, azeriteEssence.AzeriteEssenceID);
104 stmt->setUInt32(2, azeriteEssence.Rank);
105 trans->Append(stmt);
106 }
107 break;
108 }
109 case ITEM_REMOVED:
110 default:
111 break;
112 }
113
114 Item::SaveToDB(trans);
115}
116
117void AzeriteItem::LoadAzeriteItemData(Player const* owner, AzeriteItemData& azeriteItemData)
118{
119 bool needSave = false;
120
121 if (!sAzeriteLevelInfoStore.LookupEntry(azeriteItemData.Level))
122 {
123 azeriteItemData.Xp = 0;
124 azeriteItemData.Level = 1;
125 azeriteItemData.KnowledgeLevel = GetCurrentKnowledgeLevel();
126 needSave = true;
127 }
128 else if (azeriteItemData.Level > MAX_AZERITE_ITEM_LEVEL)
129 {
130 azeriteItemData.Xp = 0;
131 azeriteItemData.Level = MAX_AZERITE_ITEM_LEVEL;
132 needSave = true;
133 }
134
135 if (azeriteItemData.KnowledgeLevel != GetCurrentKnowledgeLevel())
136 {
137 // rescale XP to maintain same progress %
138 uint64 oldMax = CalcTotalXPToNextLevel(azeriteItemData.Level, azeriteItemData.KnowledgeLevel);
139 azeriteItemData.KnowledgeLevel = GetCurrentKnowledgeLevel();
140 uint64 newMax = CalcTotalXPToNextLevel(azeriteItemData.Level, azeriteItemData.KnowledgeLevel);
141 azeriteItemData.Xp = uint64(azeriteItemData.Xp / double(oldMax) * newMax);
142 needSave = true;
143 }
144 else if (azeriteItemData.KnowledgeLevel > MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL)
145 {
147 needSave = true;
148 }
149
153 for (uint32 azeriteItemMilestonePowerId : azeriteItemData.AzeriteItemMilestonePowers)
154 AddUnlockedEssenceMilestone(azeriteItemMilestonePowerId);
155
157
158 for (AzeriteEssencePowerEntry const* unlockedAzeriteEssence : azeriteItemData.UnlockedAzeriteEssences)
159 SetEssenceRank(unlockedAzeriteEssence->AzeriteEssenceID, unlockedAzeriteEssence->Tier);
160
161 for (AzeriteItemSelectedEssencesData const& selectedEssenceData : azeriteItemData.SelectedAzeriteEssences)
162 {
163 if (!selectedEssenceData.SpecializationId)
164 continue;
165
167 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(selectedEssenceData.SpecializationId);
168 for (uint32 i = 0; i < MAX_AZERITE_ESSENCE_SLOT; ++i)
169 {
170 // Check if essence was unlocked
171 if (!GetEssenceRank(selectedEssenceData.AzeriteEssenceId[i]))
172 continue;
173
174 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, i).SetValue(selectedEssenceData.AzeriteEssenceId[i]);
175 }
176
177 if (owner && owner->GetPrimarySpecialization() == ChrSpecialization(selectedEssenceData.SpecializationId))
178 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true);
179 }
180
181 // add selected essences for current spec
182 if (owner && !GetSelectedAzeriteEssences())
184
185 if (needSave)
186 {
188 stmt->setUInt64(0, azeriteItemData.Xp);
189 stmt->setUInt32(1, azeriteItemData.KnowledgeLevel);
190 stmt->setUInt64(2, GetGUID().GetCounter());
191 CharacterDatabase.Execute(stmt);
192 }
193}
194
196{
198 stmt->setUInt64(0, itemGuid);
199 CharacterDatabase.ExecuteOrAppend(trans, stmt);
200
202 stmt->setUInt64(0, itemGuid);
203 CharacterDatabase.ExecuteOrAppend(trans, stmt);
204
206 stmt->setUInt64(0, itemGuid);
207 CharacterDatabase.ExecuteOrAppend(trans, stmt);
208}
209
215
217{
218 // count weeks from 14.01.2020
219 boost::gregorian::date now = boost::posix_time::from_time_t(GameTime::GetGameTime()).date();
220 boost::gregorian::week_iterator itr(boost::gregorian::date(2020, boost::date_time::Jan, 14));
221 uint32 knowledge = 0;
222 while (*itr < now && knowledge < MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL)
223 {
224 ++knowledge;
225 ++itr;
226 }
227 return knowledge;
228}
229
231{
232 AzeriteLevelInfoEntry const* levelInfo = sAzeriteLevelInfoStore.AssertEntry(level);
233 uint64 totalXp = levelInfo->BaseExperienceToNextLevel * sAzeriteKnowledgeMultiplierStore.AssertEntry(knowledgeLevel)->Multiplier;
234 return std::max(totalXp, levelInfo->MinimumExperienceToNextLevel);
235}
236
238{
239 Player* owner = GetOwner();
240 uint32 level = m_azeriteItemData->Level;
241 if (level < MAX_AZERITE_ITEM_LEVEL)
242 {
243 uint64 currentXP = m_azeriteItemData->Xp;
244 uint64 remainingXP = xp;
245 do
246 {
247 uint64 totalXp = CalcTotalXPToNextLevel(level, m_azeriteItemData->KnowledgeLevel);
248 if (currentXP + remainingXP >= totalXp)
249 {
250 // advance to next level
251 ++level;
252 remainingXP -= totalXp - currentXP;
253 currentXP = 0;
254 }
255 else
256 {
257 currentXP += remainingXP;
258 remainingXP = 0;
259 }
260 } while (remainingXP > 0 && level < MAX_AZERITE_ITEM_LEVEL);
261
263
265
266 // changing azerite level changes item level, need to update stats
267 if (m_azeriteItemData->Level != level)
268 {
269 if (IsEquipped())
270 owner->_ApplyItemBonuses(this, GetSlot(), false);
271
275
276 if (IsEquipped())
277 owner->_ApplyItemBonuses(this, GetSlot(), true);
278 }
279
280 SetState(ITEM_CHANGED, owner);
281 }
282
284 xpGain.ItemGUID = GetGUID();
285 xpGain.XP = xp;
286 owner->SendDirectMessage(xpGain.Write());
287}
288
290{
291 if (GameObject const* forge = owner->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_ITEM_FORGE, 40.0f))
292 if (forge->GetGOInfo()->itemForge.ForgeType == 2)
293 return forge;
294
295 return nullptr;
296}
297
302
304{
305 AzeriteItemMilestonePowerEntry const* milestone = sDB2Manager.GetAzeriteItemMilestonePower(slot);
306 return m_azeriteItemData->UnlockedEssenceMilestones.FindIndex(milestone->ID) != -1;
307}
308
310{
311 int32 index = m_azeriteItemData->UnlockedEssences.FindIndexIf([azeriteEssenceId](UF::UnlockedAzeriteEssence const& essence)
312 {
313 return essence.AzeriteEssenceID == azeriteEssenceId;
314 });
315
316 if (index < 0)
317 return 0;
318
319 return m_azeriteItemData->UnlockedEssences[index].Rank;
320}
321
322void AzeriteItem::SetEssenceRank(uint32 azeriteEssenceId, uint32 rank)
323{
324 int32 index = m_azeriteItemData->UnlockedEssences.FindIndexIf([azeriteEssenceId](UF::UnlockedAzeriteEssence const& essence)
325 {
326 return essence.AzeriteEssenceID == azeriteEssenceId;
327 });
328
329 if (!rank && index >= 0)
330 {
332 return;
333 }
334
335 if (!sDB2Manager.GetAzeriteEssencePower(azeriteEssenceId, rank))
336 return;
337
338 if (index < 0)
339 {
342 unlockedEssence.AzeriteEssenceID = azeriteEssenceId;
343 unlockedEssence.Rank = rank;
344 }
345 else
347 .ModifyValue(&UF::UnlockedAzeriteEssence::Rank), rank);
348}
349
351{
352 for (UF::SelectedAzeriteEssences const& essences : m_azeriteItemData->SelectedEssences)
353 if (essences.Enabled)
354 return &essences;
355
356 return nullptr;
357}
358
360{
361 int32 index = m_azeriteItemData->SelectedEssences.FindIndexIf([](UF::SelectedAzeriteEssences const& essences) { return essences.Enabled == 1; });
362 if (index >= 0)
364 .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), false);
365
366 index = m_azeriteItemData->SelectedEssences.FindIndexIf([specializationId](UF::SelectedAzeriteEssences const& essences)
367 {
368 return essences.SpecializationID == specializationId;
369 });
370
371 if (index >= 0)
373 .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), true);
374 else
375 CreateSelectedAzeriteEssences(specializationId);
376}
377
379{
381 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(specializationId);
382 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true);
383}
384
386{
388 int32 index = m_azeriteItemData->SelectedEssences.FindIndexIf([](UF::SelectedAzeriteEssences const& essences) { return essences.Enabled == 1; });
389 ASSERT(index >= 0);
391 .ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, slot), azeriteEssenceId);
392}
393
395{
396 m_objectData->WriteCreate(flags, data, target, this);
397 m_itemData->WriteCreate(flags, data, target, this);
398 m_azeriteItemData->WriteCreate(flags, data, target, this);
399}
400
402{
404
406 m_objectData->WriteUpdate(flags, data, target, this);
407
409 m_itemData->WriteUpdate(flags, data, target, this);
410
412 m_azeriteItemData->WriteUpdate(flags, data, target, this);
413}
414
416{
418 valuesMask.Set(TYPEID_ITEM);
419 valuesMask.Set(TYPEID_AZERITE_ITEM);
420
421 data << uint32(valuesMask.GetBlock(0));
422
425 m_itemData->WriteUpdate(mask, data, target, this, true);
426
429 m_azeriteItemData->WriteUpdate(mask2, data, target, this, true);
430}
431
433 UF::ItemData::Mask const& requestedItemMask, UF::AzeriteItemData::Mask const& requestedAzeriteItemMask,
434 Player const* target, bool ignoreNestedChangesMask) const
435{
438 if (requestedObjectMask.IsAnySet())
439 valuesMask.Set(TYPEID_OBJECT);
440
441 UF::ItemData::Mask itemMask = requestedItemMask;
443 if (itemMask.IsAnySet())
444 valuesMask.Set(TYPEID_ITEM);
445
446 UF::AzeriteItemData::Mask azeriteItemMask = requestedAzeriteItemMask;
448 if (azeriteItemMask.IsAnySet())
449 valuesMask.Set(TYPEID_AZERITE_ITEM);
450
452 std::size_t sizePos = buffer.wpos();
453 buffer << uint32(0);
455 buffer << uint32(valuesMask.GetBlock(0));
456
457 if (valuesMask[TYPEID_OBJECT])
458 m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
459
460 if (valuesMask[TYPEID_ITEM])
461 m_itemData->WriteUpdate(itemMask, buffer, target, this, ignoreNestedChangesMask);
462
463 if (valuesMask[TYPEID_AZERITE_ITEM])
464 m_azeriteItemData->WriteUpdate(azeriteItemMask, buffer, target, this, ignoreNestedChangesMask);
465
466 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
467
468 data->AddUpdateBlock();
469}
470
482
488
490{
491 bool hasPreviousMilestone = true;
492 for (AzeriteItemMilestonePowerEntry const* milestone : sDB2Manager.GetAzeriteItemMilestonePowers())
493 {
494 if (!hasPreviousMilestone)
495 break;
496
497 if (milestone->RequiredLevel > int32(GetLevel()))
498 break;
499
500 if (HasUnlockedEssenceMilestone(milestone->ID))
501 continue;
502
503 if (milestone->AutoUnlock)
504 {
505 AddUnlockedEssenceMilestone(milestone->ID);
506 hasPreviousMilestone = true;
507 }
508 else
509 hasPreviousMilestone = false;
510 }
511}
constexpr uint32 MAX_AZERITE_ITEM_LEVEL
Definition AzeriteItem.h:24
constexpr uint32 PLAYER_CONDITION_ID_UNLOCKED_AZERITE_ESSENCES
Definition AzeriteItem.h:26
constexpr uint32 MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL
Definition AzeriteItem.h:25
@ CHAR_INS_ITEM_INSTANCE_AZERITE
@ CHAR_INS_ITEM_INSTANCE_AZERITE_MILESTONE_POWER
@ CHAR_UPD_ITEM_INSTANCE_AZERITE_ON_LOAD
@ CHAR_INS_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE
@ CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE
@ CHAR_DEL_ITEM_INSTANCE_AZERITE
@ CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER
DB2Storage< AzeriteKnowledgeMultiplierEntry > sAzeriteKnowledgeMultiplierStore("AzeriteKnowledgeMultiplier.db2", &AzeriteKnowledgeMultiplierLoadInfo::Instance)
DB2Storage< AzeriteLevelInfoEntry > sAzeriteLevelInfoStore("AzeriteLevelInfo.db2", &AzeriteLevelInfoLoadInfo::Instance)
#define sDB2Manager
Definition DB2Stores.h:569
ItemContext
Definition DBCEnums.h:1315
ChrSpecialization
Definition DBCEnums.h:398
#define MAX_AZERITE_ESSENCE_SLOT
Definition DBCEnums.h:229
@ EarnArtifactXPForAzeriteItem
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
uint16 flags
#define ASSERT
Definition Errors.h:80
@ ITEM_CHANGED
Definition Item.h:47
@ ITEM_REMOVED
Definition Item.h:49
@ ITEM_NEW
Definition Item.h:48
@ TYPEID_AZERITE_ITEM
Definition ObjectGuid.h:42
@ TYPEID_OBJECT
Definition ObjectGuid.h:38
@ TYPEID_ITEM
Definition ObjectGuid.h:39
@ GAMEOBJECT_TYPE_ITEM_FORGE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:565
static uint64 CalcTotalXPToNextLevel(uint32 level, uint32 knowledgeLevel)
UF::SelectedAzeriteEssences const * GetSelectedAzeriteEssences() const
void UnlockDefaultMilestones()
void SetSelectedAzeriteEssences(uint32 specializationId)
void LoadAzeriteItemData(Player const *owner, AzeriteItemData &azeriteItem)
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
static uint32 GetCurrentKnowledgeLevel()
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ItemData::Mask const &requestedItemMask, UF::AzeriteItemData::Mask const &requestedAzeriteItemMask, Player const *target, bool ignoreNestedChangesMask) const
void SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId)
bool HasUnlockedEssenceSlot(uint8 slot) const
UF::UpdateField< UF::AzeriteItemData, int32(WowCS::EntityFragment::CGObject), TYPEID_AZERITE_ITEM > m_azeriteItemData
Definition AzeriteItem.h:99
static GameObject const * FindHeartForge(Player const *owner)
void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
bool HasUnlockedEssenceMilestone(uint32 azeriteItemMilestonePowerId) const
Definition AzeriteItem.h:61
void ClearValuesChangesMask() override
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
bool CanUseEssences() const
void GiveXP(uint64 xp)
bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner) override
void AddUnlockedEssenceMilestone(uint32 azeriteItemMilestonePowerId)
Definition AzeriteItem.h:62
void CreateSelectedAzeriteEssences(uint32 specializationId)
uint32 GetLevel() const
Definition AzeriteItem.h:41
void SetEssenceRank(uint32 azeriteEssenceId, uint32 rank)
uint32 GetEssenceRank(uint32 azeriteEssenceId) const
void SaveToDB(CharacterDatabaseTransaction trans) override
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
Definition BaseEntity.h:221
WowCS::EntityFragmentsHolder m_entityFragments
Definition BaseEntity.h:353
void RemoveDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter, uint32 index)
Definition BaseEntity.h:256
UF::UpdateFieldHolder m_values
Definition BaseEntity.h:205
UF::DynamicUpdateFieldSetter< T >::insert_result AddDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter)
Definition BaseEntity.h:242
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
TypeID m_objectTypeId
Definition BaseEntity.h:351
size_t wpos() const
Definition ByteBuffer.h:461
void put(std::size_t pos, T value)
Definition ByteBuffer.h:260
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
Definition Item.h:179
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition Item.cpp:1258
uint8 GetSlot() const
Definition Item.h:290
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:639
void ClearValuesChangesMask() override
Definition Item.cpp:1877
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
Definition Item.h:459
ItemUpdateState GetState() const
Definition Item.h:333
bool IsEquipped() const
Definition Item.cpp:1336
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner)
Definition Item.cpp:510
Player * GetOwner() const
Definition Item.cpp:1238
UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const final
Definition Item.cpp:1799
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:1180
LowType GetCounter() const
Definition ObjectGuid.h:336
uint64 LowType
Definition ObjectGuid.h:321
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer &data, EnumFlag< UF::UpdateFieldFlag > flags) const
Definition Object.cpp:113
UF::UpdateField< UF::ObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_OBJECT > m_objectData
Definition Object.h:161
ChrSpecialization GetPrimarySpecialization() const
Definition Player.h:2008
void _ApplyItemBonuses(Item *item, uint8 slot, bool apply)
Definition Player.cpp:7952
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
Definition Player.cpp:27588
void setUInt32(uint8 index, uint32 value)
void setUInt64(uint8 index, uint64 value)
Mask const & GetChangesMask() const
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
bool HasChanged(uint32 index) const
Definition BaseEntity.h:83
uint32 GetChangedObjectTypeMask() const
Definition BaseEntity.h:81
bool BuildPacket(WorldPacket *packet)
void AddUpdateBlock()
Definition UpdateData.h:46
constexpr uint32 GetBlock(uint32 index) const
Definition UpdateMask.h:59
constexpr void Set(uint32 index)
Definition UpdateMask.h:91
constexpr uint32 GetMapId() const
Definition Position.h:216
GameObject * FindNearestGameObjectOfType(GameobjectTypes type, float range) const
Definition Object.cpp:1570
time_t GetGameTime()
Definition GameTime.cpp:52
UpdateFieldFlag
Definition UpdateField.h:37
uint32 KnowledgeLevel
Definition Item.h:148
uint32 Level
Definition Item.h:147
std::vector< uint32 > AzeriteItemMilestonePowers
Definition Item.h:149
std::array< AzeriteItemSelectedEssencesData, 4 > SelectedAzeriteEssences
Definition Item.h:151
std::vector< AzeriteEssencePowerEntry const * > UnlockedAzeriteEssences
Definition Item.h:150
uint64 Xp
Definition Item.h:146
void operator()(Player const *player) const
uint64 MinimumExperienceToNextLevel
static void FilterDisallowedFieldsMaskForFlag(Mask &changesMask, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
UpdateField< uint32, 0, 8 > KnowledgeLevel
UpdateField< uint64, 0, 5 > Xp
DynamicUpdateField< UF::SelectedAzeriteEssences, 0, 3 > SelectedEssences
DynamicUpdateField< UF::UnlockedAzeriteEssence, 0, 2 > UnlockedEssences
UpdateField< uint32, 0, 6 > Level
UpdateField< int32, 0, 9 > DEBUGknowledgeWeek
static void AppendAllowedFieldsMaskForFlag(Mask &allowedMaskForTarget, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
static void AppendAllowedFieldsMaskForFlag(Mask &allowedMaskForTarget, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
static void FilterDisallowedFieldsMaskForFlag(Mask &changesMask, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
UpdateFieldArray< uint32, 4, 3, 4 > AzeriteEssenceID
UpdateField< bool, 0, 1 > Enabled
UpdateField< uint32, 0, 2 > SpecializationID
void Add(EntityFragment fragment, bool update, void const *data=nullptr)