TrinityCore
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
25{
28
29 m_azeritePowers = nullptr;
30 m_maxTier = 0;
31}
32
33bool AzeriteEmpoweredItem::Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner)
34{
35 if (!Item::Create(guidlow, itemId, context, owner))
36 return false;
37
39 return true;
40}
41
43{
45 stmt->setUInt64(0, GetGUID().GetCounter());
46 trans->Append(stmt);
47
48 switch (GetState())
49 {
50 case ITEM_NEW:
51 case ITEM_CHANGED:
52 {
54 stmt->setUInt64(0, GetGUID().GetCounter());
55 for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i)
56 stmt->setInt32(1 + i, m_azeriteEmpoweredItemData->Selections[i]);
57
58 trans->Append(stmt);
59 break;
60 }
61 case ITEM_REMOVED:
62 default:
63 break;
64 }
65
66 Item::SaveToDB(trans);
67}
68
70{
72 bool needSave = false;
74 {
75 for (int32 i = MAX_AZERITE_EMPOWERED_TIER; --i >= 0; )
76 {
77 int32 selection = azeriteEmpoweredItem.SelectedAzeritePowers[i];
78 if (GetTierForAzeritePower(Classes(owner->GetClass()), selection) != i)
79 {
80 needSave = true;
81 break;
82 }
83
84 SetSelectedAzeritePower(i, selection);
85 }
86 }
87 else
88 needSave = true;
89
90 if (needSave)
91 {
93 for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i)
94 stmt->setInt32(i, m_azeriteEmpoweredItemData->Selections[i]);
95
96 stmt->setUInt64(5, GetGUID().GetCounter());
97 CharacterDatabase.Execute(stmt);
98 }
99}
100
102{
104 stmt->setUInt64(0, itemGuid);
105 CharacterDatabase.ExecuteOrAppend(trans, stmt);
106}
107
109{
110 AzeriteEmpoweredItem::DeleteFromDB(trans, GetGUID().GetCounter());
111 Item::DeleteFromDB(trans);
112}
113
115{
116 return sDB2Manager.GetRequiredAzeriteLevelForAzeritePowerTier(_bonusData.AzeriteTierUnlockSetId, GetContext(), tier);
117}
118
120{
121 auto azeritePowerItr = std::find_if(m_azeritePowers->begin(), m_azeritePowers->end(), [&](AzeritePowerSetMemberEntry const* power)
122 {
123 return power->AzeritePowerID == azeritePowerId && power->Class == playerClass;
124 });
125 if (azeritePowerItr != m_azeritePowers->end())
126 return (*azeritePowerItr)->Tier;
127
129}
130
132{
134
135 // Not added to UF::ItemData::BonusListIDs, client fakes it on its own too
136 _bonusData.AddBonusList(sAzeritePowerStore.AssertEntry(azeritePowerId)->ItemBonusListID);
137}
138
140{
141 for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i)
143
145 for (int32 bonusListID : GetBonusListIDs())
146 _bonusData.AddBonusList(bonusListID);
147}
148
150{
151 if (Player const* owner = GetOwner())
152 return int64(float(GOLD) * sDB2Manager.GetCurveValueAt(CURVE_ID_AZERITE_EMPOWERED_ITEM_RESPEC_COST, float(owner->GetNumRespecs())));
153
154 return MAX_MONEY_AMOUNT + 1;
155}
156
158{
160 std::size_t sizePos = data->wpos();
161 *data << uint32(0);
162 *data << uint8(flags);
163 m_objectData->WriteCreate(*data, flags, this, target);
164 m_itemData->WriteCreate(*data, flags, this, target);
165 m_azeriteEmpoweredItemData->WriteCreate(*data, flags, this, target);
166 data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
167}
168
170{
172 std::size_t sizePos = data->wpos();
173 *data << uint32(0);
175
177 m_objectData->WriteUpdate(*data, flags, this, target);
178
180 m_itemData->WriteUpdate(*data, flags, this, target);
181
183 m_azeriteEmpoweredItemData->WriteUpdate(*data, flags, this, target);
184
185 data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
186}
187
189 UF::ItemData::Mask const& requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const& requestedAzeriteEmpoweredItemMask, Player const* target) const
190{
193 if (requestedObjectMask.IsAnySet())
194 valuesMask.Set(TYPEID_OBJECT);
195
196 UF::ItemData::Mask itemMask = requestedItemMask;
197 m_itemData->FilterDisallowedFieldsMaskForFlag(itemMask, flags);
198 if (itemMask.IsAnySet())
199 valuesMask.Set(TYPEID_ITEM);
200
201 if (requestedAzeriteEmpoweredItemMask.IsAnySet())
203
205 std::size_t sizePos = buffer.wpos();
206 buffer << uint32(0);
207 buffer << uint32(valuesMask.GetBlock(0));
208
209 if (valuesMask[TYPEID_OBJECT])
210 m_objectData->WriteUpdate(buffer, requestedObjectMask, true, this, target);
211
212 if (valuesMask[TYPEID_ITEM])
213 m_itemData->WriteUpdate(buffer, itemMask, true, this, target);
214
215 if (valuesMask[TYPEID_AZERITE_EMPOWERED_ITEM])
216 m_azeriteEmpoweredItemData->WriteUpdate(buffer, requestedAzeriteEmpoweredItemMask, true, this, target);
217
218 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
219
220 data->AddUpdateBlock();
221}
222
224{
225 UpdateData udata(player->GetMapId());
226 WorldPacket packet;
227
229
230 udata.BuildPacket(&packet);
231 player->SendDirectMessage(&packet);
232}
233
235{
237 Item::ClearUpdateMask(remove);
238}
239
241{
242 m_azeritePowers = sDB2Manager.GetAzeritePowers(GetEntry());
243 if (m_azeritePowers)
244 {
245 m_maxTier = (*std::max_element(m_azeritePowers->begin(), m_azeritePowers->end(), [](AzeritePowerSetMemberEntry const* a1, AzeritePowerSetMemberEntry const* a2)
246 {
247 return a1->Tier < a2->Tier;
248 }))->Tier;
249 }
250}
@ 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:538
#define MAX_AZERITE_EMPOWERED_TIER
Definition: DBCEnums.h:200
ItemContext
Definition: DBCEnums.h:1063
@ CURVE_ID_AZERITE_EMPOWERED_ITEM_RESPEC_COST
Definition: DBCEnums.h:858
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
uint8_t uint8
Definition: Define.h:144
int64_t int64
Definition: Define.h:137
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
uint16 flags
Definition: DisableMgr.cpp:49
@ ITEM_CHANGED
Definition: Item.h:55
@ ITEM_REMOVED
Definition: Item.h:57
@ ITEM_NEW
Definition: Item.h:56
@ TYPEID_OBJECT
Definition: ObjectGuid.h:35
@ TYPEID_ITEM
Definition: ObjectGuid.h:36
@ TYPEID_AZERITE_EMPOWERED_ITEM
Definition: ObjectGuid.h:38
@ TYPEMASK_AZERITE_EMPOWERED_ITEM
Definition: ObjectGuid.h:58
uint64 const MAX_MONEY_AMOUNT
Definition: Player.cpp:158
Classes
@ GOLD
int32 GetTierForAzeritePower(Classes playerClass, int32 azeritePowerId) const
uint32 GetRequiredAzeriteLevelForTier(uint32 tier) const
void LoadAzeriteEmpoweredItemData(Player const *owner, AzeriteEmpoweredItemData &azeriteEmpoweredItem)
bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner) override
void ClearUpdateMask(bool remove) override
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::ItemData::Mask const &requestedItemMask, UF::AzeriteEmpoweredItemData::Mask const &requestedAzeriteEmpoweredItemMask, Player const *target) const
UF::UpdateField< UF::AzeriteEmpoweredItemData, 0, TYPEID_AZERITE_EMPOWERED_ITEM > m_azeriteEmpoweredItemData
void BuildValuesCreate(ByteBuffer *data, Player const *target) const override
void BuildValuesUpdate(ByteBuffer *data, Player const *target) const override
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
void SaveToDB(CharacterDatabaseTransaction trans) override
std::vector< AzeritePowerSetMemberEntry const * > const * m_azeritePowers
void SetSelectedAzeritePower(int32 tier, int32 azeritePowerId)
size_t wpos() const
Definition: ByteBuffer.h:412
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:220
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition: Item.cpp:561
ItemTemplate const * GetTemplate() const
Definition: Item.cpp:1141
std::vector< int32 > const & GetBonusListIDs() const
Definition: Item.h:229
ItemContext GetContext() const
Definition: Item.h:441
ItemUpdateState GetState() const
Definition: Item.h:322
void ClearUpdateMask(bool remove) override
Definition: Item.cpp:1791
virtual bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const *owner)
Definition: Item.cpp:468
Player * GetOwner() const
Definition: Item.cpp:1146
BonusData _bonusData
Definition: Item.h:452
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
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
Definition: Object.h:287
uint32 GetEntry() const
Definition: Object.h:161
UF::UpdateFieldHolder m_values
Definition: Object.h:266
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
Definition: Object.cpp:225
TypeID m_objectTypeId
Definition: Object.h:403
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
void setInt32(const uint8 index, const int32 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
uint8 GetClass() const
Definition: Unit.h:752
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
UpdateFieldFlag
Definition: UpdateField.h:34
std::array< int32, MAX_AZERITE_EMPOWERED_TIER > SelectedAzeritePowers
Definition: Item.h:147
void AddBonusList(uint32 bonusListId)
Definition: Item.cpp:2898
int32 AzeriteTierUnlockSetId
Definition: Item.h:88
void Initialize(ItemTemplate const *proto)
Definition: Item.cpp:2829
UpdateFieldArray< int32, 5, 0, 1 > Selections
Definition: UpdateFields.h:164