mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-03-09 19:01:09 +00:00
Merged https://github.com/ZDoom/gzdoom/pull/1950 (Reflection export)
This commit is contained in:
parent
afea6ff51f
commit
0d330a6bb7
5 changed files with 56 additions and 51 deletions
|
@ -268,6 +268,7 @@ void P_PlayerStartStomp (AActor *actor, bool mononly=false); // [RH] Stomp on t
|
|||
void P_SlideMove (AActor* mo, const DVector2 &pos, int numsteps);
|
||||
bool P_BounceWall (AActor *mo);
|
||||
bool P_BounceActor (AActor *mo, AActor *BlockingMobj, bool ontop);
|
||||
bool P_ReflectOffActor(AActor* mo, AActor* blocking);
|
||||
int P_CheckSight (AActor *t1, AActor *t2, int flags=0);
|
||||
|
||||
enum ESightFlags
|
||||
|
|
|
@ -3707,6 +3707,48 @@ bool P_BounceActor(AActor *mo, AActor *BlockingMobj, bool ontop)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool P_ReflectOffActor(AActor* mo, AActor* blocking)
|
||||
{
|
||||
if (!(blocking->flags2 & MF2_REFLECTIVE))
|
||||
return false;
|
||||
|
||||
// Don't change the angle if there's THRUREFLECT on the monster.
|
||||
if (!(blocking->flags7 & MF7_THRUREFLECT))
|
||||
{
|
||||
DAngle angle = blocking->AngleTo(mo);
|
||||
if (mo->AdjustReflectionAngle(blocking, angle))
|
||||
return false;
|
||||
|
||||
// Change angle for deflection/reflection
|
||||
auto target = mo->target != NULL ? mo->target : blocking->target;
|
||||
if (target && (blocking->flags7 & MF7_AIMREFLECT))
|
||||
{
|
||||
//dest->x - source->x
|
||||
DVector3 vect = mo->Vec3To(target);
|
||||
vect.Z += target->Height * 0.5;
|
||||
mo->Vel = vect.Resized(mo->Speed);
|
||||
}
|
||||
else if (blocking->flags7 & MF7_MIRRORREFLECT)
|
||||
{
|
||||
mo->Angles.Yaw += DAngle::fromDeg(180.0);
|
||||
mo->Vel *= -0.5;
|
||||
}
|
||||
else
|
||||
{
|
||||
mo->Angles.Yaw = angle;
|
||||
mo->VelFromAngle(mo->Speed * 0.5);
|
||||
mo->Vel.Z *= -0.5;
|
||||
}
|
||||
}
|
||||
|
||||
if (mo->flags2 & MF2_SEEKERMISSILE)
|
||||
mo->tracer = mo->target;
|
||||
|
||||
mo->target = blocking;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
//
|
||||
// Aiming
|
||||
|
|
|
@ -2095,57 +2095,11 @@ static double P_XYMovement (AActor *mo, DVector2 scroll)
|
|||
return Oldfloorz;
|
||||
}
|
||||
}
|
||||
if (BlockingMobj && (BlockingMobj->flags2 & MF2_REFLECTIVE))
|
||||
if (BlockingMobj && P_ReflectOffActor(mo, BlockingMobj))
|
||||
{
|
||||
bool seeker = (mo->flags2 & MF2_SEEKERMISSILE) ? true : false;
|
||||
// Don't change the angle if there's THRUREFLECT on the monster.
|
||||
if (!(BlockingMobj->flags7 & MF7_THRUREFLECT))
|
||||
{
|
||||
DAngle angle = BlockingMobj->AngleTo(mo);
|
||||
bool dontReflect = (mo->AdjustReflectionAngle(BlockingMobj, angle));
|
||||
// Change angle for deflection/reflection
|
||||
|
||||
if (!dontReflect)
|
||||
{
|
||||
bool tg = (mo->target != NULL);
|
||||
bool blockingtg = (BlockingMobj->target != NULL);
|
||||
if ((BlockingMobj->flags7 & MF7_AIMREFLECT) && (tg | blockingtg))
|
||||
{
|
||||
AActor *origin = tg ? mo->target : BlockingMobj->target;
|
||||
|
||||
//dest->x - source->x
|
||||
DVector3 vect = mo->Vec3To(origin);
|
||||
vect.Z += origin->Height / 2;
|
||||
mo->Vel = vect.Resized(mo->Speed);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((BlockingMobj->flags7 & MF7_MIRRORREFLECT) && (tg | blockingtg))
|
||||
{
|
||||
mo->Angles.Yaw += DAngle::fromDeg(180.);
|
||||
mo->Vel *= -.5;
|
||||
}
|
||||
else
|
||||
{
|
||||
mo->Angles.Yaw = angle;
|
||||
mo->VelFromAngle(mo->Speed / 2);
|
||||
mo->Vel.Z *= -.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
goto explode;
|
||||
}
|
||||
}
|
||||
if (mo->flags2 & MF2_SEEKERMISSILE)
|
||||
{
|
||||
mo->tracer = mo->target;
|
||||
}
|
||||
mo->target = BlockingMobj;
|
||||
return Oldfloorz;
|
||||
}
|
||||
explode:
|
||||
|
||||
// explode a missile
|
||||
bool onsky = false;
|
||||
if (tm.ceilingline && tm.ceilingline->hitSkyWall(mo))
|
||||
|
@ -3231,11 +3185,9 @@ bool AActor::AdjustReflectionAngle (AActor *thing, DAngle &angle)
|
|||
if (thing->flags4&MF4_SHIELDREFLECT)
|
||||
{
|
||||
// Shield reflection (from the Centaur)
|
||||
if (absangle(angle, thing->Angles.Yaw) > DAngle::fromDeg(45))
|
||||
if ((flags7 & MF7_NOSHIELDREFLECT) || absangle(angle, thing->Angles.Yaw) > DAngle::fromDeg(45))
|
||||
return true; // Let missile explode
|
||||
|
||||
if (thing->flags7 & MF7_NOSHIELDREFLECT) return true;
|
||||
|
||||
if (pr_reflect () < 128)
|
||||
angle += DAngle::fromDeg(45);
|
||||
else
|
||||
|
|
|
@ -1861,6 +1861,15 @@ DEFINE_ACTION_FUNCTION(AActor, PlayBounceSound)
|
|||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_ACTION_FUNCTION(AActor, ReflectOffActor)
|
||||
{
|
||||
PARAM_SELF_PROLOGUE(AActor);
|
||||
PARAM_OBJECT(blocking, AActor);
|
||||
|
||||
ACTION_RETURN_BOOL(P_ReflectOffActor(self, blocking));
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int isFrozen(AActor *self)
|
||||
{
|
||||
|
|
|
@ -819,6 +819,7 @@ class Actor : Thinker native
|
|||
native bool BounceWall(Line l = null);
|
||||
native bool BouncePlane(SecPlane plane);
|
||||
native void PlayBounceSound(bool onFloor);
|
||||
native bool ReflectOffActor(Actor blocking);
|
||||
|
||||
clearscope double PitchTo(Actor target, double zOfs = 0, double targZOfs = 0, bool absolute = false) const
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue