mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-28 06:53:58 +00:00
- scriptified A_SelectWeapon
This commit is contained in:
parent
9348baeeb1
commit
44e43c48b5
3 changed files with 58 additions and 66 deletions
|
@ -1529,54 +1529,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Recoil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
///===========================================================================
|
||||||
//
|
|
||||||
// A_SelectWeapon
|
|
||||||
//
|
|
||||||
//===========================================================================
|
|
||||||
enum SW_Flags
|
|
||||||
{
|
|
||||||
SWF_SELECTPRIORITY = 1,
|
|
||||||
};
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_SelectWeapon)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
PARAM_CLASS(cls, AActor);
|
|
||||||
PARAM_INT(flags);
|
|
||||||
|
|
||||||
bool selectPriority = !!(flags & SWF_SELECTPRIORITY);
|
|
||||||
|
|
||||||
if ((!selectPriority && cls == NULL) || self->player == NULL)
|
|
||||||
{
|
|
||||||
ACTION_RETURN_BOOL(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto weaponitem = self->FindInventory(cls);
|
|
||||||
|
|
||||||
if (weaponitem != NULL && weaponitem->IsKindOf(NAME_Weapon))
|
|
||||||
{
|
|
||||||
if (self->player->ReadyWeapon != weaponitem)
|
|
||||||
{
|
|
||||||
self->player->PendingWeapon = weaponitem;
|
|
||||||
}
|
|
||||||
ACTION_RETURN_BOOL(true);
|
|
||||||
}
|
|
||||||
else if (selectPriority)
|
|
||||||
{
|
|
||||||
// [XA] if the named weapon cannot be found (or is a dummy like 'None'),
|
|
||||||
// select the next highest priority weapon. This is basically
|
|
||||||
// the same as A_CheckReload minus the ammo check. Handy.
|
|
||||||
self->player->mo->PickNewWeapon(NULL);
|
|
||||||
ACTION_RETURN_BOOL(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ACTION_RETURN_BOOL(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//
|
//
|
||||||
// A_Print
|
// A_Print
|
||||||
//
|
//
|
||||||
|
|
|
@ -1067,7 +1067,7 @@ class Actor : Thinker native
|
||||||
native void A_QueueCorpse();
|
native void A_QueueCorpse();
|
||||||
native void A_DeQueueCorpse();
|
native void A_DeQueueCorpse();
|
||||||
native void A_ClearLastHeard();
|
native void A_ClearLastHeard();
|
||||||
native bool A_SelectWeapon(class<Weapon> whichweapon, int flags = 0);
|
|
||||||
native void A_ClassBossHealth();
|
native void A_ClassBossHealth();
|
||||||
native void A_SetAngle(double angle = 0, int flags = 0, int ptr = AAPTR_DEFAULT);
|
native void A_SetAngle(double angle = 0, int flags = 0, int ptr = AAPTR_DEFAULT);
|
||||||
native void A_SetPitch(double pitch, int flags = 0, int ptr = AAPTR_DEFAULT);
|
native void A_SetPitch(double pitch, int flags = 0, int ptr = AAPTR_DEFAULT);
|
||||||
|
|
|
@ -58,7 +58,7 @@ extend class Actor
|
||||||
// AActor :: GiveInventory
|
// AActor :: GiveInventory
|
||||||
//
|
//
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
bool GiveInventory(Class<Inventory> type, int amount, bool givecheat = false)
|
bool GiveInventory(Class<Inventory> type, int amount, bool givecheat = false)
|
||||||
{
|
{
|
||||||
bool result = true;
|
bool result = true;
|
||||||
|
@ -193,7 +193,7 @@ extend class Actor
|
||||||
|
|
||||||
if (item != null)
|
if (item != null)
|
||||||
{
|
{
|
||||||
// A_SetInventory sets the absolute amount.
|
// A_SetInventory sets the absolute amount.
|
||||||
// Subtract or set the appropriate amount as necessary.
|
// Subtract or set the appropriate amount as necessary.
|
||||||
|
|
||||||
if (amount == item.Amount)
|
if (amount == item.Amount)
|
||||||
|
@ -264,12 +264,12 @@ extend class Actor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!item.Use(false))
|
if (!item.Use(false))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sv_infiniteinventory)
|
if (sv_infiniteinventory)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -355,7 +355,7 @@ extend class Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
//
|
//
|
||||||
// AActor :: GiveAmmo
|
// AActor :: GiveAmmo
|
||||||
|
@ -413,7 +413,7 @@ extend class Actor
|
||||||
{
|
{
|
||||||
amount = 1;
|
amount = 1;
|
||||||
}
|
}
|
||||||
if (mi)
|
if (mi)
|
||||||
{
|
{
|
||||||
let item = Inventory(Spawn(mi));
|
let item = Inventory(Spawn(mi));
|
||||||
if (item == NULL)
|
if (item == NULL)
|
||||||
|
@ -446,7 +446,7 @@ extend class Actor
|
||||||
bool A_GiveInventory(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT)
|
bool A_GiveInventory(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT)
|
||||||
{
|
{
|
||||||
return DoGiveInventory(self, false, itemtype, amount, giveto);
|
return DoGiveInventory(self, false, itemtype, amount, giveto);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool A_GiveToTarget(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT)
|
bool A_GiveToTarget(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT)
|
||||||
{
|
{
|
||||||
|
@ -497,7 +497,7 @@ extend class Actor
|
||||||
bool DoTakeInventory(Actor receiver, bool orresult, class<Inventory> itemtype, int amount, int flags, int setreceiver = AAPTR_DEFAULT)
|
bool DoTakeInventory(Actor receiver, bool orresult, class<Inventory> itemtype, int amount, int flags, int setreceiver = AAPTR_DEFAULT)
|
||||||
{
|
{
|
||||||
int paramnum = 0;
|
int paramnum = 0;
|
||||||
|
|
||||||
if (itemtype == NULL)
|
if (itemtype == NULL)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -517,12 +517,12 @@ extend class Actor
|
||||||
bool A_TakeInventory(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT)
|
bool A_TakeInventory(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT)
|
||||||
{
|
{
|
||||||
return DoTakeInventory(self, false, itemtype, amount, flags, giveto);
|
return DoTakeInventory(self, false, itemtype, amount, flags, giveto);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool A_TakeFromTarget(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT)
|
bool A_TakeFromTarget(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT)
|
||||||
{
|
{
|
||||||
return DoTakeInventory(target, false, itemtype, amount, flags, giveto);
|
return DoTakeInventory(target, false, itemtype, amount, flags, giveto);
|
||||||
}
|
}
|
||||||
|
|
||||||
int A_TakeFromChildren(class<Inventory> itemtype, int amount = 0)
|
int A_TakeFromChildren(class<Inventory> itemtype, int amount = 0)
|
||||||
{
|
{
|
||||||
|
@ -564,7 +564,7 @@ extend class Actor
|
||||||
// A_SetInventory
|
// A_SetInventory
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
bool A_SetInventory(class<Inventory> itemtype, int amount, int ptr = AAPTR_DEFAULT, bool beyondMax = false)
|
bool A_SetInventory(class<Inventory> itemtype, int amount, int ptr = AAPTR_DEFAULT, bool beyondMax = false)
|
||||||
{
|
{
|
||||||
bool res = false;
|
bool res = false;
|
||||||
|
@ -600,7 +600,7 @@ extend class Actor
|
||||||
{
|
{
|
||||||
int style = sv_dropstyle;
|
int style = sv_dropstyle;
|
||||||
if (style==0) style = gameinfo.defaultdropstyle;
|
if (style==0) style = gameinfo.defaultdropstyle;
|
||||||
|
|
||||||
if (style==2)
|
if (style==2)
|
||||||
{
|
{
|
||||||
Vel.X += random2[DropItem](7);
|
Vel.X += random2[DropItem](7);
|
||||||
|
@ -614,7 +614,7 @@ extend class Actor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// PROC A_DropItem
|
// PROC A_DropItem
|
||||||
|
@ -730,8 +730,47 @@ extend class Actor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// A_SelectWeapon
|
||||||
}
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
bool A_SelectWeapon(class<Weapon> whichweapon, int flags = 0)
|
||||||
|
{
|
||||||
|
bool selectPriority = !!(flags & SWF_SELECTPRIORITY);
|
||||||
|
let player = self.player;
|
||||||
|
|
||||||
|
if ((!selectPriority && whichweapon == NULL) || player == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let weaponitem = Weapon(FindInventory(whichweapon));
|
||||||
|
|
||||||
|
if (weaponitem != NULL)
|
||||||
|
{
|
||||||
|
if (player.ReadyWeapon != weaponitem)
|
||||||
|
{
|
||||||
|
player.PendingWeapon = weaponitem;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (selectPriority)
|
||||||
|
{
|
||||||
|
// [XA] if the named weapon cannot be found (or is a dummy like 'None'),
|
||||||
|
// select the next highest priority weapon. This is basically
|
||||||
|
// the same as A_CheckReload minus the ammo check. Handy.
|
||||||
|
player.mo.PickNewWeapon(NULL);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue