mirror of
https://github.com/ZDoom/gzdoom-last-svn.git
synced 2025-05-31 01:10:52 +00:00
* Updated to ZDoom 4191:
- Allow negative force for A_RadiusThrust. - Added flags SXF_CLEARCALLERTID, SXF_MULTIPLYSPEED, and SXF_TRANSFERSCALE for A_SpawnItemEx. - Use a missile's MaxTargetRange property as the range for P_AimLineAttack() inside P_SpawnPlayerMissile(). - Make teleport fogs target the teleported actor. - Added spawnofs_z parameter to A_RailAttack and A_CustomRailgun. git-svn-id: http://mancubus.net/svn/hosted/gzdoom/trunk@1542 b0f79afe-0144-0410-b225-9a4edf0717df
This commit is contained in:
parent
41fcb6e0a8
commit
0d06d764a9
10 changed files with 169 additions and 120 deletions
|
@ -467,7 +467,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_FirePlasma)
|
||||||
//
|
//
|
||||||
// [RH] A_FireRailgun
|
// [RH] A_FireRailgun
|
||||||
//
|
//
|
||||||
static void FireRailgun(AActor *self, int RailOffset)
|
static void FireRailgun(AActor *self, int offset_xy)
|
||||||
{
|
{
|
||||||
int damage;
|
int damage;
|
||||||
player_t *player;
|
player_t *player;
|
||||||
|
@ -492,7 +492,7 @@ static void FireRailgun(AActor *self, int RailOffset)
|
||||||
|
|
||||||
damage = deathmatch ? 100 : 150;
|
damage = deathmatch ? 100 : 150;
|
||||||
|
|
||||||
P_RailAttack (self, damage, RailOffset);
|
P_RailAttack (self, damage, offset_xy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -469,7 +469,7 @@ void P_TraceBleed (int damage, AActor *target); // random direction version
|
||||||
bool P_HitFloor (AActor *thing);
|
bool P_HitFloor (AActor *thing);
|
||||||
bool P_HitWater (AActor *thing, sector_t *sec, fixed_t splashx = FIXED_MIN, fixed_t splashy = FIXED_MIN, fixed_t splashz=FIXED_MIN, bool checkabove = false, bool alert = true);
|
bool P_HitWater (AActor *thing, sector_t *sec, fixed_t splashx = FIXED_MIN, fixed_t splashy = FIXED_MIN, fixed_t splashz=FIXED_MIN, bool checkabove = false, bool alert = true);
|
||||||
void P_CheckSplash(AActor *self, fixed_t distance);
|
void P_CheckSplash(AActor *self, fixed_t distance);
|
||||||
void P_RailAttack (AActor *source, int damage, int offset, int color1 = 0, int color2 = 0, float maxdiff = 0, int flags = 0, const PClass *puff = NULL, angle_t angleoffset = 0, angle_t pitchoffset = 0, fixed_t distance = 8192*FRACUNIT, int duration = 0, float sparsity = 1.0, float drift = 1.0, const PClass *spawnclass = NULL); // [RH] Shoot a railgun
|
void P_RailAttack (AActor *source, int damage, int offset_xy, fixed_t offset_z = 0, int color1 = 0, int color2 = 0, float maxdiff = 0, int flags = 0, const PClass *puff = NULL, angle_t angleoffset = 0, angle_t pitchoffset = 0, fixed_t distance = 8192*FRACUNIT, int duration = 0, float sparsity = 1.0, float drift = 1.0, const PClass *spawnclass = NULL); // [RH] Shoot a railgun
|
||||||
|
|
||||||
enum // P_RailAttack / A_RailAttack / A_CustomRailgun / P_DrawRailTrail flags
|
enum // P_RailAttack / A_RailAttack / A_CustomRailgun / P_DrawRailTrail flags
|
||||||
{
|
{
|
||||||
|
|
|
@ -3942,7 +3942,7 @@ static bool ProcessNoPierceRailHit (FTraceResults &res)
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
void P_RailAttack (AActor *source, int damage, int offset, int color1, int color2, float maxdiff, int railflags, const PClass *puffclass, angle_t angleoffset, angle_t pitchoffset, fixed_t distance, int duration, float sparsity, float drift, const PClass *spawnclass)
|
void P_RailAttack (AActor *source, int damage, int offset_xy, fixed_t offset_z, int color1, int color2, float maxdiff, int railflags, const PClass *puffclass, angle_t angleoffset, angle_t pitchoffset, fixed_t distance, int duration, float sparsity, float drift, const PClass *spawnclass)
|
||||||
{
|
{
|
||||||
fixed_t vx, vy, vz;
|
fixed_t vx, vy, vz;
|
||||||
angle_t angle, pitch;
|
angle_t angle, pitch;
|
||||||
|
@ -3963,7 +3963,7 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
|
||||||
x1 = source->x;
|
x1 = source->x;
|
||||||
y1 = source->y;
|
y1 = source->y;
|
||||||
|
|
||||||
shootz = source->z - source->floorclip + (source->height >> 1);
|
shootz = source->z - source->floorclip + (source->height >> 1) + offset_z;
|
||||||
|
|
||||||
if (!(railflags & RAF_CENTERZ))
|
if (!(railflags & RAF_CENTERZ))
|
||||||
{
|
{
|
||||||
|
@ -3978,8 +3978,8 @@ void P_RailAttack (AActor *source, int damage, int offset, int color1, int color
|
||||||
}
|
}
|
||||||
|
|
||||||
angle = ((source->angle + angleoffset) - ANG90) >> ANGLETOFINESHIFT;
|
angle = ((source->angle + angleoffset) - ANG90) >> ANGLETOFINESHIFT;
|
||||||
x1 += offset*finecosine[angle];
|
x1 += offset_xy * finecosine[angle];
|
||||||
y1 += offset*finesine[angle];
|
y1 += offset_xy * finesine[angle];
|
||||||
|
|
||||||
RailHits.Clear ();
|
RailHits.Clear ();
|
||||||
start.X = FIXED2FLOAT(x1);
|
start.X = FIXED2FLOAT(x1);
|
||||||
|
@ -4478,7 +4478,7 @@ void P_RadiusAttack (AActor *bombspot, AActor *bombsource, int bombdamage, int b
|
||||||
AActor *thing;
|
AActor *thing;
|
||||||
|
|
||||||
if (flags & RADF_SOURCEISSPOT)
|
if (flags & RADF_SOURCEISSPOT)
|
||||||
{ // The source is actually the same as the spot, even if that wasn't what we receized.
|
{ // The source is actually the same as the spot, even if that wasn't what we received.
|
||||||
bombsource = bombspot;
|
bombsource = bombspot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4567,11 +4567,12 @@ void P_RadiusAttack (AActor *bombspot, AActor *bombsource, int bombdamage, int b
|
||||||
}
|
}
|
||||||
points *= thing->GetClass()->Meta.GetMetaFixed(AMETA_RDFactor, FRACUNIT)/(double)FRACUNIT;
|
points *= thing->GetClass()->Meta.GetMetaFixed(AMETA_RDFactor, FRACUNIT)/(double)FRACUNIT;
|
||||||
|
|
||||||
if (points > 0.f && P_CheckSight (thing, bombspot, SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY))
|
// points and bombdamage should be the same sign
|
||||||
|
if ((points * bombdamage) > 0 && P_CheckSight (thing, bombspot, SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY))
|
||||||
{ // OK to damage; target is in direct path
|
{ // OK to damage; target is in direct path
|
||||||
double velz;
|
double velz;
|
||||||
double thrust;
|
double thrust;
|
||||||
int damage = (int)points;
|
int damage = abs((int)points);
|
||||||
int newdam = damage;
|
int newdam = damage;
|
||||||
|
|
||||||
if (!(flags & RADF_NODAMAGE))
|
if (!(flags & RADF_NODAMAGE))
|
||||||
|
|
|
@ -5619,11 +5619,11 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
|
||||||
bool nofreeaim)
|
bool nofreeaim)
|
||||||
{
|
{
|
||||||
static const int angdiff[3] = { -1<<26, 1<<26, 0 };
|
static const int angdiff[3] = { -1<<26, 1<<26, 0 };
|
||||||
int i;
|
|
||||||
angle_t an = angle;
|
angle_t an = angle;
|
||||||
angle_t pitch;
|
angle_t pitch;
|
||||||
AActor *linetarget;
|
AActor *linetarget;
|
||||||
int vrange = nofreeaim? ANGLE_1*35 : 0;
|
AActor *defaultobject = GetDefaultByType(type);
|
||||||
|
int vrange = nofreeaim ? ANGLE_1*35 : 0;
|
||||||
|
|
||||||
if (source && source->player && source->player->ReadyWeapon && (source->player->ReadyWeapon->WeaponFlags & WIF_NOAUTOAIM))
|
if (source && source->player && source->player->ReadyWeapon && (source->player->ReadyWeapon->WeaponFlags & WIF_NOAUTOAIM))
|
||||||
{
|
{
|
||||||
|
@ -5634,11 +5634,16 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
|
||||||
}
|
}
|
||||||
else // see which target is to be aimed at
|
else // see which target is to be aimed at
|
||||||
{
|
{
|
||||||
i = 2;
|
// [XA] If MaxTargetRange is defined in the spawned projectile, use this as the
|
||||||
|
// maximum range for the P_AimLineAttack call later; this allows MaxTargetRange
|
||||||
|
// to function as a "maximum tracer-acquisition range" for seeker missiles.
|
||||||
|
fixed_t linetargetrange = defaultobject->maxtargetrange > 0 ? defaultobject->maxtargetrange*64 : 16*64*FRACUNIT;
|
||||||
|
|
||||||
|
int i = 2;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
an = angle + angdiff[i];
|
an = angle + angdiff[i];
|
||||||
pitch = P_AimLineAttack (source, an, 16*64*FRACUNIT, &linetarget, vrange);
|
pitch = P_AimLineAttack (source, an, linetargetrange, &linetarget, vrange);
|
||||||
|
|
||||||
if (source->player != NULL &&
|
if (source->player != NULL &&
|
||||||
!nofreeaim &&
|
!nofreeaim &&
|
||||||
|
@ -5660,8 +5665,6 @@ AActor *P_SpawnPlayerMissile (AActor *source, fixed_t x, fixed_t y, fixed_t z,
|
||||||
}
|
}
|
||||||
if (pLineTarget) *pLineTarget = linetarget;
|
if (pLineTarget) *pLineTarget = linetarget;
|
||||||
|
|
||||||
i = GetDefaultByType (type)->flags3;
|
|
||||||
|
|
||||||
if (z != ONFLOORZ && z != ONCEILINGZ)
|
if (z != ONFLOORZ && z != ONCEILINGZ)
|
||||||
{
|
{
|
||||||
// Doom spawns missiles 4 units lower than hitscan attacks for players.
|
// Doom spawns missiles 4 units lower than hitscan attacks for players.
|
||||||
|
|
|
@ -184,14 +184,16 @@ bool P_Teleport (AActor *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
|
||||||
if (sourceFog)
|
if (sourceFog)
|
||||||
{
|
{
|
||||||
fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT;
|
fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT;
|
||||||
Spawn<ATeleportFog> (oldx, oldy, oldz + fogDelta, ALLOW_REPLACE);
|
AActor *fog = Spawn<ATeleportFog> (oldx, oldy, oldz + fogDelta, ALLOW_REPLACE);
|
||||||
|
fog->target = thing;
|
||||||
}
|
}
|
||||||
if (useFog)
|
if (useFog)
|
||||||
{
|
{
|
||||||
fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT;
|
fixed_t fogDelta = thing->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT;
|
||||||
an = angle >> ANGLETOFINESHIFT;
|
an = angle >> ANGLETOFINESHIFT;
|
||||||
Spawn<ATeleportFog> (x + 20*finecosine[an],
|
AActor *fog = Spawn<ATeleportFog> (x + 20*finecosine[an],
|
||||||
y + 20*finesine[an], thing->z + fogDelta, ALLOW_REPLACE);
|
y + 20*finesine[an], thing->z + fogDelta, ALLOW_REPLACE);
|
||||||
|
fog->target = thing;
|
||||||
if (thing->player)
|
if (thing->player)
|
||||||
{
|
{
|
||||||
// [RH] Zoom player's field of vision
|
// [RH] Zoom player's field of vision
|
||||||
|
|
|
@ -3,5 +3,5 @@
|
||||||
// This file was automatically generated by the
|
// This file was automatically generated by the
|
||||||
// updaterevision tool. Do not edit by hand.
|
// updaterevision tool. Do not edit by hand.
|
||||||
|
|
||||||
#define ZD_SVN_REVISION_STRING "4186"
|
#define ZD_SVN_REVISION_STRING "4191"
|
||||||
#define ZD_SVN_REVISION_NUMBER 4186
|
#define ZD_SVN_REVISION_NUMBER 4191
|
||||||
|
|
|
@ -838,8 +838,8 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RadiusThrust)
|
||||||
|
|
||||||
bool sourcenothrust = false;
|
bool sourcenothrust = false;
|
||||||
|
|
||||||
if (force <= 0) force = 128;
|
if (force == 0) force = 128;
|
||||||
if (distance <= 0) distance = force;
|
if (distance <= 0) distance = abs(force);
|
||||||
|
|
||||||
// Temporarily negate MF2_NODMGTHRUST on the shooter, since it renders this function useless.
|
// Temporarily negate MF2_NODMGTHRUST on the shooter, since it renders this function useless.
|
||||||
if (!(flags & RTF_NOTMISSILE) && self->target != NULL && self->target->flags2 & MF2_NODMGTHRUST)
|
if (!(flags & RTF_NOTMISSILE) && self->target != NULL && self->target->flags2 & MF2_NODMGTHRUST)
|
||||||
|
@ -847,7 +847,6 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RadiusThrust)
|
||||||
sourcenothrust = true;
|
sourcenothrust = true;
|
||||||
self->target->flags2 &= ~MF2_NODMGTHRUST;
|
self->target->flags2 &= ~MF2_NODMGTHRUST;
|
||||||
}
|
}
|
||||||
int sourceflags2 = self->target != NULL ? self->target->flags2 : 0;
|
|
||||||
|
|
||||||
P_RadiusAttack (self, self->target, force, distance, self->DamageType, flags | RADF_NODAMAGE, fullthrustdistance);
|
P_RadiusAttack (self, self->target, force, distance, self->DamageType, flags | RADF_NODAMAGE, fullthrustdistance);
|
||||||
P_CheckSplash(self, distance << FRACBITS);
|
P_CheckSplash(self, distance << FRACBITS);
|
||||||
|
@ -1430,7 +1429,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomPunch)
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RailAttack)
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RailAttack)
|
||||||
{
|
{
|
||||||
ACTION_PARAM_START(15);
|
ACTION_PARAM_START(16);
|
||||||
ACTION_PARAM_INT(Damage, 0);
|
ACTION_PARAM_INT(Damage, 0);
|
||||||
ACTION_PARAM_INT(Spawnofs_XY, 1);
|
ACTION_PARAM_INT(Spawnofs_XY, 1);
|
||||||
ACTION_PARAM_BOOL(UseAmmo, 2);
|
ACTION_PARAM_BOOL(UseAmmo, 2);
|
||||||
|
@ -1446,6 +1445,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RailAttack)
|
||||||
ACTION_PARAM_FLOAT(Sparsity, 12);
|
ACTION_PARAM_FLOAT(Sparsity, 12);
|
||||||
ACTION_PARAM_FLOAT(DriftSpeed, 13);
|
ACTION_PARAM_FLOAT(DriftSpeed, 13);
|
||||||
ACTION_PARAM_CLASS(SpawnClass, 14);
|
ACTION_PARAM_CLASS(SpawnClass, 14);
|
||||||
|
ACTION_PARAM_FIXED(Spawnofs_Z, 15);
|
||||||
|
|
||||||
if(Range==0) Range=8192*FRACUNIT;
|
if(Range==0) Range=8192*FRACUNIT;
|
||||||
if(Sparsity==0) Sparsity=1.0;
|
if(Sparsity==0) Sparsity=1.0;
|
||||||
|
@ -1474,7 +1474,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_RailAttack)
|
||||||
slope = pr_crailgun.Random2() * (Spread_Z / 255);
|
slope = pr_crailgun.Random2() * (Spread_Z / 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
P_RailAttack (self, Damage, Spawnofs_XY, Color1, Color2, MaxDiff, Flags, PuffType, angle, slope, Range, Duration, Sparsity, DriftSpeed, SpawnClass);
|
P_RailAttack (self, Damage, Spawnofs_XY, Spawnofs_Z, Color1, Color2, MaxDiff, Flags, PuffType, angle, slope, Range, Duration, Sparsity, DriftSpeed, SpawnClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -1492,7 +1492,7 @@ enum
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomRailgun)
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomRailgun)
|
||||||
{
|
{
|
||||||
ACTION_PARAM_START(15);
|
ACTION_PARAM_START(16);
|
||||||
ACTION_PARAM_INT(Damage, 0);
|
ACTION_PARAM_INT(Damage, 0);
|
||||||
ACTION_PARAM_INT(Spawnofs_XY, 1);
|
ACTION_PARAM_INT(Spawnofs_XY, 1);
|
||||||
ACTION_PARAM_COLOR(Color1, 2);
|
ACTION_PARAM_COLOR(Color1, 2);
|
||||||
|
@ -1508,6 +1508,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomRailgun)
|
||||||
ACTION_PARAM_FLOAT(Sparsity, 12);
|
ACTION_PARAM_FLOAT(Sparsity, 12);
|
||||||
ACTION_PARAM_FLOAT(DriftSpeed, 13);
|
ACTION_PARAM_FLOAT(DriftSpeed, 13);
|
||||||
ACTION_PARAM_CLASS(SpawnClass, 14);
|
ACTION_PARAM_CLASS(SpawnClass, 14);
|
||||||
|
ACTION_PARAM_FIXED(Spawnofs_Z, 15);
|
||||||
|
|
||||||
if(Range==0) Range=8192*FRACUNIT;
|
if(Range==0) Range=8192*FRACUNIT;
|
||||||
if(Sparsity==0) Sparsity=1.0;
|
if(Sparsity==0) Sparsity=1.0;
|
||||||
|
@ -1591,7 +1592,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_CustomRailgun)
|
||||||
slopeoffset = pr_crailgun.Random2() * (Spread_Z / 255);
|
slopeoffset = pr_crailgun.Random2() * (Spread_Z / 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
P_RailAttack (self, Damage, Spawnofs_XY, Color1, Color2, MaxDiff, Flags, PuffType, angleoffset, slopeoffset, Range, Duration, Sparsity, DriftSpeed, SpawnClass);
|
P_RailAttack (self, Damage, Spawnofs_XY, Spawnofs_Z, Color1, Color2, MaxDiff, Flags, PuffType, angleoffset, slopeoffset, Range, Duration, Sparsity, DriftSpeed, SpawnClass);
|
||||||
|
|
||||||
self->x = saved_x;
|
self->x = saved_x;
|
||||||
self->y = saved_y;
|
self->y = saved_y;
|
||||||
|
@ -1717,102 +1718,127 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_TakeFromTarget)
|
||||||
// Common code for A_SpawnItem and A_SpawnItemEx
|
// Common code for A_SpawnItem and A_SpawnItemEx
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
enum SIX_Flags
|
enum SIX_Flags
|
||||||
{
|
{
|
||||||
SIXF_TRANSFERTRANSLATION=1,
|
SIXF_TRANSFERTRANSLATION = 1 << 0,
|
||||||
SIXF_ABSOLUTEPOSITION=2,
|
SIXF_ABSOLUTEPOSITION = 1 << 1,
|
||||||
SIXF_ABSOLUTEANGLE=4,
|
SIXF_ABSOLUTEANGLE = 1 << 2,
|
||||||
SIXF_ABSOLUTEVELOCITY=8,
|
SIXF_ABSOLUTEVELOCITY = 1 << 3,
|
||||||
SIXF_SETMASTER=16,
|
SIXF_SETMASTER = 1 << 4,
|
||||||
SIXF_NOCHECKPOSITION=32,
|
SIXF_NOCHECKPOSITION = 1 << 5,
|
||||||
SIXF_TELEFRAG=64,
|
SIXF_TELEFRAG = 1 << 6,
|
||||||
// 128 is used by Skulltag!
|
SIXF_CLIENTSIDE = 1 << 7, // only used by Skulldronum
|
||||||
SIXF_TRANSFERAMBUSHFLAG=256,
|
SIXF_TRANSFERAMBUSHFLAG = 1 << 8,
|
||||||
SIXF_TRANSFERPITCH=512,
|
SIXF_TRANSFERPITCH = 1 << 9,
|
||||||
SIXF_TRANSFERPOINTERS=1024,
|
SIXF_TRANSFERPOINTERS = 1 << 10,
|
||||||
SIXF_USEBLOODCOLOR=2048,
|
SIXF_USEBLOODCOLOR = 1 << 11,
|
||||||
|
SIXF_CLEARCALLERTID = 1 << 12,
|
||||||
|
SIXF_MULTIPLYSPEED = 1 << 13,
|
||||||
|
SIXF_TRANSFERSCALE = 1 << 14,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static bool InitSpawnedItem(AActor *self, AActor *mo, int flags)
|
static bool InitSpawnedItem(AActor *self, AActor *mo, int flags)
|
||||||
{
|
{
|
||||||
if (mo)
|
if (mo == NULL)
|
||||||
{
|
{
|
||||||
AActor * originator = self;
|
return false;
|
||||||
|
}
|
||||||
|
AActor *originator = self;
|
||||||
|
|
||||||
if (!(mo->flags2 & MF2_DONTTRANSLATE))
|
if (!(mo->flags2 & MF2_DONTTRANSLATE))
|
||||||
|
{
|
||||||
|
if (flags & SIXF_TRANSFERTRANSLATION)
|
||||||
{
|
{
|
||||||
if (flags & SIXF_TRANSFERTRANSLATION)
|
mo->Translation = self->Translation;
|
||||||
{
|
|
||||||
mo->Translation = self->Translation;
|
|
||||||
}
|
|
||||||
else if (flags & SIXF_USEBLOODCOLOR)
|
|
||||||
{
|
|
||||||
// [XA] Use the spawning actor's BloodColor to translate the newly-spawned object.
|
|
||||||
PalEntry bloodcolor = self->GetBloodColor();
|
|
||||||
mo->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (flags & SIXF_TRANSFERPOINTERS)
|
else if (flags & SIXF_USEBLOODCOLOR)
|
||||||
{
|
{
|
||||||
mo->target = self->target;
|
// [XA] Use the spawning actor's BloodColor to translate the newly-spawned object.
|
||||||
mo->master = self->master; // This will be overridden later if SIXF_SETMASTER is set
|
PalEntry bloodcolor = self->GetBloodColor();
|
||||||
mo->tracer = self->tracer;
|
mo->Translation = TRANSLATION(TRANSLATION_Blood, bloodcolor.a);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (flags & SIXF_TRANSFERPOINTERS)
|
||||||
|
{
|
||||||
|
mo->target = self->target;
|
||||||
|
mo->master = self->master; // This will be overridden later if SIXF_SETMASTER is set
|
||||||
|
mo->tracer = self->tracer;
|
||||||
|
}
|
||||||
|
|
||||||
mo->angle=self->angle;
|
mo->angle = self->angle;
|
||||||
if (flags & SIXF_TRANSFERPITCH) mo->pitch = self->pitch;
|
if (flags & SIXF_TRANSFERPITCH)
|
||||||
while (originator && originator->isMissile()) originator = originator->target;
|
{
|
||||||
|
mo->pitch = self->pitch;
|
||||||
|
}
|
||||||
|
while (originator && originator->isMissile())
|
||||||
|
{
|
||||||
|
originator = originator->target;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & SIXF_TELEFRAG)
|
if (flags & SIXF_TELEFRAG)
|
||||||
|
{
|
||||||
|
P_TeleportMove(mo, mo->x, mo->y, mo->z, true);
|
||||||
|
// This is needed to ensure consistent behavior.
|
||||||
|
// Otherwise it will only spawn if nothing gets telefragged
|
||||||
|
flags |= SIXF_NOCHECKPOSITION;
|
||||||
|
}
|
||||||
|
if (mo->flags3 & MF3_ISMONSTER)
|
||||||
|
{
|
||||||
|
if (!(flags & SIXF_NOCHECKPOSITION) && !P_TestMobjLocation(mo))
|
||||||
{
|
{
|
||||||
P_TeleportMove(mo, mo->x, mo->y, mo->z, true);
|
// The monster is blocked so don't spawn it at all!
|
||||||
// This is needed to ensure consistent behavior.
|
mo->ClearCounters();
|
||||||
// Otherwise it will only spawn if nothing gets telefragged
|
mo->Destroy();
|
||||||
flags |= SIXF_NOCHECKPOSITION;
|
return false;
|
||||||
}
|
}
|
||||||
if (mo->flags3&MF3_ISMONSTER)
|
else if (originator)
|
||||||
{
|
{
|
||||||
if (!(flags&SIXF_NOCHECKPOSITION) && !P_TestMobjLocation(mo))
|
if (originator->flags3 & MF3_ISMONSTER)
|
||||||
{
|
{
|
||||||
// The monster is blocked so don't spawn it at all!
|
// If this is a monster transfer all friendliness information
|
||||||
mo->ClearCounters();
|
mo->CopyFriendliness(originator, true);
|
||||||
mo->Destroy();
|
if (flags & SIXF_SETMASTER) mo->master = originator; // don't let it attack you (optional)!
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
else if (originator)
|
else if (originator->player)
|
||||||
{
|
{
|
||||||
if (originator->flags3&MF3_ISMONSTER)
|
// A player always spawns a monster friendly to him
|
||||||
|
mo->flags |= MF_FRIENDLY;
|
||||||
|
mo->SetFriendPlayer(originator->player);
|
||||||
|
|
||||||
|
AActor * attacker=originator->player->attacker;
|
||||||
|
if (attacker)
|
||||||
{
|
{
|
||||||
// If this is a monster transfer all friendliness information
|
if (!(attacker->flags&MF_FRIENDLY) ||
|
||||||
mo->CopyFriendliness(originator, true);
|
(deathmatch && attacker->FriendPlayer!=0 && attacker->FriendPlayer!=mo->FriendPlayer))
|
||||||
if (flags&SIXF_SETMASTER) mo->master = originator; // don't let it attack you (optional)!
|
|
||||||
}
|
|
||||||
else if (originator->player)
|
|
||||||
{
|
|
||||||
// A player always spawns a monster friendly to him
|
|
||||||
mo->flags |= MF_FRIENDLY;
|
|
||||||
mo->SetFriendPlayer(originator->player);
|
|
||||||
|
|
||||||
AActor * attacker=originator->player->attacker;
|
|
||||||
if (attacker)
|
|
||||||
{
|
{
|
||||||
if (!(attacker->flags&MF_FRIENDLY) ||
|
// Target the monster which last attacked the player
|
||||||
(deathmatch && attacker->FriendPlayer!=0 && attacker->FriendPlayer!=mo->FriendPlayer))
|
mo->LastHeard = mo->target = attacker;
|
||||||
{
|
|
||||||
// Target the monster which last attacked the player
|
|
||||||
mo->LastHeard = mo->target = attacker;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!(flags & SIXF_TRANSFERPOINTERS))
|
|
||||||
{
|
|
||||||
// If this is a missile or something else set the target to the originator
|
|
||||||
mo->target=originator? originator : self;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else if (!(flags & SIXF_TRANSFERPOINTERS))
|
||||||
|
{
|
||||||
|
// If this is a missile or something else set the target to the originator
|
||||||
|
mo->target = originator ? originator : self;
|
||||||
|
}
|
||||||
|
if (flags & SIXF_TRANSFERSCALE)
|
||||||
|
{
|
||||||
|
mo->scaleX = self->scaleX;
|
||||||
|
mo->scaleY = self->scaleY;
|
||||||
|
}
|
||||||
|
if (flags & SIXF_TRANSFERAMBUSHFLAG)
|
||||||
|
{
|
||||||
|
mo->flags = (mo->flags & ~MF_AMBUSH) | (self->flags & MF_AMBUSH);
|
||||||
|
}
|
||||||
|
if (flags & SIXF_CLEARCALLERTID)
|
||||||
|
{
|
||||||
|
self->RemoveFromHash();
|
||||||
|
self->tid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1862,7 +1888,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnItem)
|
||||||
self->y + FixedMul(distance, finesine[self->angle>>ANGLETOFINESHIFT]),
|
self->y + FixedMul(distance, finesine[self->angle>>ANGLETOFINESHIFT]),
|
||||||
self->z - self->floorclip + self->GetBobOffset() + zheight, ALLOW_REPLACE);
|
self->z - self->floorclip + self->GetBobOffset() + zheight, ALLOW_REPLACE);
|
||||||
|
|
||||||
int flags = (transfer_translation? SIXF_TRANSFERTRANSLATION:0) + (useammo? SIXF_SETMASTER:0);
|
int flags = (transfer_translation ? SIXF_TRANSFERTRANSLATION : 0) + (useammo ? SIXF_SETMASTER : 0);
|
||||||
bool res = InitSpawnedItem(self, mo, flags);
|
bool res = InitSpawnedItem(self, mo, flags);
|
||||||
ACTION_SET_RESULT(res); // for an inventory item's use state
|
ACTION_SET_RESULT(res); // for an inventory item's use state
|
||||||
}
|
}
|
||||||
|
@ -1876,7 +1902,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnItem)
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnItemEx)
|
DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnItemEx)
|
||||||
{
|
{
|
||||||
ACTION_PARAM_START(10);
|
ACTION_PARAM_START(11);
|
||||||
ACTION_PARAM_CLASS(missile, 0);
|
ACTION_PARAM_CLASS(missile, 0);
|
||||||
ACTION_PARAM_FIXED(xofs, 1);
|
ACTION_PARAM_FIXED(xofs, 1);
|
||||||
ACTION_PARAM_FIXED(yofs, 2);
|
ACTION_PARAM_FIXED(yofs, 2);
|
||||||
|
@ -1887,6 +1913,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnItemEx)
|
||||||
ACTION_PARAM_ANGLE(Angle, 7);
|
ACTION_PARAM_ANGLE(Angle, 7);
|
||||||
ACTION_PARAM_INT(flags, 8);
|
ACTION_PARAM_INT(flags, 8);
|
||||||
ACTION_PARAM_INT(chance, 9);
|
ACTION_PARAM_INT(chance, 9);
|
||||||
|
ACTION_PARAM_INT(tid, 10);
|
||||||
|
|
||||||
if (!missile)
|
if (!missile)
|
||||||
{
|
{
|
||||||
|
@ -1929,17 +1956,30 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SpawnItemEx)
|
||||||
xvel = newxvel;
|
xvel = newxvel;
|
||||||
}
|
}
|
||||||
|
|
||||||
AActor * mo = Spawn(missile, x, y, self->z - self->floorclip + self->GetBobOffset() + zofs, ALLOW_REPLACE);
|
AActor *mo = Spawn(missile, x, y, self->z - self->floorclip + self->GetBobOffset() + zofs, ALLOW_REPLACE);
|
||||||
bool res = InitSpawnedItem(self, mo, flags);
|
bool res = InitSpawnedItem(self, mo, flags);
|
||||||
ACTION_SET_RESULT(res); // for an inventory item's use state
|
ACTION_SET_RESULT(res); // for an inventory item's use state
|
||||||
if (mo)
|
if (res)
|
||||||
{
|
{
|
||||||
mo->velx = xvel;
|
if (tid != 0)
|
||||||
mo->vely = yvel;
|
{
|
||||||
mo->velz = zvel;
|
assert(mo->tid == 0);
|
||||||
|
mo->tid = tid;
|
||||||
|
mo->AddToHash();
|
||||||
|
}
|
||||||
|
if (flags & SIXF_MULTIPLYSPEED)
|
||||||
|
{
|
||||||
|
mo->velx = FixedMul(xvel, mo->Speed);
|
||||||
|
mo->vely = FixedMul(yvel, mo->Speed);
|
||||||
|
mo->velz = FixedMul(zvel, mo->Speed);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mo->velx = xvel;
|
||||||
|
mo->vely = yvel;
|
||||||
|
mo->velz = zvel;
|
||||||
|
}
|
||||||
mo->angle = Angle;
|
mo->angle = Angle;
|
||||||
if (flags & SIXF_TRANSFERAMBUSHFLAG)
|
|
||||||
mo->flags = (mo->flags&~MF_AMBUSH) | (self->flags & MF_AMBUSH);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ ACTOR Actor native //: Thinker
|
||||||
action native A_Jump(int chance = 256, state label, ...);
|
action native A_Jump(int chance = 256, state label, ...);
|
||||||
action native A_CustomMissile(class<Actor> missiletype, float spawnheight = 32, int spawnofs_xy = 0, float angle = 0, int flags = 0, float pitch = 0);
|
action native A_CustomMissile(class<Actor> missiletype, float spawnheight = 32, int spawnofs_xy = 0, float angle = 0, int flags = 0, float pitch = 0);
|
||||||
action native A_CustomBulletAttack(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", float range = 0, int flags = 0);
|
action native A_CustomBulletAttack(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", float range = 0, int flags = 0);
|
||||||
action native A_CustomRailgun(int damage, int spawnofs_xy = 0, color color1 = "", color color2 = "", int flags = 0, bool aim = false, float maxdiff = 0, class<Actor> pufftype = "BulletPuff", float spread_xy = 0, float spread_z = 0, float range = 0, int duration = 0, float sparsity = 1.0, float driftspeed = 1.0, class<Actor> spawnclass = "none");
|
action native A_CustomRailgun(int damage, int spawnofs_xy = 0, color color1 = "", color color2 = "", int flags = 0, bool aim = false, float maxdiff = 0, class<Actor> pufftype = "BulletPuff", float spread_xy = 0, float spread_z = 0, float range = 0, int duration = 0, float sparsity = 1.0, float driftspeed = 1.0, class<Actor> spawnclass = "none", float spawnofs_z = 0);
|
||||||
action native A_JumpIfHealthLower(int health, state label);
|
action native A_JumpIfHealthLower(int health, state label);
|
||||||
action native A_JumpIfCloser(float distance, state label);
|
action native A_JumpIfCloser(float distance, state label);
|
||||||
action native A_JumpIfTracerCloser(float distance, state label);
|
action native A_JumpIfTracerCloser(float distance, state label);
|
||||||
|
@ -210,7 +210,7 @@ ACTOR Actor native //: Thinker
|
||||||
action native A_GiveInventory(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT);
|
action native A_GiveInventory(class<Inventory> itemtype, int amount = 0, int giveto = AAPTR_DEFAULT);
|
||||||
action native A_TakeInventory(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT);
|
action native A_TakeInventory(class<Inventory> itemtype, int amount = 0, int flags = 0, int giveto = AAPTR_DEFAULT);
|
||||||
action native A_SpawnItem(class<Actor> itemtype = "Unknown", float distance = 0, float zheight = 0, bool useammo = true, bool transfer_translation = false);
|
action native A_SpawnItem(class<Actor> itemtype = "Unknown", float distance = 0, float zheight = 0, bool useammo = true, bool transfer_translation = false);
|
||||||
action native A_SpawnItemEx(class<Actor> itemtype, float xofs = 0, float yofs = 0, float zofs = 0, float xvel = 0, float yvel = 0, float zvel = 0, float angle = 0, int flags = 0, int failchance = 0);
|
action native A_SpawnItemEx(class<Actor> itemtype, float xofs = 0, float yofs = 0, float zofs = 0, float xvel = 0, float yvel = 0, float zvel = 0, float angle = 0, int flags = 0, int failchance = 0, int tid=0);
|
||||||
action native A_Print(string whattoprint, float time = 0, string fontname = "");
|
action native A_Print(string whattoprint, float time = 0, string fontname = "");
|
||||||
action native A_PrintBold(string whattoprint, float time = 0, string fontname = "");
|
action native A_PrintBold(string whattoprint, float time = 0, string fontname = "");
|
||||||
action native A_Log(string whattoprint);
|
action native A_Log(string whattoprint);
|
||||||
|
|
|
@ -41,19 +41,22 @@ const int FBF_NOFLASH = 16;
|
||||||
const int FBF_NORANDOMPUFFZ = 32;
|
const int FBF_NORANDOMPUFFZ = 32;
|
||||||
|
|
||||||
// Flags for A_SpawnItemEx
|
// Flags for A_SpawnItemEx
|
||||||
const int SXF_TRANSFERTRANSLATION=1;
|
const int SXF_TRANSFERTRANSLATION = 1;
|
||||||
const int SXF_ABSOLUTEPOSITION=2;
|
const int SXF_ABSOLUTEPOSITION = 2;
|
||||||
const int SXF_ABSOLUTEANGLE=4;
|
const int SXF_ABSOLUTEANGLE = 4;
|
||||||
const int SXF_ABSOLUTEMOMENTUM=8;
|
const int SXF_ABSOLUTEMOMENTUM = 8;
|
||||||
const int SXF_ABSOLUTEVELOCITY=8;
|
const int SXF_ABSOLUTEVELOCITY = 8;
|
||||||
const int SXF_SETMASTER=16;
|
const int SXF_SETMASTER = 16;
|
||||||
const int SXF_NOCHECKPOSITION = 32;
|
const int SXF_NOCHECKPOSITION = 32;
|
||||||
const int SXF_TELEFRAG=64;
|
const int SXF_TELEFRAG = 64;
|
||||||
const int SXF_CLIENTSIDE=128; // only used by Skulltag
|
const int SXF_CLIENTSIDE = 128; // only used by Skulltag
|
||||||
const int SXF_TRANSFERAMBUSHFLAG=256;
|
const int SXF_TRANSFERAMBUSHFLAG = 256;
|
||||||
const int SXF_TRANSFERPITCH=512;
|
const int SXF_TRANSFERPITCH = 512;
|
||||||
const int SXF_TRANSFERPOINTERS=1024;
|
const int SXF_TRANSFERPOINTERS = 1024;
|
||||||
const int SXF_USEBLOODCOLOR=2048;
|
const int SXF_USEBLOODCOLOR = 2048;
|
||||||
|
const int SXF_CLEARCALLERTID = 4096;
|
||||||
|
const int SXF_MULTIPLYSPEED = 8192;
|
||||||
|
const int SXF_TRANSFERSCALE = 16384;
|
||||||
|
|
||||||
// Flags for A_Chase
|
// Flags for A_Chase
|
||||||
const int CHF_FASTCHASE = 1;
|
const int CHF_FASTCHASE = 1;
|
||||||
|
|
|
@ -11,7 +11,7 @@ ACTOR Inventory native
|
||||||
action native A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class<Actor> pufftype = "BulletPuff", float range = 0, float lifesteal = 0);
|
action native A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class<Actor> pufftype = "BulletPuff", float range = 0, float lifesteal = 0);
|
||||||
action native A_FireBullets(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", int flags = 1, float range = 0);
|
action native A_FireBullets(float spread_xy, float spread_z, int numbullets, int damageperbullet, class<Actor> pufftype = "BulletPuff", int flags = 1, float range = 0);
|
||||||
action native A_FireCustomMissile(class<Actor> missiletype, float angle = 0, bool useammo = true, int spawnofs_xy = 0, float spawnheight = 0, bool aimatangle = false, float pitch = 0);
|
action native A_FireCustomMissile(class<Actor> missiletype, float angle = 0, bool useammo = true, int spawnofs_xy = 0, float spawnheight = 0, bool aimatangle = false, float pitch = 0);
|
||||||
action native A_RailAttack(int damage, int spawnofs_xy = 0, int useammo = true, color color1 = "", color color2 = "", int flags = 0, float maxdiff = 0, class<Actor> pufftype = "BulletPuff", float spread_xy = 0, float spread_z = 0, float range = 0, int duration = 0, float sparsity = 1.0, float driftspeed = 1.0, class<Actor> spawnclass = "none");
|
action native A_RailAttack(int damage, int spawnofs_xy = 0, int useammo = true, color color1 = "", color color2 = "", int flags = 0, float maxdiff = 0, class<Actor> pufftype = "BulletPuff", float spread_xy = 0, float spread_z = 0, float range = 0, int duration = 0, float sparsity = 1.0, float driftspeed = 1.0, class<Actor> spawnclass = "none", float spawnofs_z = 0);
|
||||||
action native A_Light(int extralight);
|
action native A_Light(int extralight);
|
||||||
action native A_Light0();
|
action native A_Light0();
|
||||||
action native A_Light1();
|
action native A_Light1();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue