mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-10 23:01:50 +00:00
Added INVENTORY.TRANSFER
- INVENTORY.TRANSFER allows transferring all owned inventory to a new owner on pickup.
This commit is contained in:
parent
8e1b1aa201
commit
de4097cc7b
3 changed files with 28 additions and 1 deletions
|
@ -136,7 +136,7 @@ enum
|
|||
IF_NOSCREENFLASH = 1<<21, // No pickup flash on the player's screen
|
||||
IF_TOSSED = 1<<22, // Was spawned by P_DropItem (i.e. as a monster drop)
|
||||
IF_ALWAYSRESPAWN = 1<<23, // Always respawn, regardless of dmflag
|
||||
|
||||
IF_TRANSFER = 1<<24, // All inventory items that the inventory item contains is also transfered to the pickuper
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -551,12 +551,17 @@ 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<AInventory> Invstack = item->Inventory;
|
||||
item->Owner = this;
|
||||
item->Inventory = Inventory;
|
||||
Inventory = item;
|
||||
|
@ -567,6 +572,26 @@ 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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
@ -587,6 +612,7 @@ void AActor::RemoveInventory (AInventory *item)
|
|||
*invp = item->Inventory;
|
||||
item->DetachFromOwner ();
|
||||
item->Owner = NULL;
|
||||
item->Inventory = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -324,6 +324,7 @@ static FFlagDef InventoryFlags[] =
|
|||
DEFINE_FLAG(IF, NOSCREENFLASH, AInventory, ItemFlags),
|
||||
DEFINE_FLAG(IF, TOSSED, AInventory, ItemFlags),
|
||||
DEFINE_FLAG(IF, ALWAYSRESPAWN, AInventory, ItemFlags),
|
||||
DEFINE_FLAG(IF, TRANSFER, AInventory, ItemFlags),
|
||||
|
||||
DEFINE_DEPRECATED_FLAG(PICKUPFLASH),
|
||||
DEFINE_DEPRECATED_FLAG(INTERHUBSTRIP),};
|
||||
|
|
Loading…
Reference in a new issue