From aa43aa7c8c0a1c17174b7b84ffa9e9a282f4264c Mon Sep 17 00:00:00 2001
From: SMS Alfredo <65426124+SMS-Alfredo@users.noreply.github.com>
Date: Sat, 3 Jun 2023 15:43:58 -0500
Subject: [PATCH] Call P_ResetCamera Upon Switching To/From an Away View Camera

---
 src/lua_playerlib.c |  4 ++++
 src/p_spec.c        |  5 +++++
 src/p_user.c        | 17 +++++++++++++----
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index f7e14e78f9..f79b1e45e9 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -710,6 +710,10 @@ static int player_set(lua_State *L)
 		if (!lua_isnil(L, 3))
 			mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
 		P_SetTarget(&plr->awayviewmobj, mo);
+		if (plr == &players[displayplayer])
+			P_ResetCamera(plr, &camera); // reset p1 camera on p1 getting an awayviewmobj
+		else if (splitscreen && plr == &players[secondarydisplayplayer])
+			P_ResetCamera(plr, &camera2);  // reset p2 camera on p2 getting an awayviewmobj
 	}
 	else if (fastcmp(field,"awayviewtics"))
 	{
diff --git a/src/p_spec.c b/src/p_spec.c
index aa04a723eb..8489a227f3 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -2669,6 +2669,11 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
 				{
 					P_SetTarget(&mo->player->awayviewmobj, altview);
 					mo->player->awayviewtics = line->args[1];
+					
+					if (mo->player == &players[displayplayer])
+						P_ResetCamera(mo->player, &camera); // reset p1 camera on p1 getting an awayviewmobj
+					else if (splitscreen && mo->player == &players[secondarydisplayplayer])
+						P_ResetCamera(mo->player, &camera2);  // reset p2 camera on p2 getting an awayviewmobj
 				}
 
 				aim = udmf ? altview->spawnpoint->pitch : line->args[2];
diff --git a/src/p_user.c b/src/p_user.c
index 0f3282da55..42fd0c3104 100644
--- a/src/p_user.c
+++ b/src/p_user.c
@@ -11507,15 +11507,24 @@ void P_PlayerThink(player_t *player)
 	if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj))
 	{
 		P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid
-		player->awayviewtics = 0; // reset to zero
+		player->awayviewtics = 1; // reset to one, the below code will immediately set it to zero
+	}
+	
+	if (player->awayviewtics && player->awayviewtics != -1)
+	{
+		player->awayviewtics--;
+		if (!(player->awayviewtics))
+		{
+			if (player == &players[displayplayer])
+				P_ResetCamera(player, &camera); // reset p1 camera on p1 running out of awayviewtics
+			else if (splitscreen && player == &players[secondarydisplayplayer])
+				P_ResetCamera(player, &camera2);  // reset p2 camera on p2 running out of awayviewtics
+		}
 	}
 
 	if (player->flashcount)
 		player->flashcount--;
 
-	if (player->awayviewtics && player->awayviewtics != -1)
-		player->awayviewtics--;
-
 	/// \note do this in the cheat code
 	if (player->pflags & PF_NOCLIP)
 		player->mo->flags |= MF_NOCLIP;
-- 
GitLab