diff --git a/src/g_game.c b/src/g_game.c
index 4fd9c6aa7f5c23acf7b215cfb11d0f7243a82825..aada65f4845fd900a7d3e251f9a647605fa18c1e 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1402,7 +1402,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 
 		ticcmd_centerviewdown[forplayer] = true;
 	}
-	else if (ticcmd_centerviewdown[forplayer] || (leveltime < 5))
+	else if (ticcmd_centerviewdown[forplayer])
 	{
 		if (controlstyle == CS_SIMPLE)
 		{
@@ -1417,7 +1417,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 	{
 		if (
 			P_MobjWasRemoved(ticcmd_ztargetfocus[forplayer]) ||
-			(leveltime < 5) ||
+			(cv_directionchar[forplayer].value != 2) ||
+			(R_PointToDist2(player->mo->x, player->mo->y, ticcmd_ztargetfocus[forplayer]->x, ticcmd_ztargetfocus[forplayer]->y) > 3000<<FRACBITS) || // Locks on to the wrong mobj if too far away, so just cancel it
 			(player->playerstate != PST_LIVE) ||
 			player->exiting ||
 			!ticcmd_ztargetfocus[forplayer]->health ||
@@ -1470,8 +1471,20 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 		}
 	}
 
-	if (ticcmd_centerviewdown[forplayer] && controlstyle == CS_SIMPLE)
-		controlstyle = CS_LEGACY;
+	if (ticcmd_centerviewdown[forplayer] && chasecam)
+	{
+		if (controlstyle == CS_SIMPLE)
+			controlstyle = CS_LEGACY;
+	}
+	else if (cv_directionchar[forplayer].value == 2)
+	{
+		if (P_MobjWasRemoved(ticcmd_ztargetfocus[forplayer]) || !chasecam)
+		{
+			P_SetTarget(&ticcmd_ztargetfocus[forplayer], NULL);
+			CV_SetValue(&cv_directionchar[forplayer], 1);
+		}
+
+	}
 
 	if (PLAYERINPUTDOWN(ssplayer, GC_CAMRESET))
 	{