diff --git a/src/p_slopes.c b/src/p_slopes.c
index 7f070e2a1793b4d02a44fefa374f4a887a8da4a1..62c013d48e078812c5f57ee790f3c15d9e0c2e92 100644
--- a/src/p_slopes.c
+++ b/src/p_slopes.c
@@ -588,7 +588,7 @@ static pslope_t *MakeViaMapthings(INT16 tag1, INT16 tag2, INT16 tag3, UINT8 flag
 		vx[i].y = mt->y << FRACBITS;
 		vx[i].z = mt->z << FRACBITS;
 		if (!mt->args[0])
-			vx[i].z += R_PointInSubsector(vx[i].x, vx[i].y)->sector->floorheight;
+			vx[i].z += R_OldPointInSubsector(vx[i].x, vx[i].y)->sector->floorheight;
 	}
 
 	ReconfigureViaVertexes(ret, vx[0], vx[1], vx[2]);
diff --git a/src/r_main.c b/src/r_main.c
index 7cacbb6106a9d3d990700091bc89f1a09a6be622..01ad8b3e444087c8dd57d64fb09ff87cdbfbd7fc 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -1036,6 +1036,16 @@ boolean R_IsPointInSector(sector_t *sector, fixed_t x, fixed_t y)
 	return passes % 2;
 }
 
+subsector_t *R_OldPointInSubsector(fixed_t x, fixed_t y)
+{
+	size_t nodenum = numnodes-1;
+
+	while (!(nodenum & NF_SUBSECTOR))
+		nodenum = nodes[nodenum].children[R_OldPointOnSide(x, y, nodes+nodenum)];
+
+	return &subsectors[nodenum & ~NF_SUBSECTOR];
+}
+
 //
 // R_PointInSubsector
 //
diff --git a/src/r_main.h b/src/r_main.h
index 1c110c1a616b48d7b1bf2870d8c0b01083b85fa5..ef9f37a4c3280f9f78d3aabaa4a3739aec488b46 100644
--- a/src/r_main.h
+++ b/src/r_main.h
@@ -79,9 +79,7 @@ static inline INT32 R_PointOnSide(fixed_t x, fixed_t y, node_t *node)
 {
 	// use cross product to determine side quickly
 	INT64 v = ((INT64)y - node->y) * node->dx - ((INT64)x - node->x) * node->dy;
-	if (v == 0) // if we're on the line, use the old algorithm
-		return R_OldPointOnSide(x, y, node);
-	return v > 0;
+	return v >= 0;
 }
 
 static inline INT32 R_PointOnSegSide(fixed_t x, fixed_t y, seg_t *line)
@@ -93,9 +91,7 @@ static inline INT32 R_PointOnSegSide(fixed_t x, fixed_t y, seg_t *line)
 
 	// use cross product to determine side quickly
 	INT64 v = ((INT64)y - ly) * ldx - ((INT64)x - lx) * ldy;
-	if (v == 0) // if we're on the line, use the old algorithm
-		return R_OldPointOnSegSide(x, y, line);
-	return v > 0;
+	return v >= 0;
 }
 
 angle_t R_PointToAngle(fixed_t x, fixed_t y);
@@ -105,6 +101,7 @@ fixed_t R_PointToDist(fixed_t x, fixed_t y);
 fixed_t R_PointToDist2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1);
 
 boolean R_IsPointInSector(sector_t *sector, fixed_t x, fixed_t y);
+subsector_t *R_OldPointInSubsector(fixed_t x, fixed_t y);
 subsector_t *R_PointInSubsector(fixed_t x, fixed_t y);
 subsector_t *R_PointInSubsectorOrNull(fixed_t x, fixed_t y);