28#include <boost/date_time/gregorian/gregorian_types.hpp>
29#include <boost/date_time/posix_time/conversion.hpp>
75 std::size_t specIndex = 0;
82 for (; specIndex < 4; ++specIndex)
86 stmt->
setUInt32(5 + specIndex * 5 + j, 0);
95 stmt->
setUInt32(1, azeriteItemMilestonePowerId);
103 stmt->
setUInt32(1, azeriteEssence.AzeriteEssenceID);
119 bool needSave =
false;
123 azeriteItemData.
Xp = 0;
124 azeriteItemData.
Level = 1;
130 azeriteItemData.
Xp = 0;
141 azeriteItemData.
Xp =
uint64(azeriteItemData.
Xp /
double(oldMax) * newMax);
159 SetEssenceRank(unlockedAzeriteEssence->AzeriteEssenceID, unlockedAzeriteEssence->Tier);
163 if (!selectedEssenceData.SpecializationId)
220 boost::gregorian::week_iterator itr(boost::gregorian::date(2020, boost::date_time::Jan, 14));
248 if (currentXP + remainingXP >= totalXp)
252 remainingXP -= totalXp - currentXP;
257 currentXP += remainingXP;
292 if (forge->GetGOInfo()->itemForge.ForgeType == 2)
329 if (!rank && index >= 0)
335 if (!
sDB2Manager.GetAzeriteEssencePower(azeriteEssenceId, rank))
343 unlockedEssence.
Rank = rank;
353 if (essences.Enabled)
425 m_itemData->WriteUpdate(mask, data, target,
this,
true);
434 Player const* target,
bool ignoreNestedChangesMask)
const
438 if (requestedObjectMask.IsAnySet())
443 if (itemMask.IsAnySet())
448 if (azeriteItemMask.IsAnySet())
452 std::size_t sizePos = buffer.
wpos();
458 m_objectData->WriteUpdate(requestedObjectMask, buffer, target,
this, ignoreNestedChangesMask);
461 m_itemData->WriteUpdate(itemMask, buffer, target,
this, ignoreNestedChangesMask);
464 m_azeriteItemData->WriteUpdate(azeriteItemMask, buffer, target,
this, ignoreNestedChangesMask);
491 bool hasPreviousMilestone =
true;
494 if (!hasPreviousMilestone)
503 if (milestone->AutoUnlock)
506 hasPreviousMilestone =
true;
509 hasPreviousMilestone =
false;
constexpr uint32 MAX_AZERITE_ITEM_LEVEL
constexpr uint32 PLAYER_CONDITION_ID_UNLOCKED_AZERITE_ESSENCES
constexpr uint32 MAX_AZERITE_ITEM_KNOWLEDGE_LEVEL
@ 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 MAX_AZERITE_ESSENCE_SLOT
@ EarnArtifactXPForAzeriteItem
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
@ GAMEOBJECT_TYPE_ITEM_FORGE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
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
static GameObject const * FindHeartForge(Player const *owner)
void BuildValuesUpdateWithFlag(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
bool HasUnlockedEssenceMilestone(uint32 azeriteItemMilestonePowerId) const
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
bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner) override
void AddUnlockedEssenceMilestone(uint32 azeriteItemMilestonePowerId)
void CreateSelectedAzeriteEssences(uint32 specializationId)
void SetEssenceRank(uint32 azeriteEssenceId, uint32 rank)
uint32 GetEssenceRank(uint32 azeriteEssenceId) const
void SaveToDB(CharacterDatabaseTransaction trans) override
ObjectGuid const & GetGUID() const
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
WowCS::EntityFragmentsHolder m_entityFragments
void RemoveDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter, uint32 index)
UF::UpdateFieldHolder m_values
UF::DynamicUpdateFieldSetter< T >::insert_result AddDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter)
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
void put(std::size_t pos, T value)
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
virtual void SaveToDB(CharacterDatabaseTransaction trans)
void ClearValuesChangesMask() override
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
ItemUpdateState GetState() const
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner)
Player * GetOwner() const
UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const final
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
LowType GetCounter() const
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer &data, EnumFlag< UF::UpdateFieldFlag > flags) const
UF::UpdateField< UF::ObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_OBJECT > m_objectData
ChrSpecialization GetPrimarySpecialization() const
void _ApplyItemBonuses(Item *item, uint8 slot, bool apply)
void SendDirectMessage(WorldPacket const *data) const
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
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
uint32 GetChangedObjectTypeMask() const
bool BuildPacket(WorldPacket *packet)
constexpr uint32 GetBlock(uint32 index) const
constexpr void Set(uint32 index)
constexpr uint32 GetMapId() const
GameObject * FindNearestGameObjectOfType(GameobjectTypes type, float range) const
WorldPacket const * Write() override
std::vector< uint32 > AzeriteItemMilestonePowers
std::array< AzeriteItemSelectedEssencesData, 4 > SelectedAzeriteEssences
std::vector< AzeriteEssencePowerEntry const * > UnlockedAzeriteEssences
UF::AzeriteItemData::Base AzeriteItemMask
void operator()(Player const *player) const
bool IgnoreNestedChangesMask
AzeriteItem const * Owner
UF::ItemData::Base ItemMask
UF::ObjectData::Base ObjectMask
uint64 BaseExperienceToNextLevel
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)