View Single Post
  #18  
Old 03-09-2009, 08:55 AM
Theeper
Discordant
 
Join Date: May 2004
Posts: 290
Default

Here is another step closer to having attuneable items working. This will make corpses properly handle the instnodrop flag .. almost.

It works fine except for on bagged items. They lose the flag upon looting. It's set on the corpse, and set when looted, but I can't figure out why it's getting unset. I was hoping someone else would put their eyes on it and tell me what I missed.

I am not sure how this works with PVP looting and shared bank as I haven't tested them.

This one is kinda long, so I made a diff against rev 373. This is on windows with PEQ.

Code:
Index: common/shareddb.cpp
===================================================================
--- common/shareddb.cpp	(revision 373)
+++ common/shareddb.cpp	(working copy)
@@ -1201,7 +1201,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;
@@ -1213,6 +1213,7 @@
 		inst->PutAugment(this, 2, aug3);
 		inst->PutAugment(this, 3, aug4);
 		inst->PutAugment(this, 4, aug5);
+		inst->SetInstNoDrop(instnodrop);
 
 	}
 
@@ -1221,7 +1222,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) {
@@ -1234,6 +1235,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 373)
+++ common/shareddb.h	(working copy)
@@ -58,8 +58,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/PlayerCorpse.cpp
===================================================================
--- zone/PlayerCorpse.cpp	(revision 373)
+++ zone/PlayerCorpse.cpp	(working copy)
@@ -293,7 +293,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++)
@@ -303,7 +303,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);
 			}
 		}
@@ -456,7 +456,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;
@@ -470,6 +470,7 @@
 	item->aug3=aug3;
 	item->aug4=aug4;
 	item->aug5=aug5;
+	item->instnodrop = instnodrop;
 	itemlist.push_back(item);
 }
 
@@ -822,7 +823,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);
@@ -888,7 +889,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 373)
+++ 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 373)
+++ zone/zonedump.h	(working copy)
@@ -155,6 +155,7 @@
 	uint32 aug3;
 	uint32 aug4;
 	uint32 aug5;
+	bool instnodrop;
 };
 
 struct DBPlayerCorpse_Struct {
Reply With Quote