mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 13:01:47 +00:00
179 lines
No EOL
4.1 KiB
Text
179 lines
No EOL
4.1 KiB
Text
extend class PlayerPawn
|
|
{
|
|
|
|
//===========================================================================
|
|
//
|
|
//
|
|
//
|
|
//===========================================================================
|
|
|
|
ui void InvNext()
|
|
{
|
|
Inventory next;
|
|
|
|
let old = InvSel;
|
|
if (InvSel != NULL)
|
|
{
|
|
if ((next = InvSel.NextInv()) != NULL)
|
|
{
|
|
InvSel = next;
|
|
}
|
|
else
|
|
{
|
|
// Select the first item in the inventory
|
|
InvSel = FirstInv();
|
|
}
|
|
if (InvSel) InvSel.DisplayNameTag();
|
|
}
|
|
player.inventorytics = 5*TICRATE;
|
|
if (old != InvSel)
|
|
{
|
|
A_PlaySound("misc/invchange", CHAN_AUTO, 1.0, false, ATTN_NONE);
|
|
}
|
|
}
|
|
|
|
//===========================================================================
|
|
//
|
|
// APlayerPawn :: InvPrev
|
|
//
|
|
//===========================================================================
|
|
|
|
ui void InvPrev()
|
|
{
|
|
Inventory item, newitem;
|
|
|
|
let old = InvSel;
|
|
if (InvSel != NULL)
|
|
{
|
|
if ((item = InvSel.PrevInv()) != NULL)
|
|
{
|
|
InvSel = item;
|
|
}
|
|
else
|
|
{
|
|
// Select the last item in the inventory
|
|
item = InvSel;
|
|
while ((newitem = item.NextInv()) != NULL)
|
|
{
|
|
item = newitem;
|
|
}
|
|
InvSel = item;
|
|
}
|
|
if (InvSel) InvSel.DisplayNameTag();
|
|
}
|
|
player.inventorytics = 5*TICRATE;
|
|
if (old != InvSel)
|
|
{
|
|
A_PlaySound("misc/invchange", CHAN_AUTO, 1.0, false, ATTN_NONE);
|
|
}
|
|
}
|
|
|
|
//===========================================================================
|
|
//
|
|
// 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;
|
|
}
|
|
}
|
|
|
|
//===========================================================================
|
|
//
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
//===========================================================================
|
|
//
|
|
// APlayerPawn :: UseInventory
|
|
//
|
|
//===========================================================================
|
|
|
|
override bool UseInventory (Inventory item)
|
|
{
|
|
let itemtype = item.GetClass();
|
|
|
|
if (player.cheats & CF_TOTALLYFROZEN)
|
|
{ // You can't use items if you're totally frozen
|
|
return false;
|
|
}
|
|
if ((level.FROZEN) && (player == NULL || player.timefreezer == 0))
|
|
{
|
|
// Time frozen
|
|
return false;
|
|
}
|
|
|
|
if (!Super.UseInventory (item))
|
|
{
|
|
// Heretic and Hexen advance the inventory cursor if the use failed.
|
|
// Should this behavior be retained?
|
|
return false;
|
|
}
|
|
if (player == players[consoleplayer])
|
|
{
|
|
A_PlaySound(item.UseSound, CHAN_ITEM);
|
|
StatusBar.FlashItem (itemtype); // Fixme: This shouldn't be called from here, because it is in the UI.
|
|
}
|
|
return true;
|
|
}
|
|
} |