diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-12-06 00:09:21 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-12-06 00:09:44 +0100 |
commit | 16321877f6dfaec1d919ecd4c5bf49a1b5f6788d (patch) | |
tree | 6584c7e75407d54843fa3f0b40a2cd3967c16e63 /src | |
parent | da015babc05d8f43344fb1fa2d4dc4d32ab700c9 (diff) |
Core/Items: Fixed crash when saving azerite items with REMOVED state
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp | 85 |
2 files changed, 66 insertions, 44 deletions
diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp index f0ae4dd172c..246df4a71e6 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp @@ -40,18 +40,29 @@ bool AzeriteEmpoweredItem::Create(ObjectGuid::LowType guidlow, uint32 itemId, It void AzeriteEmpoweredItem::SaveToDB(CharacterDatabaseTransaction& trans) { - Item::SaveToDB(trans); - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_EMPOWERED); stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_EMPOWERED); - stmt->setUInt64(0, GetGUID().GetCounter()); - for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i) - stmt->setInt32(1 + i, m_azeriteEmpoweredItemData->Selections[i]); + switch (GetState()) + { + case ITEM_NEW: + case ITEM_CHANGED: + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_EMPOWERED); + stmt->setUInt64(0, GetGUID().GetCounter()); + for (uint32 i = 0; i < MAX_AZERITE_EMPOWERED_TIER; ++i) + stmt->setInt32(1 + i, m_azeriteEmpoweredItemData->Selections[i]); - trans->Append(stmt); + trans->Append(stmt); + break; + } + case ITEM_REMOVED: + default: + break; + } + + Item::SaveToDB(trans); } void AzeriteEmpoweredItem::LoadAzeriteEmpoweredItemData(Player const* owner, AzeriteEmpoweredItemData& azeriteEmpoweredItem) diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp index dc539b82b85..1dad655904f 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp @@ -46,57 +46,68 @@ bool AzeriteItem::Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext void AzeriteItem::SaveToDB(CharacterDatabaseTransaction& trans) { - Item::SaveToDB(trans); - CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE); stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE); - stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt64(1, m_azeriteItemData->Xp); - stmt->setUInt32(2, m_azeriteItemData->Level); - stmt->setUInt32(3, m_azeriteItemData->KnowledgeLevel); - std::size_t specIndex = 0; - for (; specIndex < m_azeriteItemData->SelectedEssences.size(); ++specIndex) - { - stmt->setUInt32(4 + specIndex * 4, m_azeriteItemData->SelectedEssences[specIndex].SpecializationID); - for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) - stmt->setUInt32(5 + specIndex * 4 + j, m_azeriteItemData->SelectedEssences[specIndex].AzeriteEssenceID[j]); - } - for (; specIndex < MAX_SPECIALIZATIONS; ++specIndex) - { - stmt->setUInt32(4 + specIndex * 4, 0); - for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) - stmt->setUInt32(5 + specIndex * 4 + j, 0); - } - - trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_MILESTONE_POWER); stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); - for (uint32 azeriteItemMilestonePowerId : m_azeriteItemData->UnlockedEssenceMilestones) - { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_MILESTONE_POWER); - stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt32(1, azeriteItemMilestonePowerId); - trans->Append(stmt); - } - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE); stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); - for (UF::UnlockedAzeriteEssence const& azeriteEssence : m_azeriteItemData->UnlockedEssences) + switch (GetState()) { - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE); - stmt->setUInt64(0, GetGUID().GetCounter()); - stmt->setUInt32(1, azeriteEssence.AzeriteEssenceID); - stmt->setUInt32(2, azeriteEssence.Rank); - trans->Append(stmt); + case ITEM_NEW: + case ITEM_CHANGED: + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE); + stmt->setUInt64(0, GetGUID().GetCounter()); + stmt->setUInt64(1, m_azeriteItemData->Xp); + stmt->setUInt32(2, m_azeriteItemData->Level); + stmt->setUInt32(3, m_azeriteItemData->KnowledgeLevel); + std::size_t specIndex = 0; + for (; specIndex < m_azeriteItemData->SelectedEssences.size(); ++specIndex) + { + stmt->setUInt32(4 + specIndex * 4, m_azeriteItemData->SelectedEssences[specIndex].SpecializationID); + for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) + stmt->setUInt32(5 + specIndex * 4 + j, m_azeriteItemData->SelectedEssences[specIndex].AzeriteEssenceID[j]); + } + for (; specIndex < MAX_SPECIALIZATIONS; ++specIndex) + { + stmt->setUInt32(4 + specIndex * 4, 0); + for (std::size_t j = 0; j < MAX_AZERITE_ESSENCE_SLOT; ++j) + stmt->setUInt32(5 + specIndex * 4 + j, 0); + } + + trans->Append(stmt); + + for (uint32 azeriteItemMilestonePowerId : m_azeriteItemData->UnlockedEssenceMilestones) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_MILESTONE_POWER); + stmt->setUInt64(0, GetGUID().GetCounter()); + stmt->setUInt32(1, azeriteItemMilestonePowerId); + trans->Append(stmt); + } + + for (UF::UnlockedAzeriteEssence const& azeriteEssence : m_azeriteItemData->UnlockedEssences) + { + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_INSTANCE_AZERITE_UNLOCKED_ESSENCE); + stmt->setUInt64(0, GetGUID().GetCounter()); + stmt->setUInt32(1, azeriteEssence.AzeriteEssenceID); + stmt->setUInt32(2, azeriteEssence.Rank); + trans->Append(stmt); + } + break; + } + case ITEM_REMOVED: + default: + break; } + + Item::SaveToDB(trans); } void AzeriteItem::LoadAzeriteItemData(Player const* owner, AzeriteItemData& azeriteItemData) |