From 748156c846fe4c9d09dfa810bb89ca8e8558e5fa Mon Sep 17 00:00:00 2001
From: Major Cooke <majorcooke22@gmail.com>
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 492a4c2e6..6dd8d0ddc 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 24c87ec6b..5b5905b03 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 ebd68beca..42a3f145f 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 c1e409b70..6caa7de6f 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;
 	}