diff --git a/src/p_floor.c b/src/p_floor.c
index 0af81efee8ea0d154c9a05c5f7e7ebf19af00799..ce35ca12dcf17293da5c7ac55f4af51661dfe753 100644
--- a/src/p_floor.c
+++ b/src/p_floor.c
@@ -2021,6 +2021,33 @@ foundenemy:
 	P_RemoveThinker(&nobaddies->thinker);
 }
 
+//
+// P_IsObjectOnRealGround
+//
+// Helper function for T_EachTimeThinker
+// Like P_IsObjectOnGroundIn, except ONLY THE REAL GROUND IS CONSIDERED, NOT FOFS
+// I'll consider whether to make this a more globally accessible function or whatever in future
+// -- Monster Iestyn
+//
+static boolean P_IsObjectOnRealGround(mobj_t *mo, sector_t *sec)
+{
+	// Is the object in reverse gravity?
+	if (mo->eflags & MFE_VERTICALFLIP)
+	{
+		// Detect if the player is on the ceiling.
+		if (mo->z+mo->height >= P_GetSpecialTopZ(mo, sec, sec))
+			return true;
+	}
+	// Nope!
+	else
+	{
+		// Detect if the player is on the floor.
+		if (mo->z <= P_GetSpecialBottomZ(mo, sec, sec))
+			return true;
+	}
+	return false;
+}
+
 //
 // P_HavePlayersEnteredArea
 //
@@ -2224,7 +2251,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime)
 					|| P_PlayerTouchingSectorSpecial(&players[i], 2, (GETSECSPECIAL(sec->special, 2))) == sec))
 					continue;
 
-				if (floortouch == true && P_IsObjectOnGroundIn(players[i].mo, sec))
+				if (floortouch == true && P_IsObjectOnRealGround(players[i].mo, sec))
 				{
 					if (i & 1)
 						eachtime->var2s[i/2] |= 1;
diff --git a/src/p_spec.c b/src/p_spec.c
index 8891165f80ea9e0c0d2d6613da7cc242f60cb34f..4ddb90b098de688372b38cc61da34522aa7ce6c2 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -1742,7 +1742,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 		case 305: // continuous
 		case 306: // each time
 		case 307: // once
-			if (!(actor && actor->player && actor->player->charability != dist/10))
+			if (!(actor && actor->player && actor->player->charability == dist/10))
 				return false;
 			break;
 		case 309: // continuous
diff --git a/src/p_user.c b/src/p_user.c
index 5ea1ae47194bcb084d0483fdf1884ed0542453ac..7abf8534756db744e43c7c3cf9daba07bc98e626 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -1221,11 +1221,12 @@ boolean P_IsObjectOnGroundIn(mobj_t *mo, sector_t *sec)
 				if (!(rover->flags & FF_EXISTS))
 					continue;
 
-				// If the FOF is configured to let players through, continue.
-				if (!(rover->flags & FF_BLOCKPLAYER) && (rover->flags & FF_BLOCKOTHERS))
+				// If the FOF is configured to let the object through, continue.
+				if (!((rover->flags & FF_BLOCKPLAYER && mo->player)
+					|| (rover->flags & FF_BLOCKOTHERS && !mo->player)))
 					continue;
 
-				// If the the platform is intangile from below, continue.
+				// If the the platform is intangible from below, continue.
 				if (rover->flags & FF_PLATFORM)
 					continue;
 
@@ -1254,11 +1255,12 @@ boolean P_IsObjectOnGroundIn(mobj_t *mo, sector_t *sec)
 				if (!(rover->flags & FF_EXISTS))
 					continue;
 
-				// If the FOF is configured to let players through, continue.
-				if (!(rover->flags & FF_BLOCKPLAYER) && (rover->flags & FF_BLOCKOTHERS))
+				// If the FOF is configured to let the object through, continue.
+				if (!((rover->flags & FF_BLOCKPLAYER && mo->player)
+					|| (rover->flags & FF_BLOCKOTHERS && !mo->player)))
 					continue;
 
-				// If the the platform is intangile from above, continue.
+				// If the the platform is intangible from above, continue.
 				if (rover->flags & FF_REVERSEPLATFORM)
 					continue;
 
diff --git a/src/y_inter.c b/src/y_inter.c
index acf1c6f2f0afb3de0e2cf16ad43892e3ecc4c10c..42f1e2235861f29a4d2c28572e4629c88653a7e6 100644
--- a/src/y_inter.c
+++ b/src/y_inter.c
@@ -236,7 +236,7 @@ void Y_IntermissionDrawer(void)
 			ST_DrawNumFromHud(HUD_MINUTES, minutes); // Minutes
 			ST_DrawPatchFromHud(HUD_TIMECOLON, sbocolon); // Colon
 			ST_DrawPadNumFromHud(HUD_SECONDS, seconds, 2); // Seconds
-			
+
 			// we should show centiseconds on the intermission screen too, if the conditions are right.
 			if (modeattacking || cv_timetic.value == 2)
 			{