- scriptified AddInventory.

This commit is contained in:
Christoph Oelckers 2018-12-01 17:03:58 +01:00
parent d812b94d57
commit a426655d61
8 changed files with 64 additions and 68 deletions

View file

@ -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.
// 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. // Give an item to the actor and pick it up.
// Returns true if the item pickup succeeded. // Returns true if the item pickup succeeded.
bool GiveInventory (PClassActor *type, int amount, bool givecheat = false); bool GiveInventory (PClassActor *type, int amount, bool givecheat = false);

View file

@ -89,7 +89,6 @@ public:
virtual void PostBeginPlay() override; virtual void PostBeginPlay() override;
virtual void Tick() override; virtual void Tick() override;
virtual void AddInventory (AInventory *item) override;
virtual void RemoveInventory (AInventory *item) 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;

View file

@ -350,6 +350,7 @@ DEFINE_FIELD(AActor, RenderHidden)
DEFINE_FIELD(AActor, RenderRequired) DEFINE_FIELD(AActor, RenderRequired)
DEFINE_FIELD(AActor, friendlyseeblocks) DEFINE_FIELD(AActor, friendlyseeblocks)
DEFINE_FIELD(AActor, SpawnTime) DEFINE_FIELD(AActor, SpawnTime)
DEFINE_FIELD(AActor, InventoryID)
//========================================================================== //==========================================================================
// //
@ -752,46 +753,6 @@ DEFINE_ACTION_FUNCTION(AActor, SetState)
ACTION_RETURN_BOOL(self->SetState(state, nofunction)); ACTION_RETURN_BOOL(self->SetState(state, nofunction));
}; };
//============================================================================
//
// AActor :: AddInventory
//
//============================================================================
void AActor::AddInventory (AInventory *item)
{
// Check if it's already attached to an actor
if (item->Owner != NULL)
{
// Is it attached to us?
if (item->Owner == this)
return;
// No, then remove it from the other actor first
item->Owner->RemoveInventory (item);
}
item->Owner = this;
item->Inventory = Inventory;
Inventory = item;
// Each item receives an unique ID when added to an actor's inventory.
// This is used by the DEM_INVUSE command to identify the item. Simply
// using the item's position in the list won't work, because ticcmds get
// 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++;
}
DEFINE_ACTION_FUNCTION(AActor, AddInventory)
{
PARAM_SELF_PROLOGUE(AActor);
PARAM_OBJECT_NOT_NULL(item, AInventory);
self->AddInventory(item);
return 0;
}
//============================================================================ //============================================================================
// //
// AActor :: GiveInventory // AActor :: GiveInventory

View file

@ -938,29 +938,6 @@ void APlayerPawn::PostBeginPlay()
} }
} }
//===========================================================================
//
// APlayerPawn :: AddInventory
//
//===========================================================================
void APlayerPawn::AddInventory (AInventory *item)
{
// Adding inventory to a voodoo doll should add it to the real player instead.
if (player != NULL && player->mo != this && player->mo != NULL)
{
player->mo->AddInventory (item);
return;
}
Super::AddInventory (item);
// If nothing is selected, select this item.
if (InvSel == NULL && (item->ItemFlags & IF_INVBAR))
{
InvSel = item;
}
}
//=========================================================================== //===========================================================================
// //
// APlayerPawn :: RemoveInventory // APlayerPawn :: RemoveInventory

View file

@ -8,6 +8,7 @@ version "3.7"
#include "zscript/actor_attacks.txt" #include "zscript/actor_attacks.txt"
#include "zscript/actor_checks.txt" #include "zscript/actor_checks.txt"
#include "zscript/actor_interaction.txt" #include "zscript/actor_interaction.txt"
#include "zscript/actor_inventory.txt"
#include "zscript/events.txt" #include "zscript/events.txt"
#include "zscript/destructible.txt" #include "zscript/destructible.txt"
#include "zscript/level_compatibility.txt" #include "zscript/level_compatibility.txt"
@ -56,6 +57,7 @@ version "3.7"
#include "zscript/shared/player.txt" #include "zscript/shared/player.txt"
#include "zscript/shared/player_cheat.txt" #include "zscript/shared/player_cheat.txt"
#include "zscript/shared/player_inventory.txt"
#include "zscript/shared/morph.txt" #include "zscript/shared/morph.txt"
#include "zscript/shared/botstuff.txt" #include "zscript/shared/botstuff.txt"
#include "zscript/shared/sharedmisc.txt" #include "zscript/shared/sharedmisc.txt"

View file

@ -241,6 +241,7 @@ class Actor : Thinker native
native int RenderRequired; native int RenderRequired;
native readonly int FriendlySeeBlocks; native readonly int FriendlySeeBlocks;
native readonly int SpawnTime; native readonly int SpawnTime;
private native int InventoryID; // internal counter.
meta String Obituary; // Player was killed by this actor meta String Obituary; // Player was killed by this actor
meta String HitObituary; // Player was killed by this actor in melee meta String HitObituary; // Player was killed by this actor in melee
@ -740,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 AddInventory(Inventory inv);
native void RemoveInventory(Inventory inv); 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!

View file

@ -0,0 +1,34 @@
extend class Actor
{
//============================================================================
//
// AActor :: AddInventory
//
//============================================================================
virtual void AddInventory (Inventory item)
{
// Check if it's already attached to an actor
if (item.Owner != NULL)
{
// Is it attached to us?
if (item.Owner == self)
return;
// No, then remove it from the other actor first
item.Owner.RemoveInventory (item);
}
item.Owner = self;
item.Inv = Inv;
Inv = item;
// Each item receives an unique ID when added to an actor's inventory.
// This is used by the DEM_INVUSE command to identify the item. Simply
// using the item's position in the list won't work, because ticcmds get
// 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.
Inv.InventoryID = InventoryID++;
}
}

View file

@ -0,0 +1,26 @@
extend class PlayerPawn
{
//===========================================================================
//
// APlayerPawn :: AddInventory
//
//===========================================================================
override void AddInventory (Inventory item)
{
// Adding inventory to a voodoo doll should add it to the real player instead.
if (player != NULL && player.mo != self && player.mo != NULL)
{
player.mo.AddInventory (item);
return;
}
Super.AddInventory (item);
// If nothing is selected, select this item.
if (InvSel == NULL && item.bInvBar)
{
InvSel = item;
}
}
}