From 748156c846fe4c9d09dfa810bb89ca8e8558e5fa Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Wed, 23 Feb 2022 12:16:47 -0600 Subject: [PATCH] Optimized CanCrossLine. - Remove P_PointOnLineSide check - Made CanCrossLine opt-in by requiring the CROSSLINECHECK flag. --- src/playsim/actor.h | 1 + src/playsim/p_map.cpp | 6 +++--- src/scripting/thingdef_data.cpp | 1 + wadsrc/static/zscript/actors/actor.zs | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/playsim/actor.h b/src/playsim/actor.h index 492a4c2e6b..6dd8d0ddc0 100644 --- a/src/playsim/actor.h +++ b/src/playsim/actor.h @@ -425,6 +425,7 @@ enum ActorFlag8 MF8_STAYONLIFT = 0x02000000, // MBF AI enhancement. MF8_DONTFOLLOWPLAYERS = 0x04000000, // [inkoalawetrust] Friendly monster will not follow players. MF8_SEEFRIENDLYMONSTERS = 0X08000000, // [inkoalawetrust] Hostile monster can see friendly monsters. + MF8_CROSSLINECHECK = 0x10000000, // [MC]Enables CanCrossLine virtual }; // --- mobj.renderflags --- diff --git a/src/playsim/p_map.cpp b/src/playsim/p_map.cpp index 24c87ec6b3..5b5905b03a 100644 --- a/src/playsim/p_map.cpp +++ b/src/playsim/p_map.cpp @@ -163,7 +163,7 @@ bool P_CanCollideWith(AActor *tmthing, AActor *thing) // If false, the line blocks them. //========================================================================== -bool P_CanCrossLine(AActor *mo, line_t *line, int side, DVector3 next) +bool P_CanCrossLine(AActor *mo, line_t *line, DVector3 next) { static unsigned VIndex = ~0u; if (VIndex == ~0u) @@ -172,7 +172,7 @@ bool P_CanCrossLine(AActor *mo, line_t *line, int side, DVector3 next) assert(VIndex != ~0u); } - VMValue params[] = { mo, line, side, next.X, next.Y, next.Z, false }; + VMValue params[] = { mo, line, next.X, next.Y, next.Z, false }; VMReturn ret; int retval; ret.IntAt(&retval); @@ -985,7 +985,7 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec } } - if (!P_CanCrossLine(tm.thing, ld, P_PointOnLineSide(cres.Position, ld), tm.pos)) + if ((tm.thing->flags8 & MF8_CROSSLINECHECK) && !P_CanCrossLine(tm.thing, ld, tm.pos)) { if (wasfit) tm.thing->BlockingLine = ld; diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index ebd68beca5..42a3f145f2 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -340,6 +340,7 @@ static FFlagDef ActorFlagDefs[]= DEFINE_FLAG(MF8, STAYONLIFT, AActor, flags8), DEFINE_FLAG(MF8, DONTFOLLOWPLAYERS, AActor, flags8), DEFINE_FLAG(MF8, SEEFRIENDLYMONSTERS, AActor, flags8), + DEFINE_FLAG(MF8, CROSSLINECHECK, AActor, flags8), // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), diff --git a/wadsrc/static/zscript/actors/actor.zs b/wadsrc/static/zscript/actors/actor.zs index c1e409b702..6caa7de6f2 100644 --- a/wadsrc/static/zscript/actors/actor.zs +++ b/wadsrc/static/zscript/actors/actor.zs @@ -503,7 +503,7 @@ class Actor : Thinker native } // Called by PIT_CheckLine to check if an actor can cross a line. - virtual bool CanCrossLine(Line crossing, int side, Vector3 next) + virtual bool CanCrossLine(Line crossing, Vector3 next) { return true; }