diff --git a/src/g_game.c b/src/g_game.c
index 175e757ec9c58a865052be6a3a7f838a0b04c121..fd8178ca8b1caa6ee5a456aca151125c664f87e5 100644
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -1425,7 +1425,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)
 		{
@@ -1440,11 +1440,11 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 	{
 		if (
 			P_MobjWasRemoved(ticcmd_ztargetfocus[forplayer]) ||
-			(leveltime < 5) ||
+			(cv_directionchar[forplayer].value != 2) ||
+			(!P_CheckSight(player->mo, ticcmd_ztargetfocus[forplayer])) ||
 			(player->playerstate != PST_LIVE) ||
 			player->exiting ||
-			!ticcmd_ztargetfocus[forplayer]->health ||
-			(ticcmd_ztargetfocus[forplayer]->type == MT_EGGMOBILE3 && !ticcmd_ztargetfocus[forplayer]->movecount) // Sea Egg is moving around underground and shouldn't be tracked
+			!ticcmd_ztargetfocus[forplayer]->health
 		)
 			P_SetTarget(&ticcmd_ztargetfocus[forplayer], NULL);
 		else
@@ -1477,7 +1477,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
 			if (player->mo && R_PointToDist2(0, 0,
 				player->mo->x - ticcmd_ztargetfocus[forplayer]->x,
 				player->mo->y - ticcmd_ztargetfocus[forplayer]->y
-			) > 50*player->mo->scale)
+			) > FixedMul(50<<FRACBITS, player->mo->scale))
 			{
 				INT32 anglediff = R_PointToAngle2(player->mo->x, player->mo->y, ticcmd_ztargetfocus[forplayer]->x, ticcmd_ztargetfocus[forplayer]->y) - *myangle;
 				const INT32 maxturn = ANG10/2;
@@ -1493,8 +1493,21 @@ 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 (!ticcmd_ztargetfocus[forplayer] || !chasecam)
+		{
+			P_SetTarget(&ticcmd_ztargetfocus[forplayer], NULL);
+			CV_SetValue(&cv_directionchar[forplayer], 1);
+		}
+
+	}
+
 
 	if (PLAYERINPUTDOWN(ssplayer, GC_CAMRESET))
 	{