I got the flag to persist through bagged items now. This seems to make attuneable items work properly in my limited testing.
Code:
Index: common/shareddb.cpp
===================================================================
--- common/shareddb.cpp (revision 397)
+++ common/shareddb.cpp (working copy)
@@ -1229,7 +1229,7 @@
// Create appropriate ItemInst class
-ItemInst* SharedDatabase::CreateItem(uint32 item_id, sint16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5)
+ItemInst* SharedDatabase::CreateItem(uint32 item_id, sint16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, bool instnodrop)
{
const Item_Struct* item = NULL;
ItemInst* inst = NULL;
@@ -1241,6 +1241,7 @@
inst->PutAugment(this, 2, aug3);
inst->PutAugment(this, 3, aug4);
inst->PutAugment(this, 4, aug5);
+ inst->SetInstNoDrop(instnodrop);
}
@@ -1249,7 +1250,7 @@
// Create appropriate ItemInst class
-ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, sint16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5)
+ItemInst* SharedDatabase::CreateItem(const Item_Struct* item, sint16 charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, bool instnodrop)
{
ItemInst* inst = NULL;
if (item) {
@@ -1262,6 +1263,7 @@
inst->PutAugment(this, 3, aug4);
inst->PutAugment(this, 4, aug5);
inst->SetCharges(charges);
+ inst->SetInstNoDrop(instnodrop);
}
return inst;
Index: common/shareddb.h
===================================================================
--- common/shareddb.h (revision 397)
+++ common/shareddb.h (working copy)
@@ -60,8 +60,8 @@
/*
* Item Methods
*/
- ItemInst* CreateItem(uint32 item_id, sint16 charges=0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0);
- ItemInst* CreateItem(const Item_Struct* item, sint16 charges=0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0);
+ ItemInst* CreateItem(uint32 item_id, sint16 charges=0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0, bool instnodrop = false);
+ ItemInst* CreateItem(const Item_Struct* item, sint16 charges=0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0, bool instnodrop = false);
/*
Index: zone/inventory.cpp
===================================================================
--- zone/inventory.cpp (revision 397)
+++ zone/inventory.cpp (working copy)
@@ -330,7 +330,7 @@
{
if(bag_item_data[i] == NULL)
continue;
- const ItemInst *bagitem = database.CreateItem(bag_item_data[i]->item_id, bag_item_data[i]->charges);
+ const ItemInst *bagitem = database.CreateItem(bag_item_data[i]->item_id, bag_item_data[i]->charges, bag_item_data[i]->aug1, bag_item_data[i]->aug2, bag_item_data[i]->aug3, bag_item_data[i]->aug4, bag_item_data[i]->aug5, bag_item_data[i]->instnodrop);
interior_slot = Inventory::CalcSlotId(slot_id, i);
mlog(INVENTORY__SLOTS, "Putting bag loot item %s (%d) into slot %d (bag slot %d)", inst.GetItem()->Name, inst.GetItem()->ID, interior_slot, i);
PutLootInInventory(interior_slot, *bagitem);
Index: zone/PlayerCorpse.cpp
===================================================================
--- zone/PlayerCorpse.cpp (revision 397)
+++ zone/PlayerCorpse.cpp (working copy)
@@ -309,7 +309,7 @@
sint16 interior_slot;
ItemInst *interior_item;
- AddItem(item->GetItem()->ID, item->GetCharges(), equipslot, item->GetAugmentItemID(0), item->GetAugmentItemID(1), item->GetAugmentItemID(2), item->GetAugmentItemID(3), item->GetAugmentItemID(4));
+ AddItem(item->GetItem()->ID, item->GetCharges(), equipslot, item->GetAugmentItemID(0), item->GetAugmentItemID(1), item->GetAugmentItemID(2), item->GetAugmentItemID(3), item->GetAugmentItemID(4), item->IsInstNoDrop());
if(item->IsType(ItemClassContainer))
{
for(bagindex = 0; bagindex <= 10; bagindex++)
@@ -319,7 +319,7 @@
if(interior_item)
{
- AddItem(interior_item->GetItem()->ID, interior_item->GetCharges(), interior_slot, interior_item->GetAugmentItemID(0), interior_item->GetAugmentItemID(1), interior_item->GetAugmentItemID(2), interior_item->GetAugmentItemID(3), interior_item->GetAugmentItemID(4));
+ AddItem(interior_item->GetItem()->ID, interior_item->GetCharges(), interior_slot, interior_item->GetAugmentItemID(0), interior_item->GetAugmentItemID(1), interior_item->GetAugmentItemID(2), interior_item->GetAugmentItemID(3), interior_item->GetAugmentItemID(4), interior_item->IsInstNoDrop());
client->DeleteItemInInventory(interior_slot);
}
}
@@ -488,7 +488,7 @@
return itemlist.size();
}
-void Corpse::AddItem(uint32 itemnum, int8 charges, sint16 slot, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5) {
+void Corpse::AddItem(uint32 itemnum, int8 charges, sint16 slot, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, bool instnodrop) {
if (!database.GetItem(itemnum))
return;
pIsChanged = true;
@@ -502,6 +502,7 @@
item->aug3=aug3;
item->aug4=aug4;
item->aug5=aug5;
+ item->instnodrop = instnodrop;
itemlist.push_back(item);
}
@@ -854,7 +855,7 @@
item = database.GetItem(item_data->item_id);
if (client && item)
{
- ItemInst* inst = database.CreateItem(item, item_data->charges, item_data->aug1, item_data->aug2, item_data->aug3, item_data->aug4, item_data->aug5);
+ ItemInst* inst = database.CreateItem(item, item_data->charges, item_data->aug1, item_data->aug2, item_data->aug3, item_data->aug4, item_data->aug5, item_data->instnodrop);
if (inst)
{
client->SendItemPacket(i + 22, inst, ItemPacketLoot);
@@ -920,7 +921,7 @@
if (item != 0)
{
if(item_data)
- inst = database.CreateItem(item, item_data?item_data->charges:0, item_data->aug1, item_data->aug2, item_data->aug3, item_data->aug4, item_data->aug5);
+ inst = database.CreateItem(item, item_data?item_data->charges:0, item_data->aug1, item_data->aug2, item_data->aug3, item_data->aug4, item_data->aug5, item_data->instnodrop);
else
inst = database.CreateItem(item);
Index: zone/PlayerCorpse.h
===================================================================
--- zone/PlayerCorpse.h (revision 397)
+++ zone/PlayerCorpse.h (working copy)
@@ -57,7 +57,7 @@
void SetDecayTimer(int32 decaytime);
bool IsEmpty() const;
- void AddItem(uint32 itemnum, int8 charges, sint16 slot = 0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0);
+ void AddItem(uint32 itemnum, int8 charges, sint16 slot = 0, uint32 aug1=0, uint32 aug2=0, uint32 aug3=0, uint32 aug4=0, uint32 aug5=0, bool instnodrop=false);
uint32 GetWornItem(sint16 equipSlot) const;
ServerLootItem_Struct* GetItem(int16 lootslot, ServerLootItem_Struct** bag_item_data = 0);
void RemoveItem(int16 lootslot);
Index: zone/zonedump.h
===================================================================
--- zone/zonedump.h (revision 397)
+++ zone/zonedump.h (working copy)
@@ -155,6 +155,7 @@
uint32 aug3;
uint32 aug4;
uint32 aug5;
+ bool instnodrop;
};
struct DBPlayerCorpse_Struct {