mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-25 05:31:00 +00:00
- scriptified the WeaponGiver.
This commit is contained in:
parent
42f3ccc602
commit
6d3b26f94c
6 changed files with 100 additions and 128 deletions
|
@ -936,65 +936,6 @@ FState *AWeapon::GetStateForButtonName (FName button)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Weapon giver ***********************************************************/
|
|
||||||
|
|
||||||
IMPLEMENT_CLASS(AWeaponGiver, false, false)
|
|
||||||
|
|
||||||
DEFINE_FIELD(AWeaponGiver, DropAmmoFactor);
|
|
||||||
|
|
||||||
void AWeaponGiver::Serialize(FSerializer &arc)
|
|
||||||
{
|
|
||||||
Super::Serialize(arc);
|
|
||||||
auto def = (AWeaponGiver *)GetDefault();
|
|
||||||
arc("dropammofactor", DropAmmoFactor, def->DropAmmoFactor);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AWeaponGiver::TryPickup(AActor *&toucher)
|
|
||||||
{
|
|
||||||
DDropItem *di = GetDropItems();
|
|
||||||
AWeapon *weap;
|
|
||||||
|
|
||||||
if (di != NULL)
|
|
||||||
{
|
|
||||||
PClassWeapon *ti = dyn_cast<PClassWeapon>(PClass::FindClass(di->Name));
|
|
||||||
if (ti != NULL)
|
|
||||||
{
|
|
||||||
if (master == NULL)
|
|
||||||
{
|
|
||||||
master = weap = static_cast<AWeapon*>(Spawn(di->Name));
|
|
||||||
if (weap != NULL)
|
|
||||||
{
|
|
||||||
weap->ItemFlags &= ~IF_ALWAYSPICKUP; // use the flag of this item only.
|
|
||||||
weap->flags = (weap->flags & ~MF_DROPPED) | (this->flags & MF_DROPPED);
|
|
||||||
|
|
||||||
// If our ammo gives are non-negative, transfer them to the real weapon.
|
|
||||||
if (AmmoGive1 >= 0) weap->AmmoGive1 = AmmoGive1;
|
|
||||||
if (AmmoGive2 >= 0) weap->AmmoGive2 = AmmoGive2;
|
|
||||||
|
|
||||||
// If DropAmmoFactor is non-negative, modify the given ammo amounts.
|
|
||||||
if (DropAmmoFactor > 0)
|
|
||||||
{
|
|
||||||
weap->AmmoGive1 = int(weap->AmmoGive1 * DropAmmoFactor);
|
|
||||||
weap->AmmoGive2 = int(weap->AmmoGive2 * DropAmmoFactor);
|
|
||||||
}
|
|
||||||
weap->BecomeItem();
|
|
||||||
}
|
|
||||||
else return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
weap = barrier_cast<AWeapon*>(master);
|
|
||||||
bool res = weap->CallTryPickup(toucher);
|
|
||||||
if (res)
|
|
||||||
{
|
|
||||||
GoAwayAndDie();
|
|
||||||
master = NULL;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Weapon slots ***********************************************************/
|
/* Weapon slots ***********************************************************/
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -2079,48 +2020,3 @@ PClassWeapon *Net_ReadWeapon(BYTE **stream)
|
||||||
return Weapons_ntoh[index];
|
return Weapons_ntoh[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//
|
|
||||||
// A_ZoomFactor
|
|
||||||
//
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AWeapon, A_ZoomFactor)
|
|
||||||
{
|
|
||||||
PARAM_ACTION_PROLOGUE(AActor);
|
|
||||||
PARAM_FLOAT_DEF(zoom);
|
|
||||||
PARAM_INT_DEF(flags);
|
|
||||||
|
|
||||||
if (self->player != NULL && self->player->ReadyWeapon != NULL)
|
|
||||||
{
|
|
||||||
zoom = 1 / clamp(zoom, 0.1, 50.0);
|
|
||||||
if (flags & 1)
|
|
||||||
{ // Make the zoom instant.
|
|
||||||
self->player->FOV = float(self->player->DesiredFOV * zoom);
|
|
||||||
}
|
|
||||||
if (flags & 2)
|
|
||||||
{ // Disable pitch/yaw scaling.
|
|
||||||
zoom = -zoom;
|
|
||||||
}
|
|
||||||
self->player->ReadyWeapon->FOVScale = float(zoom);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
//
|
|
||||||
// A_SetCrosshair
|
|
||||||
//
|
|
||||||
//===========================================================================
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AWeapon, A_SetCrosshair)
|
|
||||||
{
|
|
||||||
PARAM_ACTION_PROLOGUE(AActor);
|
|
||||||
PARAM_INT(xhair);
|
|
||||||
|
|
||||||
if (self->player != NULL && self->player->ReadyWeapon != NULL)
|
|
||||||
{
|
|
||||||
self->player->ReadyWeapon->Crosshair = xhair;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -217,14 +217,3 @@ enum
|
||||||
WIF_BOT_BFG = 1<<28, // this is a BFG
|
WIF_BOT_BFG = 1<<28, // this is a BFG
|
||||||
};
|
};
|
||||||
|
|
||||||
class AWeaponGiver : public AWeapon
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (AWeaponGiver, AWeapon)
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual bool TryPickup(AActor *&toucher) override;
|
|
||||||
virtual void Serialize(FSerializer &arc) override;
|
|
||||||
|
|
||||||
double DropAmmoFactor;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
|
@ -185,6 +185,7 @@ xx(PuzzleItemNumber)
|
||||||
xx(HealthPickup)
|
xx(HealthPickup)
|
||||||
xx(autousemode)
|
xx(autousemode)
|
||||||
xx(Ammo)
|
xx(Ammo)
|
||||||
|
xx(WeaponGiver)
|
||||||
xx(PowerTargeter)
|
xx(PowerTargeter)
|
||||||
xx(PowerInvulnerable)
|
xx(PowerInvulnerable)
|
||||||
xx(PowerStrength)
|
xx(PowerStrength)
|
||||||
|
|
|
@ -3248,9 +3248,9 @@ void ModifyDropAmount(AInventory *inv, int dropamount)
|
||||||
inv->Amount = amount;
|
inv->Amount = amount;
|
||||||
inv->ItemFlags |= flagmask;
|
inv->ItemFlags |= flagmask;
|
||||||
}
|
}
|
||||||
else if (inv->IsKindOf (RUNTIME_CLASS(AWeaponGiver)))
|
else if (inv->IsKindOf (PClass::FindActor(NAME_WeaponGiver)))
|
||||||
{
|
{
|
||||||
static_cast<AWeaponGiver *>(inv)->DropAmmoFactor = dropammofactor;
|
inv->FloatVar("AmmoFactor") = dropammofactor;
|
||||||
inv->ItemFlags |= flagmask;
|
inv->ItemFlags |= flagmask;
|
||||||
}
|
}
|
||||||
else if (inv->IsKindOf (RUNTIME_CLASS(AWeapon)))
|
else if (inv->IsKindOf (RUNTIME_CLASS(AWeapon)))
|
||||||
|
|
|
@ -7,6 +7,9 @@ class Weapon : StateProvider native
|
||||||
EitherFire
|
EitherFire
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ZOOM_INSTANT = 1;
|
||||||
|
const ZOOM_NOSCALETURNING = 2;
|
||||||
|
|
||||||
native uint WeaponFlags;
|
native uint WeaponFlags;
|
||||||
native class<Ammo> AmmoType1, AmmoType2; // Types of ammo used by this weapon
|
native class<Ammo> AmmoType1, AmmoType2; // Types of ammo used by this weapon
|
||||||
native int AmmoGive1, AmmoGive2; // Amount of each ammo to get when picking up weapon
|
native int AmmoGive1, AmmoGive2; // Amount of each ammo to get when picking up weapon
|
||||||
|
@ -206,25 +209,108 @@ class Weapon : StateProvider native
|
||||||
player.ReadyWeapon.CheckAmmo (player.ReadyWeapon.bAltFire ? Weapon.AltFire : Weapon.PrimaryFire, true);
|
player.ReadyWeapon.CheckAmmo (player.ReadyWeapon.bAltFire ? Weapon.AltFire : Weapon.PrimaryFire, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
native action void A_ZoomFactor(double scale = 1, int flags = 0);
|
//
|
||||||
native action void A_SetCrosshair(int xhair);
|
// A_ZoomFactor
|
||||||
const ZOOM_INSTANT = 1;
|
//
|
||||||
const ZOOM_NOSCALETURNING = 2;
|
//===========================================================================
|
||||||
|
|
||||||
|
action void A_ZoomFactor(double zoom = 1, int flags = 0)
|
||||||
|
{
|
||||||
|
let player = self.player;
|
||||||
|
if (player != NULL && player.ReadyWeapon != NULL)
|
||||||
|
{
|
||||||
|
zoom = 1 / clamp(zoom, 0.1, 50.0);
|
||||||
|
if (flags & 1)
|
||||||
|
{ // Make the zoom instant.
|
||||||
|
self.player.FOV = self.player.DesiredFOV * zoom;
|
||||||
|
}
|
||||||
|
if (flags & 2)
|
||||||
|
{ // Disable pitch/yaw scaling.
|
||||||
|
zoom = -zoom;
|
||||||
|
}
|
||||||
|
self.player.ReadyWeapon.FOVScale = zoom;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
// A_SetCrosshair
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
action void A_SetCrosshair(int xhair)
|
||||||
|
{
|
||||||
|
let player = self.player;
|
||||||
|
if (player != NULL && player.ReadyWeapon != NULL)
|
||||||
|
{
|
||||||
|
player.ReadyWeapon.Crosshair = xhair;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class WeaponGiver : Weapon native
|
class WeaponGiver : Weapon
|
||||||
{
|
{
|
||||||
|
double AmmoFactor;
|
||||||
native double DropAmmoFactor;
|
|
||||||
|
|
||||||
Default
|
Default
|
||||||
{
|
{
|
||||||
Weapon.AmmoGive1 -1;
|
Weapon.AmmoGive1 -1;
|
||||||
Weapon.AmmoGive2 -1;
|
Weapon.AmmoGive2 -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override bool TryPickup(in out Actor toucher)
|
||||||
|
{
|
||||||
|
DropItem di = GetDropItems();
|
||||||
|
Weapon weap;
|
||||||
|
|
||||||
|
if (di != NULL)
|
||||||
|
{
|
||||||
|
Class<Weapon> ti = di.Name;
|
||||||
|
if (ti != NULL)
|
||||||
|
{
|
||||||
|
if (master == NULL)
|
||||||
|
{
|
||||||
|
// save the spawned weapon in 'master' to avoid constant respawning if it cannot be picked up.
|
||||||
|
master = weap = Weapon(Spawn(di.Name));
|
||||||
|
if (weap != NULL)
|
||||||
|
{
|
||||||
|
weap.bAlwaysPickup = false; // use the flag of this item only.
|
||||||
|
weap.bDropped = bDropped;
|
||||||
|
|
||||||
|
// If our ammo gives are non-negative, transfer them to the real weapon.
|
||||||
|
if (AmmoGive1 >= 0) weap.AmmoGive1 = AmmoGive1;
|
||||||
|
if (AmmoGive2 >= 0) weap.AmmoGive2 = AmmoGive2;
|
||||||
|
|
||||||
|
// If AmmoFactor is non-negative, modify the given ammo amounts.
|
||||||
|
if (AmmoFactor > 0)
|
||||||
|
{
|
||||||
|
weap.AmmoGive1 = int(weap.AmmoGive1 * AmmoFactor);
|
||||||
|
weap.AmmoGive2 = int(weap.AmmoGive2 * AmmoFactor);
|
||||||
|
}
|
||||||
|
weap.BecomeItem();
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
weap = Weapon(master);
|
||||||
|
bool res = false;
|
||||||
|
if (weap != null)
|
||||||
|
{
|
||||||
|
res = weap.CallTryPickup(toucher);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
GoAwayAndDie();
|
||||||
|
master = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct WeaponSlots native
|
struct WeaponSlots native
|
||||||
|
|
|
@ -212,7 +212,7 @@ struct PlayerInfo native // this is what internally is known as player_t
|
||||||
native uint original_oldbuttons;
|
native uint original_oldbuttons;
|
||||||
native readonly Class<PlayerPawn> cls;
|
native readonly Class<PlayerPawn> cls;
|
||||||
native float DesiredFOV;
|
native float DesiredFOV;
|
||||||
native readonly float FOV;
|
native float FOV;
|
||||||
native double viewz;
|
native double viewz;
|
||||||
native double viewheight;
|
native double viewheight;
|
||||||
native double deltaviewheight;
|
native double deltaviewheight;
|
||||||
|
|
Loading…
Reference in a new issue