Merge branch 'awayview-fix' into 'next'

Call P_ResetCamera Upon Switching To/From an Away View Camera

See merge request STJr/SRB2!2011
This commit is contained in:
Sal 2023-07-24 09:15:56 +00:00
commit 31d26c6f55
3 changed files with 42 additions and 11 deletions

View file

@ -1278,13 +1278,30 @@ static int player_set(lua_State *L)
mobj_t *mo = NULL;
if (!lua_isnil(L, 3))
mo = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
P_SetTarget(&plr->awayviewmobj, mo);
if (plr->awayviewmobj != mo) {
P_SetTarget(&plr->awayviewmobj, mo);
if (plr->awayviewtics) {
if (!plr->awayviewmobj)
plr->awayviewtics = 0; // can't have a NULL awayviewmobj with awayviewtics!
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
}
}
break;
}
case player_awayviewtics:
plr->awayviewtics = (INT32)luaL_checkinteger(L, 3);
if (plr->awayviewtics && !plr->awayviewmobj) // awayviewtics must ALWAYS have an awayviewmobj set!!
INT32 tics = (INT32)luaL_checkinteger(L, 3);
if (tics && !plr->awayviewmobj) // awayviewtics must ALWAYS have an awayviewmobj set!!
P_SetTarget(&plr->awayviewmobj, plr->mo); // but since the script might set awayviewmobj immediately AFTER setting awayviewtics, use player mobj as filler for now.
if ((tics && !plr->awayviewtics) || (!tics && plr->awayviewtics)) {
if (plr == &players[displayplayer])
P_ResetCamera(plr, &camera); // reset p1 camera on p1 transitioning to/from zero awayviewtics
else if (splitscreen && plr == &players[secondarydisplayplayer])
P_ResetCamera(plr, &camera2); // reset p2 camera on p2 transitioning to/from zero awayviewtics
}
plr->awayviewtics = tics;
break;
case player_awayviewaiming:
plr->awayviewaiming = luaL_checkangle(L, 3);

View file

@ -2657,10 +2657,13 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
// This is not revoked until overwritten; awayviewtics is ignored
if (titlemapinaction)
titlemapcameraref = altview;
else
{
else if (!mo->player->awayviewtics || mo->player->awayviewmobj != altview) {
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];
@ -2670,8 +2673,10 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
aim <<= 8;
if (titlemapinaction)
titlemapcameraref->cusval = (angle_t)aim;
else
else {
mo->player->awayviewaiming = (angle_t)aim;
mo->player->awayviewtics = line->args[1];
}
}
break;

View file

@ -11525,15 +11525,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;