mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 13:01:47 +00:00
- scriptified RemoveInventory and Inventory.OnDestroy.
This commit is contained in:
parent
eb47fb9adc
commit
023efc7685
10 changed files with 122 additions and 120 deletions
|
@ -746,9 +746,6 @@ public:
|
||||||
// APlayerPawn for some specific handling for players. None of this
|
// APlayerPawn for some specific handling for players. None of this
|
||||||
// should ever be overridden by custom classes.
|
// should ever be overridden by custom classes.
|
||||||
|
|
||||||
// Removes the item from the inventory list.
|
|
||||||
virtual void RemoveInventory (AInventory *item);
|
|
||||||
|
|
||||||
// Take the amount value of an item from the inventory list.
|
// Take the amount value of an item from the inventory list.
|
||||||
// If nothing is left, the item may be destroyed.
|
// If nothing is left, the item may be destroyed.
|
||||||
// Returns true if the initial item count is positive.
|
// Returns true if the initial item count is positive.
|
||||||
|
|
|
@ -89,7 +89,6 @@ public:
|
||||||
|
|
||||||
virtual void PostBeginPlay() override;
|
virtual void PostBeginPlay() override;
|
||||||
virtual void Tick() override;
|
virtual void Tick() override;
|
||||||
virtual void RemoveInventory (AInventory *item) override;
|
|
||||||
virtual bool UseInventory (AInventory *item) override;
|
virtual bool UseInventory (AInventory *item) override;
|
||||||
virtual void BeginPlay () override;
|
virtual void BeginPlay () override;
|
||||||
virtual bool UpdateWaterLevel (bool splash) override;
|
virtual bool UpdateWaterLevel (bool splash) override;
|
||||||
|
|
|
@ -180,26 +180,6 @@ DEFINE_ACTION_FUNCTION(AInventory, PrintPickupMessage)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//
|
|
||||||
// AInventory :: Destroy
|
|
||||||
//
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
void AInventory::OnDestroy ()
|
|
||||||
{
|
|
||||||
if (Owner != NULL)
|
|
||||||
{
|
|
||||||
Owner->RemoveInventory (this);
|
|
||||||
}
|
|
||||||
Inventory = NULL;
|
|
||||||
Super::OnDestroy();
|
|
||||||
|
|
||||||
// Although contrived it can theoretically happen that these variables still got a pointer to this item
|
|
||||||
if (SendItemUse == this) SendItemUse = NULL;
|
|
||||||
if (SendItemDrop == this) SendItemDrop = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// AInventory :: DepleteOrDestroy
|
// AInventory :: DepleteOrDestroy
|
||||||
|
|
|
@ -71,7 +71,6 @@ class AInventory : public AActor
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual void Serialize(FSerializer &arc) override;
|
virtual void Serialize(FSerializer &arc) override;
|
||||||
virtual void OnDestroy() override;
|
|
||||||
virtual void Tick() override;
|
virtual void Tick() override;
|
||||||
virtual bool Massacre() override;
|
virtual bool Massacre() override;
|
||||||
|
|
||||||
|
|
|
@ -753,48 +753,6 @@ DEFINE_ACTION_FUNCTION(AActor, SetState)
|
||||||
ACTION_RETURN_BOOL(self->SetState(state, nofunction));
|
ACTION_RETURN_BOOL(self->SetState(state, nofunction));
|
||||||
};
|
};
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
//
|
|
||||||
// AActor :: RemoveInventory
|
|
||||||
//
|
|
||||||
//============================================================================
|
|
||||||
|
|
||||||
void AActor::RemoveInventory(AInventory *item)
|
|
||||||
{
|
|
||||||
AInventory *inv, **invp;
|
|
||||||
|
|
||||||
if (item != NULL && item->Owner != NULL) // can happen if the owner was destroyed by some action from an item's use state.
|
|
||||||
{
|
|
||||||
invp = &item->Owner->Inventory;
|
|
||||||
for (inv = *invp; inv != NULL; invp = &inv->Inventory, inv = *invp)
|
|
||||||
{
|
|
||||||
if (inv == item)
|
|
||||||
{
|
|
||||||
*invp = item->Inventory;
|
|
||||||
|
|
||||||
IFVIRTUALPTR(item, AInventory, DetachFromOwner)
|
|
||||||
{
|
|
||||||
VMValue params[1] = { item };
|
|
||||||
VMCall(func, params, 1, nullptr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
item->Owner = NULL;
|
|
||||||
item->Inventory = NULL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, RemoveInventory)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
PARAM_OBJECT_NOT_NULL(item, AInventory);
|
|
||||||
self->RemoveInventory(item);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// AActor :: TakeInventory
|
// AActor :: TakeInventory
|
||||||
|
|
|
@ -938,58 +938,6 @@ void APlayerPawn::PostBeginPlay()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//
|
|
||||||
// APlayerPawn :: RemoveInventory
|
|
||||||
//
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
void APlayerPawn::RemoveInventory (AInventory *item)
|
|
||||||
{
|
|
||||||
bool pickWeap = false;
|
|
||||||
|
|
||||||
// Since voodoo dolls aren't supposed to have an inventory, there should be
|
|
||||||
// no need to redirect them to the real player here as there is with AddInventory.
|
|
||||||
|
|
||||||
// If the item removed is the selected one, select something else, either the next
|
|
||||||
// item, if there is one, or the previous item.
|
|
||||||
if (player != NULL)
|
|
||||||
{
|
|
||||||
if (InvSel == item)
|
|
||||||
{
|
|
||||||
InvSel = item->NextInv ();
|
|
||||||
if (InvSel == NULL)
|
|
||||||
{
|
|
||||||
InvSel = item->PrevInv ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (InvFirst == item)
|
|
||||||
{
|
|
||||||
InvFirst = item->NextInv ();
|
|
||||||
if (InvFirst == NULL)
|
|
||||||
{
|
|
||||||
InvFirst = item->PrevInv ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (item == player->PendingWeapon)
|
|
||||||
{
|
|
||||||
player->PendingWeapon = WP_NOCHANGE;
|
|
||||||
}
|
|
||||||
if (item == player->ReadyWeapon)
|
|
||||||
{
|
|
||||||
// If the current weapon is removed, clear the refire counter and pick a new one.
|
|
||||||
pickWeap = true;
|
|
||||||
player->ReadyWeapon = NULL;
|
|
||||||
player->refire = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Super::RemoveInventory (item);
|
|
||||||
if (pickWeap && player->mo == this && player->PendingWeapon == WP_NOCHANGE)
|
|
||||||
{
|
|
||||||
PickNewWeapon (NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// APlayerPawn :: UseInventory
|
// APlayerPawn :: UseInventory
|
||||||
|
|
|
@ -741,7 +741,6 @@ class Actor : Thinker native
|
||||||
native clearscope int GetAge() const;
|
native clearscope int GetAge() const;
|
||||||
|
|
||||||
native bool CheckClass(class<Actor> checkclass, int ptr_select = AAPTR_DEFAULT, bool match_superclass = false);
|
native bool CheckClass(class<Actor> checkclass, int ptr_select = AAPTR_DEFAULT, bool match_superclass = false);
|
||||||
native void RemoveInventory(Inventory inv);
|
|
||||||
native void ClearInventory();
|
native void ClearInventory();
|
||||||
protected native void DestroyAllInventory(); // This is not supposed to be called by user code!
|
protected native void DestroyAllInventory(); // This is not supposed to be called by user code!
|
||||||
native bool SetInventory(class<Inventory> itemclass, int amount, bool beyondMax = false);
|
native bool SetInventory(class<Inventory> itemclass, int amount, bool beyondMax = false);
|
||||||
|
|
|
@ -80,4 +80,34 @@ extend class Actor
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// AActor :: RemoveInventory
|
||||||
|
//
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
virtual void RemoveInventory(Inventory item)
|
||||||
|
{
|
||||||
|
Inventory invp;
|
||||||
|
|
||||||
|
if (item != NULL && item.Owner != NULL) // can happen if the owner was destroyed by some action from an item's use state.
|
||||||
|
{
|
||||||
|
if (Inv == item) Inv = item.Inv;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (invp = Inv; invp != null; invp = invp.Inv)
|
||||||
|
{
|
||||||
|
if (invp.Inv == item)
|
||||||
|
{
|
||||||
|
invp.Inv = item.Inv;
|
||||||
|
item.DetachFromOwner();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
item.Owner = NULL;
|
||||||
|
item.Inv = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -98,6 +98,22 @@ class Inventory : Actor native
|
||||||
bDropped = true; // [RH] Items are dropped by default
|
bDropped = true; // [RH] Items are dropped by default
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// AInventory :: Destroy
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
override void OnDestroy ()
|
||||||
|
{
|
||||||
|
if (Owner != NULL)
|
||||||
|
{
|
||||||
|
Owner.RemoveInventory (self);
|
||||||
|
}
|
||||||
|
Inv = NULL;
|
||||||
|
Super.OnDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_RestoreSpecialThing1
|
// PROC A_RestoreSpecialThing1
|
||||||
|
@ -990,6 +1006,30 @@ class Inventory : Actor native
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// AInventory :: PrevInv
|
||||||
|
//
|
||||||
|
// Returns the previous item with IF_INVBAR set.
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
Inventory PrevInv ()
|
||||||
|
{
|
||||||
|
Inventory lastgood = NULL;
|
||||||
|
Inventory item = Owner.Inv;
|
||||||
|
|
||||||
|
while (item != NULL && item != self)
|
||||||
|
{
|
||||||
|
if (item.bInvBar)
|
||||||
|
{
|
||||||
|
lastgood = item;
|
||||||
|
}
|
||||||
|
item = item.Inv;
|
||||||
|
}
|
||||||
|
return lastgood;
|
||||||
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// AInventory :: OnDrop
|
// AInventory :: OnDrop
|
||||||
|
|
|
@ -23,4 +23,56 @@ extend class PlayerPawn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// APlayerPawn :: RemoveInventory
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
override void RemoveInventory (Inventory item)
|
||||||
|
{
|
||||||
|
bool pickWeap = false;
|
||||||
|
|
||||||
|
// Since voodoo dolls aren't supposed to have an inventory, there should be
|
||||||
|
// no need to redirect them to the real player here as there is with AddInventory.
|
||||||
|
|
||||||
|
// If the item removed is the selected one, select something else, either the next
|
||||||
|
// item, if there is one, or the previous item.
|
||||||
|
if (player != NULL)
|
||||||
|
{
|
||||||
|
if (InvSel == item)
|
||||||
|
{
|
||||||
|
InvSel = item.NextInv ();
|
||||||
|
if (InvSel == NULL)
|
||||||
|
{
|
||||||
|
InvSel = item.PrevInv ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (InvFirst == item)
|
||||||
|
{
|
||||||
|
InvFirst = item.NextInv ();
|
||||||
|
if (InvFirst == NULL)
|
||||||
|
{
|
||||||
|
InvFirst = item.PrevInv ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item == player.PendingWeapon)
|
||||||
|
{
|
||||||
|
player.PendingWeapon = WP_NOCHANGE;
|
||||||
|
}
|
||||||
|
if (item == player.ReadyWeapon)
|
||||||
|
{
|
||||||
|
// If the current weapon is removed, clear the refire counter and pick a new one.
|
||||||
|
pickWeap = true;
|
||||||
|
player.ReadyWeapon = NULL;
|
||||||
|
player.refire = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Super.RemoveInventory (item);
|
||||||
|
if (pickWeap && player.mo == self && player.PendingWeapon == WP_NOCHANGE)
|
||||||
|
{
|
||||||
|
PickNewWeapon (NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue