diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index 1aab998a9..1bdc69fba 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -1372,6 +1372,8 @@ bool AInventory::TryPickupRestricted (AActor *&toucher) bool AInventory::CallTryPickup (AActor *toucher, AActor **toucher_return) { + TObjPtr Invstack = Inventory; // A pointer of the inventories item stack. + // unmorphed versions of a currently morphed actor cannot pick up anything. if (toucher->flags & MF_UNMORPHED) return false; @@ -1392,7 +1394,33 @@ bool AInventory::CallTryPickup (AActor *toucher, AActor **toucher_return) GoAwayAndDie(); } - if (res) GiveQuest(toucher); + if (res) + { + GiveQuest(toucher); + + // Transfer all inventory accross that the old object had, if requested. + if ((ItemFlags & IF_TRANSFER)) + { + while (Invstack) + { + AInventory* titem = Invstack; + Invstack = titem->Inventory; + if (titem->Owner == this) + { + Printf("Crantech: %s::CallTryPickup doing transfer of %s\n", GetClass()->TypeName.GetChars(), titem->GetClass()->TypeName.GetChars()); + if (!titem->CallTryPickup(toucher)) // The object no longer can exist + { + Printf("Crantech: %s::CallTryPickup, %s is now being destroyed\n", GetClass()->TypeName.GetChars(), titem->GetClass()->TypeName.GetChars()); + titem->Destroy(); + } + } + else + { + Printf("Crantech: %s::CallTryPickup, %s didn't belong to this object\n", GetClass()->TypeName.GetChars(), titem->GetClass()->TypeName.GetChars()); + } + } + } + } return res; } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index b8e45278e..51c6407f9 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -551,17 +551,12 @@ void AActor::AddInventory (AInventory *item) { // Is it attached to us? if (item->Owner == this) - { - Printf("Crantech: AddInventory->%s->Owner was Owner\n", item->GetClass()->TypeName.GetChars()); return; - } // No, then remove it from the other actor first item->Owner->RemoveInventory (item); - Printf("Crantech: AddInventory->%s->Owner was nonNULL\n", item->GetClass()->TypeName.GetChars()); } - TObjPtr Invstack = item->Inventory; item->Owner = this; item->Inventory = Inventory; Inventory = item; @@ -572,26 +567,6 @@ void AActor::AddInventory (AInventory *item) // run sometime in the future, so by the time it runs, the inventory // might not be in the same state as it was when DEM_INVUSE was sent. Inventory->InventoryID = InventoryID++; - - // If the flag exists, transfer all inventory accross that the old object had. - if ((item->ItemFlags & IF_TRANSFER)) - { - while (Invstack) - { - AInventory* titem = Invstack; - Invstack = titem->Inventory; - - Printf("Crantech: AddInventory->%s doing transfer of %s\n", item->GetClass()->TypeName.GetChars(), titem->GetClass()->TypeName.GetChars()); - bool success = titem->CallTryPickup(this); - if (!success) - { - Printf("Crantech: AddInventory->%s, %s is now being destroyed\n", item->GetClass()->TypeName.GetChars(), titem->GetClass()->TypeName.GetChars()); - titem->Destroy(); - } - //AddInventory(item->Inventory); // Adds current inventory item to present index - } - } - } //============================================================================