diff --git a/src/p_map.c b/src/p_map.c
index 1f2d903e80efaa6d3073244eca69ed2ca26f1b6e..48f4cca23f70002ab266c3d69b00862e48518aee 100644
--- a/src/p_map.c
+++ b/src/p_map.c
@@ -2657,7 +2657,7 @@ isblocking:
 		// see about climbing on the wall
 		if (!(checkline->flags & ML_NOCLIMB))
 		{
-			boolean canclimb; // FUCK C90
+			boolean canclimb;
 			angle_t climbangle, climbline;
 			INT32 whichside = P_PointOnLineSide(slidemo->x, slidemo->y, li);
 
diff --git a/src/p_user.c b/src/p_user.c
index 9cd6aa401946d7f4700dfc75e24c510d53f5565f..f390650f43d31101f1431c07331cc3e635f44b93 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -2276,25 +2276,24 @@ static void P_DoClimbing(player_t *player)
 	fixed_t platy;
 	subsector_t *glidesector;
 	boolean climb = true;
+	boolean onesided = ((player->lastsidehit != -1 && player->lastlinehit != -1) && !(lines[player->lastlinehit].backsector));
 
 	platx = P_ReturnThrustX(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
 	platy = P_ReturnThrustY(player->mo, player->mo->angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale));
 
-	glidesector = R_IsPointInSubsector(player->mo->x + platx, player->mo->y + platy);
+	glidesector = R_PointInSubsector(player->mo->x + platx, player->mo->y + platy);
 
-	if (!glidesector || glidesector->sector != player->mo->subsector->sector)
+	if (onesided || glidesector->sector != player->mo->subsector->sector)
 	{
-		boolean floorclimb;
-		boolean thrust;
-		boolean boostup;
-		boolean skyclimber;
+		boolean floorclimb = false;
+		boolean thrust = false;
+		boolean boostup = false;
+		boolean skyclimber = false;
 		fixed_t floorheight, ceilingheight; // ESLOPE
-		thrust = false;
-		floorclimb = false;
-		boostup = false;
-		skyclimber = false;
 
-		if (glidesector)
+		if (onesided)
+			floorclimb = true;
+		else
 		{
 #ifdef ESLOPE
 			floorheight = glidesector->sector->f_slope ? P_GetZAt(glidesector->sector->f_slope, player->mo->x, player->mo->y)
@@ -2589,8 +2588,6 @@ static void P_DoClimbing(player_t *player)
 				}
 			}
 		}
-		else
-			floorclimb = true;
 
 		if (player->lastsidehit != -1 && player->lastlinehit != -1)
 		{
diff --git a/src/r_main.c b/src/r_main.c
index 1ad125cd0f940c09bc62847a7e147b440deaa604..498f4dab8829aba9db31557f1f5f5a7ea4f1c5d9 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -771,7 +771,7 @@ subsector_t *R_PointInSubsector(fixed_t x, fixed_t y)
 }
 
 //
-// R_IsPointInSubsector, same as above but returns 0 if not in subsector
+// R_IsPointInSubsector, same as above but returns 0 if not in subsector - this does not work in opengl because of polyvertex_t
 //
 subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y)
 {