diff --git a/src/d_clisrv.c b/src/d_clisrv.c index e4db23675..33802170e 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5102,8 +5102,9 @@ static boolean CheckForSpeedHacks(UINT8 p) { if (netcmds[maketic%BACKUPTICS][p].forwardmove > MAXPLMOVE || netcmds[maketic%BACKUPTICS][p].forwardmove < -MAXPLMOVE || netcmds[maketic%BACKUPTICS][p].sidemove > MAXPLMOVE || netcmds[maketic%BACKUPTICS][p].sidemove < -MAXPLMOVE + || netcmds[maketic%BACKUPTICS][p].throwdir > KART_FULLTURN || netcmds[maketic%BACKUPTICS][p].throwdir < -KART_FULLTURN || netcmds[maketic%BACKUPTICS][p].turning > KART_FULLTURN || netcmds[maketic%BACKUPTICS][p].turning < -KART_FULLTURN - || netcmds[maketic%BACKUPTICS][p].throwdir > KART_FULLTURN || netcmds[maketic%BACKUPTICS][p].throwdir < -KART_FULLTURN) + ) { CONS_Alert(CONS_WARNING, M_GetText("Illegal movement value received from node %d\n"), playernode[p]); //D_Clearticcmd(k); diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index d636043c4..495477fc8 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -64,11 +64,11 @@ typedef enum // 16 bytes long now! struct ticcmd_t { - SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50) - SINT8 sidemove; // -MAXPLMOVE to MAXPLMOVE (50) - INT16 turning; // Turn speed + SINT8 forwardmove; // -MAXPLMOVE to MAXPLMOVE (50) (has anticheat) + SINT8 sidemove; // -MAXPLMOVE to MAXPLMOVE (50) (has anticheat) + INT16 turning; // "Steering Wheel" turn speed when driving (has anticheat) INT16 angle; // Predicted angle, use me if you can! - INT16 throwdir; // Aiming direction + INT16 throwdir; // Forwards/Backwards item use direction (has anticheat) INT16 aiming; // vertical aiming, see G_BuildTicCmd UINT16 buttons; UINT8 latency; // Netgames: how many tics ago was this ticcmd generated from this player's end? diff --git a/src/g_game.c b/src/g_game.c index 88672a4a6..c33bd5976 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1557,15 +1557,22 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) cmd->angle -= (tspeed * KART_FULLTURN) / JOYAXISRANGE; side += (accelerometertilt * 4) / JOYAXISRANGE; - //todo: control spectator camera using the gyro + //control spectator camera using the gyro + // player space gyro from http://gyrowiki.jibbsmart.com/blog:player-space-gyro-and-alternatives-explained if (spectating) { + fixed_t yawRelaxFactor = 141*FRACUNIT/100; + fixed_t worldYaw; fixed_t deltaseconds = FixedDiv(FRACUNIT, max(cv_timescale.value, FRACUNIT/20))/TICRATE; vector3_t gyro = G_GetGamepadCalibratedGyro(forplayer); - cmd->turning -= (FixedMul(FixedMul(gyro.y, M_PI_FIXED/180), deltaseconds) * 1) * (encoremode ? -1 : 1); - cmd->angle -= (FixedMul(FixedMul(gyro.y, M_PI_FIXED/180), deltaseconds) * 1) * (encoremode ? -1 : 1); - - cmd->aiming -= (FixedMul(FixedMul(gyro.x, M_PI_FIXED/180), deltaseconds) * 1); + vector3_t gravnorm = G_GetGamepadGravity(forplayer); + vector2_t gyroYZ = {gyro.y, gyro.z}; + FV3_Normalize(&gravnorm); + // use world yaw for yaw direction, local combined yaw for magnitude + worldYaw = FixedMul(gyroYZ.x, gravnorm.y) + FixedMul(gyroYZ.y, gravnorm.z); // dot product but just yaw and roll + // yes this is backwards intentionally + cmd->angle += ((FixedMul(min(FixedMul(abs(worldYaw), yawRelaxFactor), FV2_Magnitude(&gyroYZ)), deltaseconds)*180)/FRACUNIT) * intsign(worldYaw) * (encoremode ? -1 : 1); + cmd->aiming -= (((FixedMul(gyro.x, deltaseconds)*180)/FRACUNIT)); } } else if (joystickvector.xaxis != 0) @@ -1579,7 +1586,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (spectating) { INT32 mousex = gamekeydown[0][KEY_MOUSEMOVE+3] - gamekeydown[0][KEY_MOUSEMOVE+2]; - cmd->turning -= (mousex * 8) * (encoremode ? -1 : 1); cmd->angle -= (mousex * 8) * (encoremode ? -1 : 1); } @@ -1758,11 +1764,14 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) cmd->turning = KART_FULLTURN; else if (cmd->turning < -KART_FULLTURN) cmd->turning = -KART_FULLTURN; - - if (cmd->angle > KART_FULLTURN) - cmd->angle = KART_FULLTURN; - else if (cmd->angle < -KART_FULLTURN) - cmd->angle = -KART_FULLTURN; + + if (!spectating) + { + if (cmd->angle > KART_FULLTURN) + cmd->angle = KART_FULLTURN; + else if (cmd->angle < -KART_FULLTURN) + cmd->angle = -KART_FULLTURN; + } if (cmd->throwdir > KART_FULLTURN) cmd->throwdir = KART_FULLTURN; diff --git a/src/p_user.c b/src/p_user.c index 0b70e6fbf..882f09c3a 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -2831,7 +2831,7 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) cam->reset_aiming = false; } - cam->angle += cmd->turning << TICCMD_REDUCE; + cam->angle = cmd->angle << TICCMD_REDUCE; // camera movement: if (!cam->button_a_held)