mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-21 19:51:27 +00:00
Extend SKYEXPLODE flag for LineAttack
This commit is contained in:
parent
ce8c529422
commit
b1d35eb0b3
8 changed files with 52 additions and 8 deletions
|
@ -110,7 +110,8 @@ enum EPuffFlags
|
|||
PF_MELEERANGE = 2,
|
||||
PF_TEMPORARY = 4,
|
||||
PF_HITTHINGBLEED = 8,
|
||||
PF_NORANDOMZ = 16
|
||||
PF_NORANDOMZ = 16,
|
||||
PF_HITSKY = 32
|
||||
};
|
||||
|
||||
AActor *P_SpawnPuff(AActor *source, PClassActor *pufftype, const DVector3 &pos, DAngle hitdir, DAngle particledir, int updown, int flags = 0, AActor *vict = NULL);
|
||||
|
|
|
@ -4623,9 +4623,13 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
|
|||
damageType = puffDefaults->DamageType;
|
||||
}
|
||||
|
||||
int tflags;
|
||||
if (nointeract || (puffDefaults && puffDefaults->flags6 & MF6_NOTRIGGER)) tflags = TRACE_NoSky;
|
||||
else tflags = TRACE_NoSky | TRACE_Impact;
|
||||
uint32_t tflags = TRACE_NoSky | TRACE_Impact;
|
||||
if (nointeract || (puffDefaults && puffDefaults->flags6 & MF6_NOTRIGGER)) tflags &= ~TRACE_Impact;
|
||||
if (spawnSky)
|
||||
{
|
||||
tflags &= ~TRACE_NoSky;
|
||||
tflags |= TRACE_HitSky;
|
||||
}
|
||||
|
||||
// [MC] Check the flags and set the position according to what is desired.
|
||||
// LAF_ABSPOSITION: Treat the offset parameters as direct coordinates.
|
||||
|
@ -4683,8 +4687,16 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance,
|
|||
{
|
||||
if (trace.HitType != TRACE_HitActor)
|
||||
{
|
||||
|
||||
if (trace.HitType == TRACE_HasHitSky || (trace.HitType == TRACE_HitWall
|
||||
&& trace.Line->special == Line_Horizon && spawnSky))
|
||||
{
|
||||
puffFlags |= PF_HITSKY;
|
||||
}
|
||||
|
||||
P_GeometryLineAttack(trace, t1, damage, damageType);
|
||||
|
||||
|
||||
// position a bit closer for puffs
|
||||
if (nointeract || trace.HitType != TRACE_HitWall || ((trace.Line->special != Line_Horizon) || spawnSky))
|
||||
{
|
||||
|
|
|
@ -6245,7 +6245,11 @@ AActor *P_SpawnPuff (AActor *source, PClassActor *pufftype, const DVector3 &pos1
|
|||
// it will enter the crash state. This is used by the StrifeSpark
|
||||
// and BlasterPuff.
|
||||
FState *crashstate;
|
||||
if (!(flags & PF_HITTHING) && (crashstate = puff->FindState(NAME_Crash)) != NULL)
|
||||
if ((flags & PF_HITSKY) && (crashstate = puff->FindState(NAME_Death, NAME_Sky, true)) != NULL)
|
||||
{
|
||||
puff->SetState (crashstate);
|
||||
}
|
||||
else if (!(flags & PF_HITTHING) && (crashstate = puff->FindState(NAME_Crash)) != NULL)
|
||||
{
|
||||
puff->SetState (crashstate);
|
||||
}
|
||||
|
|
|
@ -938,6 +938,27 @@ bool FTraceInfo::CheckPlane (const secplane_t &plane)
|
|||
|
||||
static bool EditTraceResult (uint32_t flags, FTraceResults &res)
|
||||
{
|
||||
if (flags & TRACE_HitSky)
|
||||
{ // Throw away sky hits
|
||||
if (res.HitType == TRACE_HitFloor || res.HitType == TRACE_HitCeiling)
|
||||
{
|
||||
if (res.HitTexture == skyflatnum)
|
||||
{
|
||||
res.HitType = TRACE_HasHitSky;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (res.HitType == TRACE_HitWall)
|
||||
{
|
||||
if (res.Tier == TIER_Upper &&
|
||||
res.Line->frontsector->GetTexture(sector_t::ceiling) == skyflatnum &&
|
||||
res.Line->backsector->GetTexture(sector_t::ceiling) == skyflatnum)
|
||||
{
|
||||
res.HitType = TRACE_HasHitSky;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (flags & TRACE_NoSky)
|
||||
{ // Throw away sky hits
|
||||
if (res.HitType == TRACE_HitFloor || res.HitType == TRACE_HitCeiling)
|
||||
|
|
|
@ -52,6 +52,7 @@ enum ETraceResult
|
|||
TRACE_HitWall,
|
||||
TRACE_HitActor,
|
||||
TRACE_CrossingPortal,
|
||||
TRACE_HasHitSky,
|
||||
};
|
||||
|
||||
enum
|
||||
|
@ -98,6 +99,7 @@ enum
|
|||
TRACE_PortalRestrict= 0x0008, // Cannot go through portals without a static link offset.
|
||||
TRACE_ReportPortals = 0x0010, // Report any portal crossing to the TraceCallback
|
||||
TRACE_3DCallback = 0x0020, // [ZZ] use TraceCallback to determine whether we need to go through a line to do 3D floor check, or not. without this, only line flag mask is used
|
||||
TRACE_HitSky = 0x0040, // Hitting the sky returns TRACE_HasHitSky
|
||||
};
|
||||
|
||||
// return values from callback
|
||||
|
|
|
@ -38,7 +38,8 @@ struct FLineTraceData
|
|||
TRACE_HitCeiling,
|
||||
TRACE_HitWall,
|
||||
TRACE_HitActor,
|
||||
TRACE_CrossingPortal
|
||||
TRACE_CrossingPortal,
|
||||
TRACE_HasHitSky
|
||||
};
|
||||
|
||||
Actor HitActor;
|
||||
|
|
|
@ -503,6 +503,7 @@ enum ETraceFlags
|
|||
TRACE_PortalRestrict = 0x0008, // Cannot go through portals without a static link offset.
|
||||
TRACE_ReportPortals = 0x0010, // Report any portal crossing to the TraceCallback
|
||||
//TRACE_3DCallback = 0x0020, // [ZZ] use TraceCallback to determine whether we need to go through a line to do 3D floor check, or not. without this, only line flag mask is used
|
||||
TRACE_HitSky = 0x0040 // Hitting the sky returns TRACE_HasHitSky
|
||||
}
|
||||
|
||||
|
||||
|
@ -513,7 +514,8 @@ enum ETraceResult
|
|||
TRACE_HitCeiling,
|
||||
TRACE_HitWall,
|
||||
TRACE_HitActor,
|
||||
TRACE_CrossingPortal
|
||||
TRACE_CrossingPortal,
|
||||
TRACE_HasHitSky
|
||||
}
|
||||
|
||||
enum ELineTier
|
||||
|
|
|
@ -1122,7 +1122,8 @@ enum EPuffFlags
|
|||
PF_MELEERANGE = 2,
|
||||
PF_TEMPORARY = 4,
|
||||
PF_HITTHINGBLEED = 8,
|
||||
PF_NORANDOMZ = 16
|
||||
PF_NORANDOMZ = 16,
|
||||
PF_HITSKY = 32
|
||||
};
|
||||
|
||||
enum EPlayerCheats
|
||||
|
|
Loading…
Reference in a new issue