diff --git a/src/g_hexen/a_clericholy.cpp b/src/g_hexen/a_clericholy.cpp index 560c1d87c..8c8891155 100644 --- a/src/g_hexen/a_clericholy.cpp +++ b/src/g_hexen/a_clericholy.cpp @@ -335,7 +335,7 @@ static void CHolyFindTarget (AActor *actor) { AActor *target; - if ( (target = P_RoughMonsterSearch (actor, 6)) ) + if ( (target = P_RoughMonsterSearch (actor, 6, true)) ) { actor->tracer = target; actor->flags |= MF_NOCLIP|MF_SKULLFLY; diff --git a/src/g_hexen/a_magestaff.cpp b/src/g_hexen/a_magestaff.cpp index 743a1b5f7..8673e09d1 100644 --- a/src/g_hexen/a_magestaff.cpp +++ b/src/g_hexen/a_magestaff.cpp @@ -167,7 +167,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_MStaffTrack) { if ((self->tracer == 0) && (pr_mstafftrack()<50)) { - self->tracer = P_RoughMonsterSearch (self, 10); + self->tracer = P_RoughMonsterSearch (self, 10, true); } P_SeekerMissile (self, ANGLE_1*2, ANGLE_1*10); } diff --git a/src/p_local.h b/src/p_local.h index a943b2460..97b5e5fa3 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -350,7 +350,7 @@ public: #define PT_DELTA 8 // x2,y2 is passed as a delta, not as an endpoint AActor *P_BlockmapSearch (AActor *mo, int distance, AActor *(*check)(AActor*, int, void *), void *params = NULL); -AActor *P_RoughMonsterSearch (AActor *mo, int distance); +AActor *P_RoughMonsterSearch (AActor *mo, int distance, bool onlyseekable=false); // // P_MAP diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index b9a3d76ca..17fc97d2f 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -1401,9 +1401,9 @@ FPathTraverse::~FPathTraverse() // distance is in MAPBLOCKUNITS //=========================================================================== -AActor *P_RoughMonsterSearch (AActor *mo, int distance) +AActor *P_RoughMonsterSearch (AActor *mo, int distance, bool onlyseekable) { - return P_BlockmapSearch (mo, distance, RoughBlockCheck); + return P_BlockmapSearch (mo, distance, RoughBlockCheck, (void *)onlyseekable); } AActor *P_BlockmapSearch (AActor *mo, int distance, AActor *(*check)(AActor*, int, void *), void *params) @@ -1501,14 +1501,19 @@ AActor *P_BlockmapSearch (AActor *mo, int distance, AActor *(*check)(AActor*, in // //=========================================================================== -static AActor *RoughBlockCheck (AActor *mo, int index, void *) +static AActor *RoughBlockCheck (AActor *mo, int index, void *param) { + bool onlyseekable = param != NULL; FBlockNode *link; for (link = blocklinks[index]; link != NULL; link = link->NextActor) { if (link->Me != mo) { + if (onlyseekable && !mo->CanSeek(link->Me)) + { + continue; + } if (mo->IsOkayToAttack (link->Me)) { return link->Me; diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 098886ee3..e802583e8 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -501,9 +501,15 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_SeekerMissile) if ((flags & SMF_LOOK) && (self->tracer == 0) && (pr_seekermissile()tracer = P_RoughMonsterSearch (self, distance); + self->tracer = P_RoughMonsterSearch (self, distance, true); + } + if (!P_SeekerMissile(self, clamp(ang1, 0, 90) * ANGLE_1, clamp(ang2, 0, 90) * ANGLE_1, !!(flags & SMF_PRECISE), !!(flags & SMF_CURSPEED))) + { + if (flags & SMF_LOOK) + { // This monster is no longer seekable, so let us look for another one next time. + self->tracer = NULL; + } } - P_SeekerMissile(self, clamp(ang1, 0, 90) * ANGLE_1, clamp(ang2, 0, 90) * ANGLE_1, !!(flags & SMF_PRECISE), !!(flags & SMF_CURSPEED)); } //==========================================================================