Merge branch 'fix-spawn-desynch' into 'next'
Fix desynch when a player spawns See merge request STJr/SRB2!977
This commit is contained in:
commit
191e2e094d
|
@ -523,6 +523,9 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
||||||
rsp->pflags = (UINT32)LONG(players[i].pflags); //pflags_t
|
rsp->pflags = (UINT32)LONG(players[i].pflags); //pflags_t
|
||||||
rsp->panim = (UINT8)players[i].panim; //panim_t
|
rsp->panim = (UINT8)players[i].panim; //panim_t
|
||||||
|
|
||||||
|
rsp->angleturn = (INT16)SHORT(players[i].angleturn);
|
||||||
|
rsp->oldrelangleturn = (INT16)SHORT(players[i].oldrelangleturn);
|
||||||
|
|
||||||
rsp->aiming = (angle_t)LONG(players[i].aiming);
|
rsp->aiming = (angle_t)LONG(players[i].aiming);
|
||||||
rsp->currentweapon = LONG(players[i].currentweapon);
|
rsp->currentweapon = LONG(players[i].currentweapon);
|
||||||
rsp->ringweapons = LONG(players[i].ringweapons);
|
rsp->ringweapons = LONG(players[i].ringweapons);
|
||||||
|
@ -664,6 +667,9 @@ static void resynch_read_player(resynch_pak *rsp)
|
||||||
players[i].pflags = (UINT32)LONG(rsp->pflags); //pflags_t
|
players[i].pflags = (UINT32)LONG(rsp->pflags); //pflags_t
|
||||||
players[i].panim = (UINT8)rsp->panim; //panim_t
|
players[i].panim = (UINT8)rsp->panim; //panim_t
|
||||||
|
|
||||||
|
players[i].angleturn = (INT16)SHORT(rsp->angleturn);
|
||||||
|
players[i].oldrelangleturn = (INT16)SHORT(rsp->oldrelangleturn);
|
||||||
|
|
||||||
players[i].aiming = (angle_t)LONG(rsp->aiming);
|
players[i].aiming = (angle_t)LONG(rsp->aiming);
|
||||||
players[i].currentweapon = LONG(rsp->currentweapon);
|
players[i].currentweapon = LONG(rsp->currentweapon);
|
||||||
players[i].ringweapons = LONG(rsp->ringweapons);
|
players[i].ringweapons = LONG(rsp->ringweapons);
|
||||||
|
@ -3351,6 +3357,7 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
|
||||||
displayplayer = newplayernum;
|
displayplayer = newplayernum;
|
||||||
secondarydisplayplayer = newplayernum;
|
secondarydisplayplayer = newplayernum;
|
||||||
DEBFILE("spawning me\n");
|
DEBFILE("spawning me\n");
|
||||||
|
ticcmd_oldangleturn[0] = newplayer->oldrelangleturn;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3358,7 +3365,9 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
|
||||||
DEBFILE("spawning my brother\n");
|
DEBFILE("spawning my brother\n");
|
||||||
if (botingame)
|
if (botingame)
|
||||||
newplayer->bot = 1;
|
newplayer->bot = 1;
|
||||||
|
ticcmd_oldangleturn[1] = newplayer->oldrelangleturn;
|
||||||
}
|
}
|
||||||
|
P_ForceLocalAngle(newplayer, (angle_t)(newplayer->angleturn << 16));
|
||||||
D_SendPlayerConfig();
|
D_SendPlayerConfig();
|
||||||
addedtogame = true;
|
addedtogame = true;
|
||||||
|
|
||||||
|
@ -3366,11 +3375,6 @@ static void Got_AddPlayer(UINT8 **p, INT32 playernum)
|
||||||
{
|
{
|
||||||
if (newplayer->mo)
|
if (newplayer->mo)
|
||||||
{
|
{
|
||||||
if (!splitscreenplayer)
|
|
||||||
localangle = newplayer->mo->angle;
|
|
||||||
else
|
|
||||||
localangle2 = newplayer->mo->angle;
|
|
||||||
|
|
||||||
newplayer->viewheight = 41*newplayer->height/48;
|
newplayer->viewheight = 41*newplayer->height/48;
|
||||||
|
|
||||||
if (newplayer->mo->eflags & MFE_VERTICALFLIP)
|
if (newplayer->mo->eflags & MFE_VERTICALFLIP)
|
||||||
|
@ -4726,41 +4730,6 @@ static void Local_Maketic(INT32 realtics)
|
||||||
localcmds2.angleturn |= TICCMD_RECEIVED;
|
localcmds2.angleturn |= TICCMD_RECEIVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function is utter bullshit and is responsible for
|
|
||||||
// the random desynch that happens when a player spawns.
|
|
||||||
// This is because ticcmds are resent to clients if a packet
|
|
||||||
// was dropped, and thus modifying them can lead to several
|
|
||||||
// clients having their ticcmds set to different values.
|
|
||||||
void SV_SpawnPlayer(INT32 playernum, INT32 x, INT32 y, angle_t angle)
|
|
||||||
{
|
|
||||||
tic_t tic;
|
|
||||||
UINT8 numadjust = 0;
|
|
||||||
|
|
||||||
(void)x;
|
|
||||||
(void)y;
|
|
||||||
|
|
||||||
// Revisionist history: adjust the angles in the ticcmds received
|
|
||||||
// for this player, because they actually preceded the player
|
|
||||||
// spawning, but will be applied afterwards.
|
|
||||||
|
|
||||||
for (tic = server ? maketic : (neededtic - 1); tic >= gametic; tic--)
|
|
||||||
{
|
|
||||||
if (numadjust++ == BACKUPTICS)
|
|
||||||
{
|
|
||||||
DEBFILE(va("SV_SpawnPlayer: All netcmds for player %d adjusted!\n", playernum));
|
|
||||||
// We already adjusted them all, waste of time doing the same thing over and over
|
|
||||||
// This shouldn't happen normally though, either gametic was 0 (which is handled now anyway)
|
|
||||||
// or maketic >= gametic + BACKUPTICS
|
|
||||||
// -- Monster Iestyn 16/01/18
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
netcmds[tic%BACKUPTICS][playernum].angleturn = (INT16)((angle>>16) | TICCMD_RECEIVED);
|
|
||||||
|
|
||||||
if (!tic) // failsafe for gametic == 0 -- Monster Iestyn 16/01/18
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// create missed tic
|
// create missed tic
|
||||||
static void SV_Maketic(void)
|
static void SV_Maketic(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -172,6 +172,9 @@ typedef struct
|
||||||
UINT32 pflags; // pflags_t
|
UINT32 pflags; // pflags_t
|
||||||
UINT8 panim; // panim_t
|
UINT8 panim; // panim_t
|
||||||
|
|
||||||
|
INT16 angleturn;
|
||||||
|
INT16 oldrelangleturn;
|
||||||
|
|
||||||
angle_t aiming;
|
angle_t aiming;
|
||||||
INT32 currentweapon;
|
INT32 currentweapon;
|
||||||
INT32 ringweapons;
|
INT32 ringweapons;
|
||||||
|
@ -535,7 +538,6 @@ void NetUpdate(void);
|
||||||
|
|
||||||
void SV_StartSinglePlayerServer(void);
|
void SV_StartSinglePlayerServer(void);
|
||||||
boolean SV_SpawnServer(void);
|
boolean SV_SpawnServer(void);
|
||||||
void SV_SpawnPlayer(INT32 playernum, INT32 x, INT32 y, angle_t angle);
|
|
||||||
void SV_StopServer(void);
|
void SV_StopServer(void);
|
||||||
void SV_ResetServer(void);
|
void SV_ResetServer(void);
|
||||||
void CL_AddSplitscreenPlayer(void);
|
void CL_AddSplitscreenPlayer(void);
|
||||||
|
|
|
@ -332,6 +332,9 @@ typedef struct player_s
|
||||||
|
|
||||||
angle_t viewrollangle;
|
angle_t viewrollangle;
|
||||||
|
|
||||||
|
INT16 angleturn;
|
||||||
|
INT16 oldrelangleturn;
|
||||||
|
|
||||||
// Mouse aiming, where the guy is looking at!
|
// Mouse aiming, where the guy is looking at!
|
||||||
// It is updated with cmd->aiming.
|
// It is updated with cmd->aiming.
|
||||||
angle_t aiming;
|
angle_t aiming;
|
||||||
|
|
|
@ -166,7 +166,6 @@ void G_LoadMetal(UINT8 **buffer)
|
||||||
void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||||
{
|
{
|
||||||
UINT8 ziptic;
|
UINT8 ziptic;
|
||||||
(void)playernum;
|
|
||||||
|
|
||||||
if (!demo_p || !demo_start)
|
if (!demo_p || !demo_start)
|
||||||
return;
|
return;
|
||||||
|
@ -184,6 +183,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
||||||
oldcmd.aiming = READINT16(demo_p);
|
oldcmd.aiming = READINT16(demo_p);
|
||||||
|
|
||||||
G_CopyTiccmd(cmd, &oldcmd, 1);
|
G_CopyTiccmd(cmd, &oldcmd, 1);
|
||||||
|
players[playernum].angleturn = cmd->angleturn;
|
||||||
|
|
||||||
if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER)
|
if (!(demoflags & DF_GHOST) && *demo_p == DEMOMARKER)
|
||||||
{
|
{
|
||||||
|
|
53
src/g_game.c
53
src/g_game.c
|
@ -1065,6 +1065,7 @@ static fixed_t forwardmove[2] = {25<<FRACBITS>>16, 50<<FRACBITS>>16};
|
||||||
static fixed_t sidemove[2] = {25<<FRACBITS>>16, 50<<FRACBITS>>16}; // faster!
|
static fixed_t sidemove[2] = {25<<FRACBITS>>16, 50<<FRACBITS>>16}; // faster!
|
||||||
static fixed_t angleturn[3] = {640, 1280, 320}; // + slow turn
|
static fixed_t angleturn[3] = {640, 1280, 320}; // + slow turn
|
||||||
|
|
||||||
|
INT16 ticcmd_oldangleturn[2];
|
||||||
boolean ticcmd_centerviewdown[2]; // For simple controls, lock the camera behind the player
|
boolean ticcmd_centerviewdown[2]; // For simple controls, lock the camera behind the player
|
||||||
mobj_t *ticcmd_ztargetfocus[2]; // Locking onto an object?
|
mobj_t *ticcmd_ztargetfocus[2]; // Locking onto an object?
|
||||||
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
|
@ -1140,7 +1141,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametyperules & GTR_TAG)
|
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametyperules & GTR_TAG)
|
||||||
&& (leveltime < hidetime * TICRATE) && (player->pflags & PF_TAGIT)))))
|
&& (leveltime < hidetime * TICRATE) && (player->pflags & PF_TAGIT)))))
|
||||||
{//@TODO splitscreen player
|
{//@TODO splitscreen player
|
||||||
cmd->angleturn = (INT16)(*myangle >> 16);
|
cmd->angleturn = ticcmd_oldangleturn[forplayer];
|
||||||
cmd->aiming = G_ClipAimingPitch(myaiming);
|
cmd->aiming = G_ClipAimingPitch(myaiming);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1361,7 +1362,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
if (controlstyle == CS_SIMPLE && !ticcmd_centerviewdown[forplayer] && !G_RingSlingerGametype())
|
if (controlstyle == CS_SIMPLE && !ticcmd_centerviewdown[forplayer] && !G_RingSlingerGametype())
|
||||||
{
|
{
|
||||||
CV_SetValue(&cv_directionchar[forplayer], 2);
|
CV_SetValue(&cv_directionchar[forplayer], 2);
|
||||||
*myangle = player->mo->angle;
|
cmd->angleturn = (INT16)((player->mo->angle - *myangle) >> 16);
|
||||||
*myaiming = 0;
|
*myaiming = 0;
|
||||||
|
|
||||||
if (cv_cam_lockonboss[forplayer].value)
|
if (cv_cam_lockonboss[forplayer].value)
|
||||||
|
@ -1430,7 +1431,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
else if (anglediff < -maxturn)
|
else if (anglediff < -maxturn)
|
||||||
anglediff = -maxturn;
|
anglediff = -maxturn;
|
||||||
|
|
||||||
*myangle += anglediff;
|
cmd->angleturn = (INT16)(cmd->angleturn + (anglediff >> 16));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1567,19 +1568,23 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
B_HandleFlightIndicator(player);
|
B_HandleFlightIndicator(player);
|
||||||
}
|
}
|
||||||
else if (player->bot == 2)
|
else if (player->bot == 2)
|
||||||
*myangle = localangle; // Fix offset angle for P2-controlled Tailsbot when P2's controls are set to non-Legacy
|
// Fix offset angle for P2-controlled Tailsbot when P2's controls are set to non-Legacy
|
||||||
|
cmd->angleturn = (INT16)((localangle - *myangle) >> 16);
|
||||||
|
|
||||||
|
*myangle += (cmd->angleturn<<16);
|
||||||
|
|
||||||
if (controlstyle == CS_LMAOGALOG) {
|
if (controlstyle == CS_LMAOGALOG) {
|
||||||
|
angle_t angle;
|
||||||
|
|
||||||
if (player->awayviewtics)
|
if (player->awayviewtics)
|
||||||
cmd->angleturn = (INT16)(player->awayviewmobj->angle >> 16);
|
angle = player->awayviewmobj->angle;
|
||||||
else
|
else
|
||||||
cmd->angleturn = (INT16)(thiscam->angle >> 16);
|
angle = thiscam->angle;
|
||||||
|
|
||||||
|
cmd->angleturn = (INT16)((angle - (ticcmd_oldangleturn[forplayer] << 16)) >> 16);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*myangle += (cmd->angleturn<<16);
|
|
||||||
cmd->angleturn = (INT16)(*myangle >> 16);
|
|
||||||
|
|
||||||
// Adjust camera angle by player input
|
// Adjust camera angle by player input
|
||||||
if (controlstyle == CS_SIMPLE && !forcestrafe && thiscam->chase && !turnheld[forplayer] && !ticcmd_centerviewdown[forplayer] && !player->climbing && player->powers[pw_carry] != CR_MINECART)
|
if (controlstyle == CS_SIMPLE && !forcestrafe && thiscam->chase && !turnheld[forplayer] && !ticcmd_centerviewdown[forplayer] && !player->climbing && player->powers[pw_carry] != CR_MINECART)
|
||||||
{
|
{
|
||||||
|
@ -1589,13 +1594,17 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
{
|
{
|
||||||
fixed_t sine = FINESINE((R_PointToAngle2(0, 0, player->rmomx, player->rmomy) - localangle)>>ANGLETOFINESHIFT);
|
fixed_t sine = FINESINE((R_PointToAngle2(0, 0, player->rmomx, player->rmomy) - localangle)>>ANGLETOFINESHIFT);
|
||||||
fixed_t factor;
|
fixed_t factor;
|
||||||
|
INT16 camadjust;
|
||||||
|
|
||||||
if ((sine > 0) == (cmd->sidemove > 0))
|
if ((sine > 0) == (cmd->sidemove > 0))
|
||||||
sine = 0; // Prevent jerking right when braking from going left, or vice versa
|
sine = 0; // Prevent jerking right when braking from going left, or vice versa
|
||||||
|
|
||||||
factor = min(40, FixedMul(player->speed, abs(sine))*2 / FRACUNIT);
|
factor = min(40, FixedMul(player->speed, abs(sine))*2 / FRACUNIT);
|
||||||
|
|
||||||
*myangle -= cmd->sidemove * factor * camadjustfactor;
|
camadjust = (cmd->sidemove * factor * camadjustfactor) >> 16;
|
||||||
|
|
||||||
|
*myangle -= camadjust << 16;
|
||||||
|
cmd->angleturn = (INT16)(cmd->angleturn - camadjust);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ticcmd_centerviewdown[forplayer] && (cv_cam_lockedinput[forplayer].value || (player->pflags & PF_STARTDASH)))
|
if (ticcmd_centerviewdown[forplayer] && (cv_cam_lockedinput[forplayer].value || (player->pflags & PF_STARTDASH)))
|
||||||
|
@ -1632,9 +1641,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
{
|
{
|
||||||
angle_t controlangle;
|
angle_t controlangle;
|
||||||
INT32 anglediff;
|
INT32 anglediff;
|
||||||
|
INT16 camadjust;
|
||||||
|
|
||||||
if ((cmd->forwardmove || cmd->sidemove) && !(player->pflags & PF_SPINNING))
|
if ((cmd->forwardmove || cmd->sidemove) && !(player->pflags & PF_SPINNING))
|
||||||
controlangle = (cmd->angleturn<<16) + R_PointToAngle2(0, 0, cmd->forwardmove << FRACBITS, -cmd->sidemove << FRACBITS);
|
controlangle = *myangle + R_PointToAngle2(0, 0, cmd->forwardmove << FRACBITS, -cmd->sidemove << FRACBITS);
|
||||||
else
|
else
|
||||||
controlangle = player->drawangle + drawangleoffset;
|
controlangle = player->drawangle + drawangleoffset;
|
||||||
|
|
||||||
|
@ -1651,7 +1661,10 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
anglediff = FixedMul(anglediff, sine);
|
anglediff = FixedMul(anglediff, sine);
|
||||||
}
|
}
|
||||||
|
|
||||||
*myangle += FixedMul(anglediff, camadjustfactor);
|
camadjust = FixedMul(anglediff, camadjustfactor) >> 16;
|
||||||
|
|
||||||
|
*myangle += camadjust << 16;
|
||||||
|
cmd->angleturn = (INT16)(cmd->angleturn + camadjust);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1665,6 +1678,9 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
|
||||||
LUAh_ViewpointSwitch(player, &players[consoleplayer], true);
|
LUAh_ViewpointSwitch(player, &players[consoleplayer], true);
|
||||||
displayplayer = consoleplayer;
|
displayplayer = consoleplayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmd->angleturn = (INT16)(cmd->angleturn + ticcmd_oldangleturn[forplayer]);
|
||||||
|
ticcmd_oldangleturn[forplayer] = cmd->angleturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
ticcmd_t *G_CopyTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n)
|
ticcmd_t *G_CopyTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n)
|
||||||
|
@ -2207,11 +2223,16 @@ void G_Ticker(boolean run)
|
||||||
|
|
||||||
buf = gametic % BACKUPTICS;
|
buf = gametic % BACKUPTICS;
|
||||||
|
|
||||||
// read/write demo and check turbo cheat
|
|
||||||
for (i = 0; i < MAXPLAYERS; i++)
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
{
|
{
|
||||||
if (playeringame[i])
|
if (playeringame[i])
|
||||||
|
{
|
||||||
G_CopyTiccmd(&players[i].cmd, &netcmds[buf][i], 1);
|
G_CopyTiccmd(&players[i].cmd, &netcmds[buf][i], 1);
|
||||||
|
|
||||||
|
players[i].angleturn += players[i].cmd.angleturn - players[i].oldrelangleturn;
|
||||||
|
players[i].oldrelangleturn = players[i].cmd.angleturn;
|
||||||
|
players[i].cmd.angleturn = players[i].angleturn;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// do main actions
|
// do main actions
|
||||||
|
@ -2395,6 +2416,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
||||||
SINT8 pity;
|
SINT8 pity;
|
||||||
INT16 rings;
|
INT16 rings;
|
||||||
INT16 spheres;
|
INT16 spheres;
|
||||||
|
INT16 playerangleturn;
|
||||||
|
INT16 oldrelangleturn;
|
||||||
|
|
||||||
score = players[player].score;
|
score = players[player].score;
|
||||||
lives = players[player].lives;
|
lives = players[player].lives;
|
||||||
|
@ -2406,6 +2429,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
||||||
spectator = players[player].spectator;
|
spectator = players[player].spectator;
|
||||||
outofcoop = players[player].outofcoop;
|
outofcoop = players[player].outofcoop;
|
||||||
pflags = (players[player].pflags & (PF_FLIPCAM|PF_ANALOGMODE|PF_DIRECTIONCHAR|PF_AUTOBRAKE|PF_TAGIT|PF_GAMETYPEOVER));
|
pflags = (players[player].pflags & (PF_FLIPCAM|PF_ANALOGMODE|PF_DIRECTIONCHAR|PF_AUTOBRAKE|PF_TAGIT|PF_GAMETYPEOVER));
|
||||||
|
playerangleturn = players[player].angleturn;
|
||||||
|
oldrelangleturn = players[player].oldrelangleturn;
|
||||||
|
|
||||||
if (!betweenmaps)
|
if (!betweenmaps)
|
||||||
pflags |= (players[player].pflags & PF_FINISHED);
|
pflags |= (players[player].pflags & PF_FINISHED);
|
||||||
|
@ -2479,6 +2504,8 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
|
||||||
p->quittime = quittime;
|
p->quittime = quittime;
|
||||||
p->spectator = spectator;
|
p->spectator = spectator;
|
||||||
p->outofcoop = outofcoop;
|
p->outofcoop = outofcoop;
|
||||||
|
p->angleturn = playerangleturn;
|
||||||
|
p->oldrelangleturn = oldrelangleturn;
|
||||||
|
|
||||||
// save player config truth reborn
|
// save player config truth reborn
|
||||||
p->skincolor = skincolor;
|
p->skincolor = skincolor;
|
||||||
|
|
|
@ -93,6 +93,7 @@ typedef enum
|
||||||
// build an internal map name MAPxx from map number
|
// build an internal map name MAPxx from map number
|
||||||
const char *G_BuildMapName(INT32 map);
|
const char *G_BuildMapName(INT32 map);
|
||||||
|
|
||||||
|
extern INT16 ticcmd_oldangleturn[2];
|
||||||
extern boolean ticcmd_centerviewdown[2]; // For simple controls, lock the camera behind the player
|
extern boolean ticcmd_centerviewdown[2]; // For simple controls, lock the camera behind the player
|
||||||
extern mobj_t *ticcmd_ztargetfocus[2]; // Locking onto an object?
|
extern mobj_t *ticcmd_ztargetfocus[2]; // Locking onto an object?
|
||||||
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer);
|
void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer);
|
||||||
|
|
|
@ -449,10 +449,8 @@ static int mobj_set(lua_State *L)
|
||||||
return UNIMPLEMENTED;
|
return UNIMPLEMENTED;
|
||||||
case mobj_angle:
|
case mobj_angle:
|
||||||
mo->angle = luaL_checkangle(L, 3);
|
mo->angle = luaL_checkangle(L, 3);
|
||||||
if (mo->player == &players[consoleplayer])
|
if (mo->player)
|
||||||
localangle = mo->angle;
|
P_SetPlayerAngle(mo->player, mo->angle);
|
||||||
else if (mo->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = mo->angle;
|
|
||||||
break;
|
break;
|
||||||
case mobj_rollangle:
|
case mobj_rollangle:
|
||||||
mo->rollangle = luaL_checkangle(L, 3);
|
mo->rollangle = luaL_checkangle(L, 3);
|
||||||
|
|
|
@ -555,7 +555,8 @@ void Command_Teleport_f(void)
|
||||||
p->mo->flags2 &= ~MF2_OBJECTFLIP;
|
p->mo->flags2 &= ~MF2_OBJECTFLIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
localangle = p->mo->angle = p->drawangle = FixedAngle(mt->angle<<FRACBITS);
|
p->mo->angle = p->drawangle = FixedAngle(mt->angle<<FRACBITS);
|
||||||
|
P_SetPlayerAngle(p, p->mo->angle);
|
||||||
}
|
}
|
||||||
else // scan the thinkers to find starposts...
|
else // scan the thinkers to find starposts...
|
||||||
{
|
{
|
||||||
|
@ -619,7 +620,8 @@ void Command_Teleport_f(void)
|
||||||
p->mo->flags2 &= ~MF2_OBJECTFLIP;
|
p->mo->flags2 &= ~MF2_OBJECTFLIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
localangle = p->mo->angle = p->drawangle = mo2->angle;
|
p->mo->angle = p->drawangle = mo2->angle;
|
||||||
|
P_SetPlayerAngle(p, p->mo->angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
CONS_Printf(M_GetText("Teleporting to checkpoint %d, %d...\n"), starpostnum, starpostpath);
|
CONS_Printf(M_GetText("Teleporting to checkpoint %d, %d...\n"), starpostnum, starpostpath);
|
||||||
|
@ -673,7 +675,10 @@ void Command_Teleport_f(void)
|
||||||
|
|
||||||
i = COM_CheckParm("-ang");
|
i = COM_CheckParm("-ang");
|
||||||
if (i)
|
if (i)
|
||||||
localangle = p->drawangle = p->mo->angle = FixedAngle(atoi(COM_Argv(i + 1))<<FRACBITS);
|
{
|
||||||
|
p->drawangle = p->mo->angle = FixedAngle(atoi(COM_Argv(i + 1))<<FRACBITS);
|
||||||
|
P_SetPlayerAngle(p, p->mo->angle);
|
||||||
|
}
|
||||||
|
|
||||||
i = COM_CheckParm("-aim");
|
i = COM_CheckParm("-aim");
|
||||||
if (i)
|
if (i)
|
||||||
|
|
|
@ -1143,10 +1143,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
|
|
||||||
toucher->angle = special->angle;
|
toucher->angle = special->angle;
|
||||||
|
|
||||||
if (player == &players[consoleplayer])
|
P_SetPlayerAngle(player, toucher->angle);
|
||||||
localangle = toucher->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = toucher->angle;
|
|
||||||
|
|
||||||
P_ResetPlayer(player);
|
P_ResetPlayer(player);
|
||||||
|
|
||||||
|
@ -1564,10 +1561,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
|
|
||||||
#if 0 // camera redirection - deemed unnecessary
|
#if 0 // camera redirection - deemed unnecessary
|
||||||
toucher->angle = special->angle;
|
toucher->angle = special->angle;
|
||||||
if (player == &players[consoleplayer])
|
P_SetPlayerAngle(player, toucher->angle);
|
||||||
localangle = toucher->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = toucher->angle;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
S_StartSound(toucher, special->info->attacksound); // home run
|
S_StartSound(toucher, special->info->attacksound); // home run
|
||||||
|
|
|
@ -138,6 +138,10 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor);
|
||||||
void P_ResetPlayer(player_t *player);
|
void P_ResetPlayer(player_t *player);
|
||||||
boolean P_PlayerCanDamage(player_t *player, mobj_t *thing);
|
boolean P_PlayerCanDamage(player_t *player, mobj_t *thing);
|
||||||
boolean P_IsLocalPlayer(player_t *player);
|
boolean P_IsLocalPlayer(player_t *player);
|
||||||
|
void P_SetPlayerAngle(player_t *player, angle_t angle);
|
||||||
|
angle_t P_GetLocalAngle(player_t *player);
|
||||||
|
void P_SetLocalAngle(player_t *player, angle_t angle);
|
||||||
|
void P_ForceLocalAngle(player_t *player, angle_t angle);
|
||||||
|
|
||||||
boolean P_IsObjectInGoop(mobj_t *mo);
|
boolean P_IsObjectInGoop(mobj_t *mo);
|
||||||
boolean P_IsObjectOnGround(mobj_t *mo);
|
boolean P_IsObjectOnGround(mobj_t *mo);
|
||||||
|
|
21
src/p_map.c
21
src/p_map.c
|
@ -372,12 +372,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
||||||
object->angle = object->player->drawangle = spring->angle;
|
object->angle = object->player->drawangle = spring->angle;
|
||||||
|
|
||||||
if (!demoplayback || P_ControlStyle(object->player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(object->player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(object->player, spring->angle);
|
||||||
if (object->player == &players[consoleplayer])
|
|
||||||
localangle = spring->angle;
|
|
||||||
else if (object->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = spring->angle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (object->player->pflags & PF_GLIDING)
|
if (object->player->pflags & PF_GLIDING)
|
||||||
|
@ -1310,12 +1305,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
|
||||||
thing->angle = tmthing->angle;
|
thing->angle = tmthing->angle;
|
||||||
|
|
||||||
if (!demoplayback || P_ControlStyle(thing->player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(thing->player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(thing->player, thing->angle);
|
||||||
if (thing->player == &players[consoleplayer])
|
|
||||||
localangle = thing->angle;
|
|
||||||
else if (thing->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = thing->angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -3379,12 +3369,7 @@ static void PTR_GlideClimbTraverse(line_t *li)
|
||||||
{
|
{
|
||||||
slidemo->angle = climbangle;
|
slidemo->angle = climbangle;
|
||||||
/*if (!demoplayback || P_ControlStyle(slidemo->player) == CS_LMAOGALOG)
|
/*if (!demoplayback || P_ControlStyle(slidemo->player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(slidemo->player, slidemo->angle);*/
|
||||||
if (slidemo->player == &players[consoleplayer])
|
|
||||||
localangle = slidemo->angle;
|
|
||||||
else if (slidemo->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = slidemo->angle;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (!slidemo->player->climbing)
|
if (!slidemo->player->climbing)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11435,10 +11435,7 @@ void P_AfterPlayerSpawn(INT32 playernum)
|
||||||
player_t *p = &players[playernum];
|
player_t *p = &players[playernum];
|
||||||
mobj_t *mobj = p->mo;
|
mobj_t *mobj = p->mo;
|
||||||
|
|
||||||
if (playernum == consoleplayer)
|
P_SetPlayerAngle(p, mobj->angle);
|
||||||
localangle = mobj->angle;
|
|
||||||
else if (playernum == secondarydisplayplayer)
|
|
||||||
localangle2 = mobj->angle;
|
|
||||||
|
|
||||||
p->viewheight = 41*p->height/48;
|
p->viewheight = 41*p->height/48;
|
||||||
|
|
||||||
|
@ -11455,7 +11452,6 @@ void P_AfterPlayerSpawn(INT32 playernum)
|
||||||
HU_Start();
|
HU_Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
SV_SpawnPlayer(playernum, mobj->x, mobj->y, mobj->angle);
|
|
||||||
p->drawangle = mobj->angle;
|
p->drawangle = mobj->angle;
|
||||||
|
|
||||||
if (camera.chase)
|
if (camera.chase)
|
||||||
|
|
|
@ -1159,10 +1159,7 @@ static void Polyobj_rotateThings(polyobj_t *po, vector2_t origin, angle_t delta,
|
||||||
|
|
||||||
if (turnthings == 2 || (turnthings == 1 && !mo->player)) {
|
if (turnthings == 2 || (turnthings == 1 && !mo->player)) {
|
||||||
mo->angle += delta;
|
mo->angle += delta;
|
||||||
if (mo->player == &players[consoleplayer])
|
P_SetPlayerAngle(mo->player, (angle_t)(mo->player->angleturn << 16) + delta);
|
||||||
localangle += delta;
|
|
||||||
else if (mo->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 += delta;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,8 @@ static void P_NetArchivePlayers(void)
|
||||||
|
|
||||||
// no longer send ticcmds, player name, skin, or color
|
// no longer send ticcmds, player name, skin, or color
|
||||||
|
|
||||||
|
WRITEINT16(save_p, players[i].angleturn);
|
||||||
|
WRITEINT16(save_p, players[i].oldrelangleturn);
|
||||||
WRITEANGLE(save_p, players[i].aiming);
|
WRITEANGLE(save_p, players[i].aiming);
|
||||||
WRITEANGLE(save_p, players[i].drawangle);
|
WRITEANGLE(save_p, players[i].drawangle);
|
||||||
WRITEANGLE(save_p, players[i].viewrollangle);
|
WRITEANGLE(save_p, players[i].viewrollangle);
|
||||||
|
@ -311,6 +313,8 @@ static void P_NetUnArchivePlayers(void)
|
||||||
// sending player names, skin and color should not be necessary at all!
|
// sending player names, skin and color should not be necessary at all!
|
||||||
// (that data is handled in the server config now)
|
// (that data is handled in the server config now)
|
||||||
|
|
||||||
|
players[i].angleturn = READINT16(save_p);
|
||||||
|
players[i].oldrelangleturn = READINT16(save_p);
|
||||||
players[i].aiming = READANGLE(save_p);
|
players[i].aiming = READANGLE(save_p);
|
||||||
players[i].drawangle = READANGLE(save_p);
|
players[i].drawangle = READANGLE(save_p);
|
||||||
players[i].viewrollangle = READANGLE(save_p);
|
players[i].viewrollangle = READANGLE(save_p);
|
||||||
|
@ -2576,11 +2580,6 @@ static thinker_t* LoadMobjThinker(actionf_p1 thinker)
|
||||||
i = READUINT8(save_p);
|
i = READUINT8(save_p);
|
||||||
mobj->player = &players[i];
|
mobj->player = &players[i];
|
||||||
mobj->player->mo = mobj;
|
mobj->player->mo = mobj;
|
||||||
// added for angle prediction
|
|
||||||
if (consoleplayer == i)
|
|
||||||
localangle = mobj->angle;
|
|
||||||
if (secondarydisplayplayer == i)
|
|
||||||
localangle2 = mobj->angle;
|
|
||||||
}
|
}
|
||||||
if (diff & MD_MOVEDIR)
|
if (diff & MD_MOVEDIR)
|
||||||
mobj->movedir = READANGLE(save_p);
|
mobj->movedir = READANGLE(save_p);
|
||||||
|
|
31
src/p_spec.c
31
src/p_spec.c
|
@ -4602,12 +4602,7 @@ DoneSection2:
|
||||||
player->mo->angle = player->drawangle = lineangle;
|
player->mo->angle = player->drawangle = lineangle;
|
||||||
|
|
||||||
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
localangle = player->mo->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(lines[i].flags & ML_EFFECT4))
|
if (!(lines[i].flags & ML_EFFECT4))
|
||||||
{
|
{
|
||||||
|
@ -8899,24 +8894,12 @@ void T_Pusher(pusher_t *p)
|
||||||
|
|
||||||
if (!demoplayback || P_ControlStyle(thing->player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(thing->player) == CS_LMAOGALOG)
|
||||||
{
|
{
|
||||||
if (thing->player == &players[consoleplayer])
|
angle_t angle = thing->player->angleturn << 16;
|
||||||
{
|
if (thing->angle - angle > ANGLE_180)
|
||||||
if (thing->angle - localangle > ANGLE_180)
|
P_SetPlayerAngle(thing->player, angle - (angle - thing->angle) / 8);
|
||||||
localangle -= (localangle - thing->angle) / 8;
|
else
|
||||||
else
|
P_SetPlayerAngle(thing->player, angle + (thing->angle - angle) / 8);
|
||||||
localangle += (thing->angle - localangle) / 8;
|
//P_SetPlayerAngle(thing->player, thing->angle);
|
||||||
}
|
|
||||||
else if (thing->player == &players[secondarydisplayplayer])
|
|
||||||
{
|
|
||||||
if (thing->angle - localangle2 > ANGLE_180)
|
|
||||||
localangle2 -= (localangle2 - thing->angle) / 8;
|
|
||||||
else
|
|
||||||
localangle2 += (thing->angle - localangle2) / 8;
|
|
||||||
}
|
|
||||||
/*if (thing->player == &players[consoleplayer])
|
|
||||||
localangle = thing->angle;
|
|
||||||
else if (thing->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = thing->angle;*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,10 +63,7 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
|
||||||
thing->reactiontime = TICRATE/2; // don't move for about half a second
|
thing->reactiontime = TICRATE/2; // don't move for about half a second
|
||||||
|
|
||||||
// absolute angle position
|
// absolute angle position
|
||||||
if (thing == players[consoleplayer].mo)
|
P_SetPlayerAngle(thing->player, angle);
|
||||||
localangle = angle;
|
|
||||||
if (thing == players[secondarydisplayplayer].mo)
|
|
||||||
localangle2 = angle;
|
|
||||||
|
|
||||||
// move chasecam at new player location
|
// move chasecam at new player location
|
||||||
if (splitscreen && camera2.chase
|
if (splitscreen && camera2.chase
|
||||||
|
@ -165,10 +162,7 @@ boolean P_Teleport(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle
|
||||||
thing->player->drawangle += (angle - thing->angle);
|
thing->player->drawangle += (angle - thing->angle);
|
||||||
|
|
||||||
// absolute angle position
|
// absolute angle position
|
||||||
if (thing->player == &players[consoleplayer])
|
P_SetPlayerAngle(thing->player, angle);
|
||||||
localangle = angle;
|
|
||||||
if (thing->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = angle;
|
|
||||||
|
|
||||||
// move chasecam at new player location
|
// move chasecam at new player location
|
||||||
if (splitscreen && camera2.chase && thing->player == &players[secondarydisplayplayer])
|
if (splitscreen && camera2.chase && thing->player == &players[secondarydisplayplayer])
|
||||||
|
|
|
@ -770,7 +770,9 @@ void P_PreTicker(INT32 frames)
|
||||||
memcpy(&temptic, &players[i].cmd, sizeof(ticcmd_t));
|
memcpy(&temptic, &players[i].cmd, sizeof(ticcmd_t));
|
||||||
memset(&players[i].cmd, 0, sizeof(ticcmd_t));
|
memset(&players[i].cmd, 0, sizeof(ticcmd_t));
|
||||||
// correct angle on spawn...
|
// correct angle on spawn...
|
||||||
players[i].cmd.angleturn = temptic.angleturn;
|
players[i].angleturn += temptic.angleturn - players[i].oldrelangleturn;
|
||||||
|
players[i].oldrelangleturn = temptic.angleturn;
|
||||||
|
players[i].cmd.angleturn = players[i].angleturn;
|
||||||
|
|
||||||
P_PlayerThink(&players[i]);
|
P_PlayerThink(&players[i]);
|
||||||
|
|
||||||
|
|
150
src/p_user.c
150
src/p_user.c
|
@ -3572,22 +3572,11 @@ static void P_DoClimbing(player_t *player)
|
||||||
#define CLIMBCONEMAX FixedAngle(90*FRACUNIT)
|
#define CLIMBCONEMAX FixedAngle(90*FRACUNIT)
|
||||||
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
||||||
{
|
{
|
||||||
if (player == &players[consoleplayer])
|
angle_t angdiff = P_GetLocalAngle(player) - player->mo->angle;
|
||||||
{
|
if (angdiff < ANGLE_180 && angdiff > CLIMBCONEMAX)
|
||||||
angle_t angdiff = localangle - player->mo->angle;
|
P_SetLocalAngle(player, player->mo->angle + CLIMBCONEMAX);
|
||||||
if (angdiff < ANGLE_180 && angdiff > CLIMBCONEMAX)
|
else if (angdiff > ANGLE_180 && angdiff < InvAngle(CLIMBCONEMAX))
|
||||||
localangle = player->mo->angle + CLIMBCONEMAX;
|
P_SetLocalAngle(player, player->mo->angle - CLIMBCONEMAX);
|
||||||
else if (angdiff > ANGLE_180 && angdiff < InvAngle(CLIMBCONEMAX))
|
|
||||||
localangle = player->mo->angle - CLIMBCONEMAX;
|
|
||||||
}
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
{
|
|
||||||
angle_t angdiff = localangle2 - player->mo->angle;
|
|
||||||
if (angdiff < ANGLE_180 && angdiff > CLIMBCONEMAX)
|
|
||||||
localangle2 = player->mo->angle + CLIMBCONEMAX;
|
|
||||||
else if (angdiff > ANGLE_180 && angdiff < InvAngle(CLIMBCONEMAX))
|
|
||||||
localangle2 = player->mo->angle - CLIMBCONEMAX;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->climbing == 0)
|
if (player->climbing == 0)
|
||||||
|
@ -4373,12 +4362,7 @@ void P_DoJump(player_t *player, boolean soundandstate)
|
||||||
player->drawangle = player->mo->angle = player->mo->angle - ANGLE_180; // Turn around from the wall you were climbing.
|
player->drawangle = player->mo->angle = player->mo->angle - ANGLE_180; // Turn around from the wall you were climbing.
|
||||||
|
|
||||||
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
localangle = player->mo->angle; // Adjust the local control angle.
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
player->climbing = 0; // Stop climbing, duh!
|
player->climbing = 0; // Stop climbing, duh!
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(6*FRACUNIT, player->mo->scale)); // Jump off the wall.
|
P_InstaThrust(player->mo, player->mo->angle, FixedMul(6*FRACUNIT, player->mo->scale)); // Jump off the wall.
|
||||||
|
@ -4701,12 +4685,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
||||||
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, lockon->x, lockon->y);
|
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, lockon->x, lockon->y);
|
||||||
bullet = P_SpawnPointMissile(player->mo, lockon->x, lockon->y, zpos(lockon), player->revitem, player->mo->x, player->mo->y, zpos(player->mo));
|
bullet = P_SpawnPointMissile(player->mo, lockon->x, lockon->y, zpos(lockon), player->revitem, player->mo->x, player->mo->y, zpos(player->mo));
|
||||||
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
localangle = player->mo->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5326,9 +5305,9 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||||
/*if (!demoplayback)
|
/*if (!demoplayback)
|
||||||
{
|
{
|
||||||
if (player == &players[consoleplayer] && cv_cam_turnfacingability[0].value > 0 && !(PLAYER1INPUTDOWN(gc_turnleft) || PLAYER1INPUTDOWN(gc_turnright)))
|
if (player == &players[consoleplayer] && cv_cam_turnfacingability[0].value > 0 && !(PLAYER1INPUTDOWN(gc_turnleft) || PLAYER1INPUTDOWN(gc_turnright)))
|
||||||
localangle = player->mo->angle;
|
P_SetPlayerAngle(player, player->mo->angle);;
|
||||||
else if (player == &players[secondarydisplayplayer] && cv_cam_turnfacingability[1].value > 0 && !(PLAYER2INPUTDOWN(gc_turnleft) || PLAYER2INPUTDOWN(gc_turnright)))
|
else if (player == &players[secondarydisplayplayer] && cv_cam_turnfacingability[1].value > 0 && !(PLAYER2INPUTDOWN(gc_turnleft) || PLAYER2INPUTDOWN(gc_turnright)))
|
||||||
localangle2 = player->mo->angle;
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -5733,10 +5712,7 @@ static void P_2dMovement(player_t *player)
|
||||||
player->mo->angle = ANGLE_180;
|
player->mo->angle = ANGLE_180;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player == &players[consoleplayer])
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
localangle = player->mo->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
|
|
||||||
if (player->pflags & PF_GLIDING)
|
if (player->pflags & PF_GLIDING)
|
||||||
movepushangle = player->mo->angle;
|
movepushangle = player->mo->angle;
|
||||||
|
@ -7573,10 +7549,7 @@ static void P_NiGHTSMovement(player_t *player)
|
||||||
else
|
else
|
||||||
player->mo->rollangle = rollangle;
|
player->mo->rollangle = rollangle;
|
||||||
|
|
||||||
if (player == &players[consoleplayer])
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
localangle = player->mo->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
|
|
||||||
// Check for crushing in our new location
|
// Check for crushing in our new location
|
||||||
if ((player->mo->ceilingz - player->mo->floorz < player->mo->height)
|
if ((player->mo->ceilingz - player->mo->floorz < player->mo->height)
|
||||||
|
@ -8525,10 +8498,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
|
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
|
||||||
|
|
||||||
// Update the local angle control.
|
// Update the local angle control.
|
||||||
if (player == &players[consoleplayer])
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
localangle = player->mo->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->climbing == 1)
|
if (player->climbing == 1)
|
||||||
|
@ -8804,11 +8774,7 @@ static void P_DoZoomTube(player_t *player)
|
||||||
if (player->mo->tracer)
|
if (player->mo->tracer)
|
||||||
{
|
{
|
||||||
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, player->mo->tracer->x, player->mo->tracer->y);
|
player->mo->angle = R_PointToAngle2(player->mo->x, player->mo->y, player->mo->tracer->x, player->mo->tracer->y);
|
||||||
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
localangle = player->mo->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9265,12 +9231,7 @@ boolean P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
|
||||||
{
|
{
|
||||||
source->player->drawangle = source->angle;
|
source->player->drawangle = source->angle;
|
||||||
if (!demoplayback || P_ControlStyle(source->player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(source->player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(source->player, source->angle);
|
||||||
if (source->player == &players[consoleplayer])
|
|
||||||
localangle = source->angle;
|
|
||||||
else if (source->player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = source->angle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// change slope
|
// change slope
|
||||||
|
@ -9711,7 +9672,7 @@ void P_ResetCamera(player_t *player, camera_t *thiscam)
|
||||||
if ((thiscam == &camera && G_ControlStyle(1) == CS_SIMPLE)
|
if ((thiscam == &camera && G_ControlStyle(1) == CS_SIMPLE)
|
||||||
|| (thiscam == &camera2 && G_ControlStyle(2) == CS_SIMPLE))
|
|| (thiscam == &camera2 && G_ControlStyle(2) == CS_SIMPLE))
|
||||||
{
|
{
|
||||||
thiscam->angle = (thiscam == &camera) ? localangle : localangle2;
|
thiscam->angle = P_GetLocalAngle(player);
|
||||||
thiscam->aiming = (thiscam == &camera) ? localaiming : localaiming2;
|
thiscam->aiming = (thiscam == &camera) ? localaiming : localaiming2;
|
||||||
}
|
}
|
||||||
else if (!(thiscam == &camera && (cv_cam_still.value || cv_analog[0].value))
|
else if (!(thiscam == &camera && (cv_cam_still.value || cv_analog[0].value))
|
||||||
|
@ -9912,9 +9873,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|
||||||
if (player == &players[consoleplayer])
|
if (player == &players[consoleplayer])
|
||||||
{
|
{
|
||||||
if (focusangle >= localangle)
|
if (focusangle >= localangle)
|
||||||
localangle += abs((signed)(focusangle - localangle))>>5;
|
P_ForceLocalAngle(player, localangle + (abs((signed)(focusangle - localangle))>>5));
|
||||||
else
|
else
|
||||||
localangle -= abs((signed)(focusangle - localangle))>>5;
|
P_ForceLocalAngle(player, localangle - (abs((signed)(focusangle - localangle))>>5));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -10888,21 +10849,13 @@ static void P_MinecartThink(player_t *player)
|
||||||
|
|
||||||
if (angdiff + minecart->angle != player->mo->angle && (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG))
|
if (angdiff + minecart->angle != player->mo->angle && (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG))
|
||||||
{
|
{
|
||||||
angle_t *ang = NULL;
|
angdiff = P_GetLocalAngle(player) - minecart->angle;
|
||||||
|
if (angdiff < ANGLE_180 && angdiff > MINECARTCONEMAX)
|
||||||
|
P_SetLocalAngle(player, minecart->angle + MINECARTCONEMAX);
|
||||||
|
else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX))
|
||||||
|
P_SetLocalAngle(player, minecart->angle - MINECARTCONEMAX);
|
||||||
|
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
ang = &localangle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
ang = &localangle2;
|
|
||||||
|
|
||||||
if (ang)
|
|
||||||
{
|
|
||||||
angdiff = *ang - minecart->angle;
|
|
||||||
if (angdiff < ANGLE_180 && angdiff > MINECARTCONEMAX)
|
|
||||||
*ang = minecart->angle + MINECARTCONEMAX;
|
|
||||||
else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX))
|
|
||||||
*ang = minecart->angle - MINECARTCONEMAX;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10979,10 +10932,7 @@ static void P_MinecartThink(player_t *player)
|
||||||
if (angdiff && (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)) // maintain relative angle on turns
|
if (angdiff && (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)) // maintain relative angle on turns
|
||||||
{
|
{
|
||||||
player->mo->angle += angdiff;
|
player->mo->angle += angdiff;
|
||||||
if (player == &players[consoleplayer])
|
P_SetPlayerAngle(player, (angle_t)(player->angleturn << 16) + angdiff);
|
||||||
localangle += angdiff;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 += angdiff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sideways detection
|
// Sideways detection
|
||||||
|
@ -12545,12 +12495,7 @@ void P_PlayerAfterThink(player_t *player)
|
||||||
player->mo->angle = tails->angle;
|
player->mo->angle = tails->angle;
|
||||||
|
|
||||||
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
localangle = player->mo->angle;
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (P_AproxDistance(player->mo->x - tails->x, player->mo->y - tails->y) > player->mo->radius)
|
if (P_AproxDistance(player->mo->x - tails->x, player->mo->y - tails->y) > player->mo->radius)
|
||||||
|
@ -12634,12 +12579,7 @@ void P_PlayerAfterThink(player_t *player)
|
||||||
player->mo->angle += cmd->sidemove<<ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX
|
player->mo->angle += cmd->sidemove<<ANGLETOFINESHIFT; // 2048 --> ANGLE_MAX
|
||||||
|
|
||||||
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
if (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)
|
||||||
{
|
P_SetPlayerAngle(player, player->mo->angle);
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
localangle = player->mo->angle; // Adjust the local control angle.
|
|
||||||
else if (player == &players[secondarydisplayplayer])
|
|
||||||
localangle2 = player->mo->angle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -12851,3 +12791,43 @@ void P_PlayerAfterThink(player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void P_SetPlayerAngle(player_t *player, angle_t angle)
|
||||||
|
{
|
||||||
|
INT16 delta = (INT16)(angle >> 16) - player->angleturn;
|
||||||
|
|
||||||
|
P_ForceLocalAngle(player, P_GetLocalAngle(player) + (delta << 16));
|
||||||
|
player->angleturn += delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
void P_SetLocalAngle(player_t *player, angle_t angle)
|
||||||
|
{
|
||||||
|
INT16 delta = (INT16)((angle - P_GetLocalAngle(player)) >> 16);
|
||||||
|
|
||||||
|
P_ForceLocalAngle(player, P_GetLocalAngle(player) + (angle_t)(delta << 16));
|
||||||
|
|
||||||
|
if (player == &players[consoleplayer])
|
||||||
|
ticcmd_oldangleturn[0] += delta;
|
||||||
|
else if (player == &players[secondarydisplayplayer])
|
||||||
|
ticcmd_oldangleturn[1] += delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
angle_t P_GetLocalAngle(player_t *player)
|
||||||
|
{
|
||||||
|
if (player == &players[consoleplayer])
|
||||||
|
return localangle;
|
||||||
|
else if (player == &players[secondarydisplayplayer])
|
||||||
|
return localangle2;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void P_ForceLocalAngle(player_t *player, angle_t angle)
|
||||||
|
{
|
||||||
|
angle = angle & ~UINT16_MAX;
|
||||||
|
|
||||||
|
if (player == &players[consoleplayer])
|
||||||
|
localangle = angle;
|
||||||
|
else if (player == &players[secondarydisplayplayer])
|
||||||
|
localangle2 = angle;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue