mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-24 14:16:31 +00:00
fix(Core/Item): prevent possible items dupe (#6943)
This commit is contained in:
@@ -41,8 +41,8 @@ void LootItemStorage::LoadStorageFromDB()
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
StoredLootItemList& itemList = lootItemStore[ObjectGuid::Create<HighGuid::Item>(fields[0].GetUInt32())];
|
||||
itemList.push_back(StoredLootItem(fields[1].GetUInt32(), fields[2].GetUInt32(), fields[3].GetInt32(), fields[4].GetUInt32(), fields[5].GetBool(),
|
||||
fields[6].GetBool(), fields[7].GetBool(), fields[8].GetBool(), fields[9].GetBool(), fields[10].GetBool(), fields[11].GetUInt32()));
|
||||
itemList.push_back(StoredLootItem(fields[1].GetUInt32(), fields[2].GetUInt32(), fields[3].GetUInt32(), fields[4].GetInt32(), fields[5].GetUInt32(), fields[6].GetBool(),
|
||||
fields[7].GetBool(), fields[8].GetBool(), fields[9].GetBool(), fields[10].GetBool(), fields[11].GetBool(), fields[12].GetUInt32()));
|
||||
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
@@ -51,7 +51,7 @@ void LootItemStorage::LoadStorageFromDB()
|
||||
LOG_INFO("server.loading", " ");
|
||||
}
|
||||
|
||||
void LootItemStorage::RemoveEntryFromDB(ObjectGuid containerGUID, uint32 itemid, uint32 count)
|
||||
void LootItemStorage::RemoveEntryFromDB(ObjectGuid containerGUID, uint32 itemid, uint32 count, uint32 itemIndex)
|
||||
{
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
|
||||
@@ -59,6 +59,7 @@ void LootItemStorage::RemoveEntryFromDB(ObjectGuid containerGUID, uint32 itemid,
|
||||
stmt->setUInt32(0, containerGUID.GetCounter());
|
||||
stmt->setUInt32(1, itemid);
|
||||
stmt->setUInt32(2, count);
|
||||
stmt->setUInt32(3, itemIndex);
|
||||
trans->Append(stmt);
|
||||
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
@@ -80,12 +81,13 @@ void LootItemStorage::AddNewStoredLoot(Loot* loot, Player* /*player*/)
|
||||
// Gold at first
|
||||
if (loot->gold)
|
||||
{
|
||||
itemList.push_back(StoredLootItem(0, loot->gold, 0, 0, false, false, false, false, false, false, 0));
|
||||
itemList.push_back(StoredLootItem(0, 0, loot->gold, 0, 0, false, false, false, false, false, false, 0));
|
||||
|
||||
uint8 index = 0;
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEMCONTAINER_SINGLE_ITEM);
|
||||
stmt->setUInt32(index++, loot->containerGUID.GetCounter());
|
||||
stmt->setUInt32(index++, 0);
|
||||
stmt->setUInt32(index++, 0);
|
||||
stmt->setUInt32(index++, loot->gold);
|
||||
stmt->setInt32(index++, 0);
|
||||
stmt->setUInt32(index++, 0);
|
||||
@@ -118,13 +120,14 @@ void LootItemStorage::AddNewStoredLoot(Loot* loot, Player* /*player*/)
|
||||
conditionLootId = li->conditions.front()->SourceGroup;
|
||||
}
|
||||
|
||||
itemList.push_back(StoredLootItem(li->itemid, li->count, li->randomPropertyId, li->randomSuffix, li->follow_loot_rules, li->freeforall, li->is_blocked, li->is_counted,
|
||||
itemList.push_back(StoredLootItem(li->itemid, li->itemIndex, li->count, li->randomPropertyId, li->randomSuffix, li->follow_loot_rules, li->freeforall, li->is_blocked, li->is_counted,
|
||||
li->is_underthreshold, li->needs_quest, conditionLootId));
|
||||
|
||||
uint8 index = 0;
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEMCONTAINER_SINGLE_ITEM);
|
||||
stmt->setUInt32(index++, loot->containerGUID.GetCounter());
|
||||
stmt->setUInt32(index++, li->itemid);
|
||||
stmt->setUInt32(index++, li->itemIndex);
|
||||
stmt->setUInt32(index++, li->count);
|
||||
stmt->setInt32 (index++, li->randomPropertyId);
|
||||
stmt->setUInt32(index++, li->randomSuffix);
|
||||
@@ -168,6 +171,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player)
|
||||
{
|
||||
LootItem li;
|
||||
li.itemid = it2->itemid;
|
||||
li.itemIndex = it2->itemIndex;
|
||||
li.count = it2->count;
|
||||
li.follow_loot_rules = it2->follow_loot_rules;
|
||||
li.freeforall = it2->freeforall;
|
||||
@@ -212,7 +216,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player)
|
||||
return true;
|
||||
}
|
||||
|
||||
void LootItemStorage::RemoveStoredLootItem(ObjectGuid containerGUID, uint32 itemid, uint32 count, Loot* loot)
|
||||
void LootItemStorage::RemoveStoredLootItem(ObjectGuid containerGUID, uint32 itemid, uint32 count, Loot* loot, uint32 itemIndex)
|
||||
{
|
||||
LootItemContainer::iterator itr = lootItemStore.find(containerGUID);
|
||||
if (itr == lootItemStore.end())
|
||||
@@ -222,7 +226,7 @@ void LootItemStorage::RemoveStoredLootItem(ObjectGuid containerGUID, uint32 item
|
||||
for (StoredLootItemList::iterator it2 = itemList.begin(); it2 != itemList.end(); ++it2)
|
||||
if (it2->itemid == itemid && it2->count == count)
|
||||
{
|
||||
RemoveEntryFromDB(containerGUID, itemid, count);
|
||||
RemoveEntryFromDB(containerGUID, itemid, count, itemIndex);
|
||||
itemList.erase(it2);
|
||||
break;
|
||||
}
|
||||
@@ -243,7 +247,7 @@ void LootItemStorage::RemoveStoredLootMoney(ObjectGuid containerGUID, Loot* loot
|
||||
for (StoredLootItemList::iterator it2 = itemList.begin(); it2 != itemList.end(); ++it2)
|
||||
if (it2->itemid == 0)
|
||||
{
|
||||
RemoveEntryFromDB(containerGUID, 0, it2->count);
|
||||
RemoveEntryFromDB(containerGUID, 0, it2->count, 0);
|
||||
itemList.erase(it2);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user