TrinityCore
Loading...
Searching...
No Matches
AzeriteEmpoweredItem.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
19#include "DatabaseEnv.h"
20#include "DB2Stores.h"
21#include "Player.h"
22#include "UpdateData.h"
23#include "WorldPacket.h"
24
34
35bool AzeriteEmpoweredItem::Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner)
36{
37 if (!Item::Create(guidlow, itemId, context, owner))
38 return false;
39
41 return true;
42}
43
45{
47 stmt->setUInt64(0, GetGUID().GetCounter());
48 trans->Append(stmt);
49
50 switch (GetState())
51 {
52 case ITEM_NEW:
53 case ITEM_CHANGED:
54 {
56 stmt->setUInt64(0, GetGUID().GetCounter());
57 for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i)
58 stmt->setInt32(1 + i, m_azeriteEmpoweredItemData->Selections[i]);
59
60 trans->Append(stmt);
61 break;
62 }
63 case ITEM_REMOVED:
64 default:
65 break;
66 }
67
68 Item::SaveToDB(trans);
69}
70
72{
74 bool needSave = false;
76 {
77 for (int32 i = MAX_AZERITE_EMPOWERED_TIER; --i >= 0; )
78 {
79 int32 selection = azeriteEmpoweredItem.SelectedAzeritePowers[i];
80 if (GetTierForAzeritePower(Classes(owner->GetClass()), selection) != i)
81 {
82 needSave = true;
83 break;
84 }
85
86 SetSelectedAzeritePower(i, selection);
87 }
88 }
89 else
90 needSave = true;
91
92 if (needSave)
93 {
95 for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i)
96 stmt->setInt32(i, m_azeriteEmpoweredItemData->Selections[i]);
97
98 stmt->setUInt64(5, GetGUID().GetCounter());
99 CharacterDatabase.Execute(stmt);
100 }
101}
102
109
115
117{
118 return sDB2Manager.GetRequiredAzeriteLevelForAzeritePowerTier(_bonusData.AzeriteTierUnlockSetId, GetContext(), tier);
119}
120
122{
123 auto azeritePowerItr = std::find_if(m_azeritePowers->begin(), m_azeritePowers->end(), [&](AzeritePowerSetMemberEntry const* power)
124 {
125 return power->AzeritePowerID == azeritePowerId && power->Class == playerClass;
126 });
127 if (azeritePowerItr != m_azeritePowers->end())
128 return (*azeritePowerItr)->Tier;
129
131}
132
134{
136
137 // Not added to UF::ItemData::BonusListIDs, client fakes it on its own too
138 _bonusData.AddBonusList(sAzeritePowerStore.AssertEntry(azeritePowerId)->ItemBonusListID);
139}
140
150
152{
153 if (Player const* owner = GetOwner())
154 return int64(float(GOLD) * sDB2Manager.GetCurveValueAt(CURVE_ID_AZERITE_EMPOWERED_ITEM_RESPEC_COST, float(owner->GetNumRespecs())));
155
156 return MAX_MONEY_AMOUNT + 1;
157}
158
160{
161 m_objectData->WriteCreate(flags, data, target, this);
162 m_itemData->WriteCreate(flags, data, target, this);
163 m_azeriteEmpoweredItemData->WriteCreate(flags, data, target, this);
164}
165
167{
169
171 m_objectData->WriteUpdate(flags, data, target, this);
172
174 m_itemData->WriteUpdate(flags, data, target, this);
175
177 m_azeriteEmpoweredItemData->WriteUpdate(flags, data, target, this);
178}
179
181 UF::ItemData::Mask const& requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask,
182 Player const* target, bool ignoreNestedChangesMask) const
183{
186 if (requestedObjectMask.IsAnySet())
187 valuesMask.Set(TYPEID_OBJECT);
188
189 UF::ItemData::Mask itemMask = requestedItemMask;
191 if (itemMask.IsAnySet())
192 valuesMask.Set(TYPEID_ITEM);
193
194 if (requestedAzeriteEmpoweredItemMask.IsAnySet())
196
198 std::size_t sizePos = buffer.wpos();
199 buffer << uint32(0);
201 buffer << uint32(valuesMask.GetBlock(0));
202
203 if (valuesMask[TYPEID_OBJECT])
204 m_objectData->WriteUpdate(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
205
206 if (valuesMask[TYPEID_ITEM])
207 m_itemData->WriteUpdate(itemMask, buffer, target, this, ignoreNestedChangesMask);
208
209 if (valuesMask[TYPEID_AZERITE_EMPOWERED_ITEM])
210 m_azeriteEmpoweredItemData->WriteUpdate(requestedAzeriteEmpoweredItemMask, buffer, target, this, ignoreNestedChangesMask);
211
212 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
213
214 data->AddUpdateBlock();
215}
216
228
234
236{
237 m_azeritePowers = sDB2Manager.GetAzeritePowers(GetEntry());
238 if (m_azeritePowers)
239 m_maxTier = (*std::ranges::max_element(*m_azeritePowers, {}, &AzeritePowerSetMemberEntry::Tier))->Tier;
240}
@ CHAR_INS_ITEM_INSTANCE_AZERITE_EMPOWERED
@ CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED
@ CHAR_UPD_ITEM_INSTANCE_AZERITE_EMPOWERED
DB2Storage< AzeritePowerEntry > sAzeritePowerStore("AzeritePower.db2", &AzeritePowerLoadInfo::Instance)
#define sDB2Manager
Definition DB2Stores.h:569
#define MAX_AZERITE_EMPOWERED_TIER
Definition DBCEnums.h:227
ItemContext
Definition DBCEnums.h:1315
@ CURVE_ID_AZERITE_EMPOWERED_ITEM_RESPEC_COST
Definition DBCEnums.h:917
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
int64_t int64
Definition Define.h:149
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
uint16 flags
@ ITEM_CHANGED
Definition Item.h:47
@ ITEM_REMOVED
Definition Item.h:49
@ ITEM_NEW
Definition Item.h:48
@ TYPEID_OBJECT
Definition ObjectGuid.h:38
@ TYPEID_ITEM
Definition ObjectGuid.h:39
@ TYPEID_AZERITE_EMPOWERED_ITEM
Definition ObjectGuid.h:41
constexpr uint64 MAX_MONEY_AMOUNT
Definition Player.h:1044
Classes
@ GOLD
int32 GetTierForAzeritePower(Classes playerClass, int32 azeritePowerId) const
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ItemData::Mask const &requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const &requestedAzeriteEmpoweredItemMask, Player const *target, bool ignoreNestedChangesMask) const
uint32 GetRequiredAzeriteLevelForTier(uint32 tier) const
UF::UpdateField< UF::AzeriteEmpoweredItemData, int32(WowCS::EntityFragment::CGObject), TYPEID_AZERITE_EMPOWERED_ITEM > m_azeriteEmpoweredItemData
void LoadAzeriteEmpoweredItemData(Player const *owner, AzeriteEmpoweredItemData &azeriteEmpoweredItem)
bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner) override
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
void SaveToDB(CharacterDatabaseTransaction trans) override
std::vector< AzeritePowerSetMemberEntry const * > const * m_azeritePowers
void SetSelectedAzeritePower(int32 tier, int32 azeritePowerId)
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
void ClearValuesChangesMask() 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
UF::UpdateFieldHolder m_values
Definition BaseEntity.h:205
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
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:639
void ClearValuesChangesMask() override
Definition Item.cpp:1877
ItemTemplate const * GetTemplate() const
Definition Item.cpp:1233
UF::UpdateField< UF::ItemData, uint32(WowCS::EntityFragment::CGObject), TYPEID_ITEM > m_itemData
Definition Item.h:459
std::vector< int32 > const & GetBonusListIDs() const
Definition Item.h:239
ItemContext GetContext() const
Definition Item.h:451
ItemUpdateState GetState() const
Definition Item.h:333
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner)
Definition Item.cpp:510
Player * GetOwner() const
Definition Item.cpp:1238
BonusData _bonusData
Definition Item.h:462
UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const final
Definition Item.cpp:1799
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:1180
uint64 LowType
Definition ObjectGuid.h:321
uint32 GetEntry() const
Definition Object.h:89
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
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
void setUInt64(uint8 index, uint64 value)
void setInt32(uint8 index, int32 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
uint8 GetClass() const
Definition Unit.h:764
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
UpdateFieldFlag
Definition UpdateField.h:37
std::array< int32, MAX_AZERITE_EMPOWERED_TIER > SelectedAzeritePowers
Definition Item.h:156
void AddBonusList(uint32 bonusListId)
Definition Item.cpp:2974
int32 AzeriteTierUnlockSetId
Definition Item.h:81
void Initialize(ItemTemplate const *proto)
Definition Item.cpp:2886
UpdateFieldArray< int32, 5, 0, 1 > Selections
static void FilterDisallowedFieldsMaskForFlag(Mask &changesMask, EnumFlag< UpdateFieldFlag > fieldVisibilityFlags)
void Add(EntityFragment fragment, bool update, void const *data=nullptr)