Fix Block Players for waypoint detection

This commit is contained in:
Sally Coolatta 2023-05-07 14:34:03 -04:00
parent 64e091414b
commit 0ec5c4346b
3 changed files with 20 additions and 19 deletions

View file

@ -188,7 +188,7 @@ waypoint_t *K_GetClosestWaypointToMobj(mobj_t *const mobj);
/*--------------------------------------------------
waypoint_t *K_GetBestWaypointForMobj(mobj_t *const mobj)
waypoint_t *K_GetBestWaypointForMobj(mobj_t *const mobj, waypoint_t *const hint);
Similar to K_GetClosestWaypointToMobj, but prioritizes horizontal distance over vertical distance, and
sight checks to ensure that the waypoint and mobj are the in same area. Can potentially return NULL if

View file

@ -1750,11 +1750,11 @@ boolean P_IsLineBlocking(const line_t *ld, const mobj_t *thing)
if (thing->player)
{
return (ld->flags & ML_BLOCKPLAYERS);
return ((ld->flags & ML_BLOCKPLAYERS) == ML_BLOCKPLAYERS);
}
else if (thing->flags & (MF_ENEMY|MF_BOSS))
{
return (ld->flags & ML_BLOCKMONSTERS);
return ((ld->flags & ML_BLOCKMONSTERS) == ML_BLOCKMONSTERS);
}
}

View file

@ -34,7 +34,7 @@ typedef struct
fixed_t topslope, bottomslope; // slopes to top and bottom of target
fixed_t bbox[4];
mobj_t *compareThing; // Original thing
mobj_t *t1, *t2;
boolean alreadyHates; // For bot traversal, for if the bot is already in a sector it doesn't want to be
} los_t;
@ -340,15 +340,15 @@ static boolean P_CanTraceBlockingLine(seg_t *seg, divline_t *divl, register los_
return false;
}
if (P_IsLineBlocking(line, los->compareThing) == true)
if (P_IsLineBlocking(line, los->t1) == true)
{
// This line will always block us
return false;
}
if (los->compareThing->player != NULL)
if (los->t1->player != NULL)
{
if (P_IsLineTripWire(line) == true && K_TripwirePass(los->compareThing->player) == false)
if (P_IsLineTripWire(line) == true && K_TripwirePass(los->t1->player) == false)
{
// Can't go through trip wire.
return false;
@ -370,32 +370,32 @@ static boolean P_CanBotTraverse(seg_t *seg, divline_t *divl, register los_t *los
}
// set openrange, opentop, openbottom
tm.x = los->compareThing->x;
tm.y = los->compareThing->y;
P_LineOpening(line, los->compareThing);
maxstep = P_GetThingStepUp(los->compareThing, tm.x, tm.y);
tm.x = los->t1->x;
tm.y = los->t1->y;
P_LineOpening(line, los->t1);
maxstep = P_GetThingStepUp(los->t1, tm.x, tm.y);
if ((openrange < los->compareThing->height) // doesn't fit
|| (opentop - los->compareThing->z < los->compareThing->height) // mobj is too high
|| (openbottom - los->compareThing->z > maxstep)) // too big a step up
if ((openrange < los->t1->height) // doesn't fit
|| (opentop - los->t1->z < los->t1->height) // mobj is too high
|| (openbottom - los->t1->z > maxstep)) // too big a step up
{
// This line situationally blocks us
return false;
}
if (los->compareThing->player != NULL && los->alreadyHates == false)
if (los->t1->player != NULL && los->alreadyHates == false)
{
// Treat damage sectors like walls, if you're not already in a bad sector.
sector_t *front, *back;
vertex_t pos;
P_ClosestPointOnLine(los->compareThing->x, los->compareThing->y, line, &pos);
P_ClosestPointOnLine(tm.x, tm.y, line, &pos);
front = seg->frontsector;
back = seg->backsector;
if (K_BotHatesThisSector(los->compareThing->player, front, pos.x, pos.y)
|| K_BotHatesThisSector(los->compareThing->player, back, pos.x, pos.y))
if (K_BotHatesThisSector(los->t1->player, front, pos.x, pos.y)
|| K_BotHatesThisSector(los->t1->player, back, pos.x, pos.y))
{
// This line does not block us, but we don't want to be in it.
return false;
@ -674,7 +674,8 @@ static boolean P_CompareMobjsAcrossLines(mobj_t *t1, mobj_t *t2, register los_fu
validcount++;
los.compareThing = t1;
los.t1 = t1;
los.t2 = t2;
los.alreadyHates = false;
los.topslope =