TrinityCore
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 <boost/date_time/gregorian/gregorian_types.hpp>
28#include <boost/date_time/posix_time/conversion.hpp>
29
31{
34
36}
37
38bool AzeriteItem::Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner)
39{
40 if (!Item::Create(guidlow, itemId, context, owner))
41 return false;
42
46 return true;
47}
48
50{
52 stmt->setUInt64(0, GetGUID().GetCounter());
53 trans->Append(stmt);
54
56 stmt->setUInt64(0, GetGUID().GetCounter());
57 trans->Append(stmt);
58
60 stmt->setUInt64(0, GetGUID().GetCounter());
61 trans->Append(stmt);
62
63 switch (GetState())
64 {
65 case ITEM_NEW:
66 case ITEM_CHANGED:
67 {
68 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE);
69 stmt->setUInt64(0, GetGUID().GetCounter());
70 stmt->setUInt64(1, m_azeriteItemData->Xp);
71 stmt->setUInt32(2, m_azeriteItemData->Level);
72 stmt->setUInt32(3, m_azeriteItemData->KnowledgeLevel);
73 std::size_t specIndex = 0;
74 for (; specIndex < m_azeriteItemData->SelectedEssences.size(); ++specIndex)
75 {
76 stmt->setUInt32(4 + specIndex * 5, m_azeriteItemData->SelectedEssences[specIndex].SpecializationID);
77 for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j)
78 stmt->setUInt32(5 + specIndex * 5 + j, m_azeriteItemData->SelectedEssences[specIndex].AzeriteEssenceID[j]);
79 }
80 for (; specIndex < 4; ++specIndex)
81 {
82 stmt->setUInt32(4 + specIndex * 5, 0);
83 for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j)
84 stmt->setUInt32(5 + specIndex * 5 + j, 0);
85 }
86
87 trans->Append(stmt);
88
89 for (uint32 azeriteItemMilestonePowerId : m_azeriteItemData->UnlockedEssenceMilestones)
90 {
92 stmt->setUInt64(0, GetGUID().GetCounter());
93 stmt->setUInt32(1, azeriteItemMilestonePowerId);
94 trans->Append(stmt);
95 }
96
97 for (UF::UnlockedAzeriteEssence const& azeriteEssence : m_azeriteItemData->UnlockedEssences)
98 {
100 stmt->setUInt64(0, GetGUID().GetCounter());
101 stmt->setUInt32(1, azeriteEssence.AzeriteEssenceID);
102 stmt->setUInt32(2, azeriteEssence.Rank);
103 trans->Append(stmt);
104 }
105 break;
106 }
107 case ITEM_REMOVED:
108 default:
109 break;
110 }
111
112 Item::SaveToDB(trans);
113}
114
115void AzeriteItem::LoadAzeriteItemData(Player const* owner, AzeriteItemData& azeriteItemData)
116{
117 bool needSave = false;
118
119 if (!sAzeriteLevelInfoStore.LookupEntry(azeriteItemData.Level))
120 {
121 azeriteItemData.Xp = 0;
122 azeriteItemData.Level = 1;
123 azeriteItemData.KnowledgeLevel = GetCurrentKnowledgeLevel();
124 needSave = true;
125 }
126 else if (azeriteItemData.Level > MAX_AZERITE_ITEM_LEVEL)
127 {
128 azeriteItemData.Xp = 0;
129 azeriteItemData.Level = MAX_AZERITE_ITEM_LEVEL;
130 needSave = true;
131 }
132
133 if (azeriteItemData.KnowledgeLevel != GetCurrentKnowledgeLevel())
134 {
135 // rescale XP to maintain same progress %
136 uint64 oldMax = CalcTotalXPToNextLevel(azeriteItemData.Level, azeriteItemData.KnowledgeLevel);
137 azeriteItemData.KnowledgeLevel = GetCurrentKnowledgeLevel();
138 uint64 newMax = CalcTotalXPToNextLevel(azeriteItemData.Level, azeriteItemData.KnowledgeLevel);
139 azeriteItemData.Xp = uint64(azeriteItemData.Xp / double(oldMax) * newMax);
140 needSave = true;
141 }
142 else if (azeriteItemData.KnowledgeLevel > MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL)
143 {
145 needSave = true;
146 }
147
151 for (uint32 azeriteItemMilestonePowerId : azeriteItemData.AzeriteItemMilestonePowers)
152 AddUnlockedEssenceMilestone(azeriteItemMilestonePowerId);
153
155
156 for (AzeriteEssencePowerEntry const* unlockedAzeriteEssence : azeriteItemData.UnlockedAzeriteEssences)
157 SetEssenceRank(unlockedAzeriteEssence->AzeriteEssenceID, unlockedAzeriteEssence->Tier);
158
159 for (AzeriteItemSelectedEssencesData const& selectedEssenceData : azeriteItemData.SelectedAzeriteEssences)
160 {
161 if (!selectedEssenceData.SpecializationId)
162 continue;
163
165 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(selectedEssenceData.SpecializationId);
166 for (uint32 i = 0; i < MAX_AZERITE_ESSENCE_SLOT; ++i)
167 {
168 // Check if essence was unlocked
169 if (!GetEssenceRank(selectedEssenceData.AzeriteEssenceId[i]))
170 continue;
171
172 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, i).SetValue(selectedEssenceData.AzeriteEssenceId[i]);
173 }
174
175 if (owner && owner->GetPrimarySpecialization() == ChrSpecialization(selectedEssenceData.SpecializationId))
176 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true);
177 }
178
179 // add selected essences for current spec
180 if (owner && !GetSelectedAzeriteEssences())
182
183 if (needSave)
184 {
186 stmt->setUInt64(0, azeriteItemData.Xp);
187 stmt->setUInt32(1, azeriteItemData.KnowledgeLevel);
188 stmt->setUInt64(2, GetGUID().GetCounter());
189 CharacterDatabase.Execute(stmt);
190 }
191}
192
194{
196 stmt->setUInt64(0, itemGuid);
197 CharacterDatabase.ExecuteOrAppend(trans, stmt);
198
200 stmt->setUInt64(0, itemGuid);
201 CharacterDatabase.ExecuteOrAppend(trans, stmt);
202
204 stmt->setUInt64(0, itemGuid);
205 CharacterDatabase.ExecuteOrAppend(trans, stmt);
206}
207
209{
210 AzeriteItem::DeleteFromDB(trans, GetGUID().GetCounter());
211 Item::DeleteFromDB(trans);
212}
213
215{
216 // count weeks from 14.01.2020
217 boost::gregorian::date now = boost::posix_time::from_time_t(GameTime::GetGameTime()).date();
218 boost::gregorian::week_iterator itr(boost::gregorian::date(2020, boost::date_time::Jan, 14));
219 uint32 knowledge = 0;
220 while (*itr < now && knowledge < MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL)
221 {
222 ++knowledge;
223 ++itr;
224 }
225 return knowledge;
226}
227
229{
230 AzeriteLevelInfoEntry const* levelInfo = sAzeriteLevelInfoStore.AssertEntry(level);
231 uint64 totalXp = levelInfo->BaseExperienceToNextLevel * sAzeriteKnowledgeMultiplierStore.AssertEntry(knowledgeLevel)->Multiplier;
232 return std::max(totalXp, levelInfo->MinimumExperienceToNextLevel);
233}
234
236{
237 Player* owner = GetOwner();
238 uint32 level = m_azeriteItemData->Level;
239 if (level < MAX_AZERITE_ITEM_LEVEL)
240 {
241 uint64 currentXP = m_azeriteItemData->Xp;
242 uint64 remainingXP = xp;
243 do
244 {
245 uint64 totalXp = CalcTotalXPToNextLevel(level, m_azeriteItemData->KnowledgeLevel);
246 if (currentXP + remainingXP >= totalXp)
247 {
248 // advance to next level
249 ++level;
250 remainingXP -= totalXp - currentXP;
251 currentXP = 0;
252 }
253 else
254 {
255 currentXP += remainingXP;
256 remainingXP = 0;
257 }
258 } while (remainingXP > 0 && level < MAX_AZERITE_ITEM_LEVEL);
259
261
263
264 // changing azerite level changes item level, need to update stats
265 if (m_azeriteItemData->Level != level)
266 {
267 if (IsEquipped())
268 owner->_ApplyItemBonuses(this, GetSlot(), false);
269
273
274 if (IsEquipped())
275 owner->_ApplyItemBonuses(this, GetSlot(), true);
276 }
277
278 SetState(ITEM_CHANGED, owner);
279 }
280
282 xpGain.ItemGUID = GetGUID();
283 xpGain.XP = xp;
284 owner->SendDirectMessage(xpGain.Write());
285}
286
288{
289 if (GameObject const* forge = owner->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_ITEM_FORGE, 40.0f))
290 if (forge->GetGOInfo()->itemForge.ForgeType == 2)
291 return forge;
292
293 return nullptr;
294}
295
297{
300
301 return false;
302}
303
305{
306 AzeriteItemMilestonePowerEntry const* milestone = sDB2Manager.GetAzeriteItemMilestonePower(slot);
307 return m_azeriteItemData->UnlockedEssenceMilestones.FindIndex(milestone->ID) != -1;
308}
309
311{
312 int32 index = m_azeriteItemData->UnlockedEssences.FindIndexIf([azeriteEssenceId](UF::UnlockedAzeriteEssence const& essence)
313 {
314 return essence.AzeriteEssenceID == azeriteEssenceId;
315 });
316
317 if (index < 0)
318 return 0;
319
320 return m_azeriteItemData->UnlockedEssences[index].Rank;
321}
322
323void AzeriteItem::SetEssenceRank(uint32 azeriteEssenceId, uint32 rank)
324{
325 int32 index = m_azeriteItemData->UnlockedEssences.FindIndexIf([azeriteEssenceId](UF::UnlockedAzeriteEssence const& essence)
326 {
327 return essence.AzeriteEssenceID == azeriteEssenceId;
328 });
329
330 if (!rank && index >= 0)
331 {
333 return;
334 }
335
336 if (!sDB2Manager.GetAzeriteEssencePower(azeriteEssenceId, rank))
337 return;
338
339 if (index < 0)
340 {
343 unlockedEssence.AzeriteEssenceID = azeriteEssenceId;
344 unlockedEssence.Rank = rank;
345 }
346 else
348 .ModifyValue(&UF::UnlockedAzeriteEssence::Rank), rank);
349}
350
352{
353 for (UF::SelectedAzeriteEssences const& essences : m_azeriteItemData->SelectedEssences)
354 if (essences.Enabled)
355 return &essences;
356
357 return nullptr;
358}
359
361{
362 int32 index = m_azeriteItemData->SelectedEssences.FindIndexIf([](UF::SelectedAzeriteEssences const& essences) { return essences.Enabled == 1; });
363 if (index >= 0)
365 .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), false);
366
367 index = m_azeriteItemData->SelectedEssences.FindIndexIf([specializationId](UF::SelectedAzeriteEssences const& essences)
368 {
369 return essences.SpecializationID == specializationId;
370 });
371
372 if (index >= 0)
374 .ModifyValue(&UF::SelectedAzeriteEssences::Enabled), true);
375 else
376 CreateSelectedAzeriteEssences(specializationId);
377}
378
380{
382 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(specializationId);
383 selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(true);
384}
385
387{
389 int32 index = m_azeriteItemData->SelectedEssences.FindIndexIf([](UF::SelectedAzeriteEssences const& essences) { return essences.Enabled == 1; });
390 ASSERT(index >= 0);
392 .ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, slot), azeriteEssenceId);
393}
394
395void AzeriteItem::BuildValuesCreate(ByteBuffer* data, Player const* target) const
396{
398 std::size_t sizePos = data->wpos();
399 *data << uint32(0);
400 *data << uint8(flags);
401 m_objectData->WriteCreate(*data, flags, this, target);
402 m_itemData->WriteCreate(*data, flags, this, target);
403 m_azeriteItemData->WriteCreate(*data, flags, this, target);
404 data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
405}
406
407void AzeriteItem::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
408{
410 std::size_t sizePos = data->wpos();
411 *data << uint32(0);
413
415 m_objectData->WriteUpdate(*data, flags, this, target);
416
418 m_itemData->WriteUpdate(*data, flags, this, target);
419
421 m_azeriteItemData->WriteUpdate(*data, flags, this, target);
422
423 data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
424}
425
427{
429 valuesMask.Set(TYPEID_ITEM);
430 valuesMask.Set(TYPEID_AZERITE_ITEM);
431
432 std::size_t sizePos = data->wpos();
433 *data << uint32(0);
434 *data << uint32(valuesMask.GetBlock(0));
435
437 m_itemData->AppendAllowedFieldsMaskForFlag(mask, flags);
438 m_itemData->WriteUpdate(*data, mask, true, this, target);
439
441 m_azeriteItemData->AppendAllowedFieldsMaskForFlag(mask2, flags);
442 m_azeriteItemData->WriteUpdate(*data, mask2, true, this, target);
443
444 data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
445}
446
448 UF::ItemData::Mask const& requestedItemMask, UF::AzeriteItemData::Mask const& requestedAzeriteItemMask, Player const* target) const
449{
452 if (requestedObjectMask.IsAnySet())
453 valuesMask.Set(TYPEID_OBJECT);
454
455 UF::ItemData::Mask itemMask = requestedItemMask;
456 m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags);
457 if (itemMask.IsAnySet())
458 valuesMask.Set(TYPEID_ITEM);
459
460 UF::AzeriteItemData::Mask azeriteItemMask = requestedAzeriteItemMask;
461 m_azeriteItemData->FilterDisallowedFieldsMaskForFlag(azeriteItemMask, flags);
462 if (azeriteItemMask.IsAnySet())
463 valuesMask.Set(TYPEID_AZERITE_ITEM);
464
466 std::size_t sizePos = buffer.wpos();
467 buffer << uint32(0);
468 buffer << uint32(valuesMask.GetBlock(0));
469
470 if (valuesMask[TYPEID_OBJECT])
471 m_objectData->WriteUpdate(buffer, requestedObjectMask, true, this, target);
472
473 if (valuesMask[TYPEID_ITEM])
474 m_itemData->WriteUpdate(buffer, itemMask, true, this, target);
475
476 if (valuesMask[TYPEID_AZERITE_ITEM])
477 m_azeriteItemData->WriteUpdate(buffer, azeriteItemMask, true, this, target);
478
479 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
480
481 data->AddUpdateBlock();
482}
483
485{
486 UpdateData udata(player->GetMapId());
487 WorldPacket packet;
488
490
491 udata.BuildPacket(&packet);
492 player->SendDirectMessage(&packet);
493}
494
496{
498 Item::ClearUpdateMask(remove);
499}
500
502{
503 bool hasPreviousMilestone = true;
504 for (AzeriteItemMilestonePowerEntry const* milestone : sDB2Manager.GetAzeriteItemMilestonePowers())
505 {
506 if (!hasPreviousMilestone)
507 break;
508
509 if (milestone->RequiredLevel > int32(GetLevel()))
510 break;
511
512 if (HasUnlockedEssenceMilestone(milestone->ID))
513 continue;
514
515 if (milestone->AutoUnlock)
516 {
517 AddUnlockedEssenceMilestone(milestone->ID);
518 hasPreviousMilestone = true;
519 }
520 else
521 hasPreviousMilestone = false;
522 }
523}
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)
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
#define sDB2Manager
Definition: DB2Stores.h:538
ItemContext
Definition: DBCEnums.h:1063
ChrSpecialization
Definition: DBCEnums.h:357
#define MAX_AZERITE_ESSENCE_SLOT
Definition: DBCEnums.h:202
@ EarnArtifactXPForAzeriteItem
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
uint16 flags
Definition: DisableMgr.cpp:49
#define ASSERT
Definition: Errors.h:68
@ ITEM_CHANGED
Definition: Item.h:55
@ ITEM_REMOVED
Definition: Item.h:57
@ ITEM_NEW
Definition: Item.h:56
@ TYPEID_AZERITE_ITEM
Definition: ObjectGuid.h:39
@ TYPEID_OBJECT
Definition: ObjectGuid.h:35
@ TYPEID_ITEM
Definition: ObjectGuid.h:36
@ TYPEMASK_AZERITE_ITEM
Definition: ObjectGuid.h:59
@ GAMEOBJECT_TYPE_ITEM_FORGE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
void BuildValuesUpdateWithFlag(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const override
static uint64 CalcTotalXPToNextLevel(uint32 level, uint32 knowledgeLevel)
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ItemData::Mask const &requestedItemMask, UF::AzeriteItemData::Mask const &requestedAzeriteItemMask, Player const *target) const
UF::SelectedAzeriteEssences const * GetSelectedAzeriteEssences() const
void UnlockDefaultMilestones()
void SetSelectedAzeriteEssences(uint32 specializationId)
void LoadAzeriteItemData(Player const *owner, AzeriteItemData &azeriteItem)
static uint32 GetCurrentKnowledgeLevel()
UF::UpdateField< UF::AzeriteItemData, 0, TYPEID_AZERITE_ITEM > m_azeriteItemData
Definition: AzeriteItem.h:98
void SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId)
bool HasUnlockedEssenceSlot(uint8 slot) const
static GameObject const * FindHeartForge(Player const *owner)
bool HasUnlockedEssenceMilestone(uint32 azeriteItemMilestonePowerId) const
Definition: AzeriteItem.h:61
void ClearUpdateMask(bool remove) 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
Definition: AzeriteItem.cpp:38
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
Definition: AzeriteItem.cpp:49
void BuildValuesUpdate(ByteBuffer *data, Player const *target) const override
void BuildValuesCreate(ByteBuffer *data, Player const *target) const override
size_t wpos() const
Definition: ByteBuffer.h:412
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:220
static bool IsPlayerMeetingCondition(Player const *player, PlayerConditionEntry const *condition)
Definition: Item.h:170
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition: Item.cpp:1166
uint8 GetSlot() const
Definition: Item.h:280
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:561
ItemUpdateState GetState() const
Definition: Item.h:322
void ClearUpdateMask(bool remove) override
Definition: Item.cpp:1791
bool IsEquipped() const
Definition: Item.cpp:1244
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner)
Definition: Item.cpp:468
Player * GetOwner() const
Definition: Item.cpp:1146
UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const override
Definition: Item.cpp:1700
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition: Item.cpp:1088
UF::UpdateField< UF::ItemData, 0, TYPEID_ITEM > m_itemData
Definition: Item.h:449
uint64 LowType
Definition: ObjectGuid.h:278
uint16 m_objectType
Definition: Object.h:401
ObjectGuid const & GetGUID() const
Definition: Object.h:160
UF::UpdateField< UF::ObjectData, 0, TYPEID_OBJECT > m_objectData
Definition: Object.h:267
UF::DynamicUpdateFieldSetter< T >::insert_result AddDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter)
Definition: Object.h:308
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
Definition: Object.h:287
UF::UpdateFieldHolder m_values
Definition: Object.h:266
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
Definition: Object.cpp:225
void RemoveDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter, uint32 index)
Definition: Object.h:322
TypeID m_objectTypeId
Definition: Object.h:403
ChrSpecialization GetPrimarySpecialization() const
Definition: Player.h:1841
void _ApplyItemBonuses(Item *item, uint8 slot, bool apply)
Definition: Player.cpp:7900
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
Definition: Player.cpp:26767
void setUInt32(const uint8 index, const uint32 value)
void setUInt64(const uint8 index, const uint64 value)
Mask const & GetChangesMask() const
Definition: UpdateField.h:605
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
Definition: UpdateField.h:683
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
Definition: UpdateField.h:690
bool HasChanged(uint32 index) const
Definition: UpdateField.h:701
uint32 GetChangedObjectTypeMask() const
Definition: UpdateField.h:696
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:40
void AddUpdateBlock()
Definition: UpdateData.h:49
uint32 GetBlock(uint32 index) const
Definition: UpdateMask.h:53
void Set(uint32 index)
Definition: UpdateMask.h:84
constexpr uint32 GetMapId() const
Definition: Position.h:201
GameObject * FindNearestGameObjectOfType(GameobjectTypes type, float range) const
Definition: Object.cpp:2201
time_t GetGameTime()
Definition: GameTime.cpp:44
UpdateFieldFlag
Definition: UpdateField.h:34
uint32 KnowledgeLevel
Definition: Item.h:139
uint32 Level
Definition: Item.h:138
std::vector< uint32 > AzeriteItemMilestonePowers
Definition: Item.h:140
std::array< AzeriteItemSelectedEssencesData, 4 > SelectedAzeriteEssences
Definition: Item.h:142
std::vector< AzeriteEssencePowerEntry const * > UnlockedAzeriteEssences
Definition: Item.h:141
uint64 Xp
Definition: Item.h:137
std::array< uint32, MAX_AZERITE_ESSENCE_SLOT > AzeriteEssenceId
Definition: Item.h:132
void operator()(Player const *player) const
uint64 BaseExperienceToNextLevel
Definition: DB2Structure.h:369
uint64 MinimumExperienceToNextLevel
Definition: DB2Structure.h:370
UpdateField< uint32, 0, 8 > KnowledgeLevel
Definition: UpdateFields.h:203
UpdateField< uint64, 0, 5 > Xp
Definition: UpdateFields.h:200
DynamicUpdateField< UF::SelectedAzeriteEssences, 0, 3 > SelectedEssences
Definition: UpdateFields.h:199
DynamicUpdateField< UF::UnlockedAzeriteEssence, 0, 2 > UnlockedEssences
Definition: UpdateFields.h:197
UpdateField< uint32, 0, 6 > Level
Definition: UpdateFields.h:201
UpdateField< int32, 0, 9 > DEBUGknowledgeWeek
Definition: UpdateFields.h:204
UpdateFieldArray< uint32, 4, 3, 4 > AzeriteEssenceID
Definition: UpdateFields.h:187
UpdateField< bool, 0, 1 > Enabled
Definition: UpdateFields.h:185
UpdateField< uint32, 0, 2 > SpecializationID
Definition: UpdateFields.h:186