mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-26 22:11:43 +00:00
- Added the 'GiveInventory' method to the actor.
This will help cleaning up the item giving code. Returns a bool, in case the pickup failure might turn to be interesting in the future.
This commit is contained in:
parent
ed070cfe06
commit
7b35f32f3d
2 changed files with 60 additions and 0 deletions
|
@ -661,6 +661,10 @@ public:
|
|||
// Adds the item to this actor's inventory and sets its Owner.
|
||||
virtual void AddInventory (AInventory *item);
|
||||
|
||||
// Give an item to the actor and pick it up.
|
||||
// Returns true if the item pickup succeeded.
|
||||
virtual bool GiveInventory (PClassInventory *type, int amount, bool givecheat = false);
|
||||
|
||||
// Removes the item from the inventory list.
|
||||
virtual void RemoveInventory (AInventory *item);
|
||||
|
||||
|
|
|
@ -612,6 +612,62 @@ void AActor::AddInventory (AInventory *item)
|
|||
Inventory->InventoryID = InventoryID++;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// AActor :: GiveInventory
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
bool AActor::GiveInventory(PClassInventory *type, int amount, bool givecheat)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
AWeapon *savedPendingWeap = player != NULL ? player->PendingWeapon : NULL;
|
||||
bool hadweap = player != NULL ? player->ReadyWeapon != NULL : true;
|
||||
|
||||
AInventory *item;
|
||||
if (!givecheat)
|
||||
{
|
||||
item = static_cast<AInventory *>(Spawn (type));
|
||||
}
|
||||
else
|
||||
{
|
||||
item = static_cast<AInventory *>(Spawn (type, Pos(), NO_REPLACE));
|
||||
if (item == NULL) return false;
|
||||
}
|
||||
|
||||
// This shouldn't count for the item statistics!
|
||||
item->ClearCounters();
|
||||
if (type->IsDescendantOf (RUNTIME_CLASS(ABasicArmorPickup)))
|
||||
{
|
||||
static_cast<ABasicArmorPickup*>(item)->SaveAmount *= amount;
|
||||
}
|
||||
else if (type->IsDescendantOf (RUNTIME_CLASS(ABasicArmorBonus)))
|
||||
{
|
||||
static_cast<ABasicArmorBonus*>(item)->SaveAmount *= amount;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!givecheat)
|
||||
item->Amount = amount;
|
||||
else
|
||||
item->Amount = MIN (amount, item->MaxAmount);
|
||||
}
|
||||
if (!item->CallTryPickup (this))
|
||||
{
|
||||
item->Destroy ();
|
||||
result = false;
|
||||
}
|
||||
// If the item was a weapon, don't bring it up automatically
|
||||
// unless the player was not already using a weapon.
|
||||
// Don't bring it up automatically if this is called by the give cheat.
|
||||
if (!givecheat && player != NULL && savedPendingWeap != NULL && hadweap)
|
||||
{
|
||||
player->PendingWeapon = savedPendingWeap;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// AActor :: RemoveInventory
|
||||
|
|
Loading…
Reference in a new issue