diff --git a/src/d_clisrv.c b/src/d_clisrv.c index da80b29a4..954416098 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -574,6 +574,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->kartstuff[j] = LONG(players[i].kartstuff[j]); // SRB2kart rsp->frameangle = (angle_t)LONG(players[i].frameangle); // SRB2kart + rsp->airtime = (tic_t)LONG(players[i].airtime); // Score is resynched in the rspfirm resync packet rsp->health = 0; // resynched with mo health @@ -693,6 +694,7 @@ static void resynch_read_player(resynch_pak *rsp) players[i].kartstuff[j] = LONG(rsp->kartstuff[j]); // SRB2kart players[i].frameangle = (angle_t)LONG(rsp->frameangle); // SRB2kart + players[i].airtime = (tic_t)LONG(rsp->airtime); // Score is resynched in the rspfirm resync packet players[i].health = rsp->health; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index e0d6cd892..f7ded4c2b 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -215,6 +215,7 @@ typedef struct INT32 kartstuff[NUMKARTSTUFF]; // SRB2kart angle_t frameangle; // SRB2kart + tic_t airtime; // Score is resynched in the confirm resync packet INT32 health; diff --git a/src/d_player.h b/src/d_player.h index 60b5ca9bc..1f510c035 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -477,7 +477,8 @@ typedef struct player_s INT16 rturn_max[MAXPREDICTTICS]; // Ditto but for full-right UINT32 distancetofinish; waypoint_t *nextwaypoint; - respawnvars_t respawnvars; // SRB2Kart: respawn info + respawnvars_t respawnvars; // Respawn info + tic_t airtime; // Keep track of how long you've been in the air // Bit flags. // See pflags_t, above. diff --git a/src/k_respawn.c b/src/k_respawn.c index 7a828c59d..524e21fc7 100644 --- a/src/k_respawn.c +++ b/src/k_respawn.c @@ -110,8 +110,9 @@ void K_DoIngameRespawn(player_t *player) // Set up respawn position if invalid if (player->respawnvars.wp != NULL) { + const UINT32 dist = RESPAWN_DIST + (player->airtime * 32); + player->respawnvars.distanceleft = (dist * mapobjectscale) / FRACUNIT; K_RespawnAtWaypoint(player, player->respawnvars.wp); - player->respawnvars.distanceleft = (RESPAWN_DIST * mapobjectscale) / FRACUNIT; } else { diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index d5a610576..1eb1e3d5f 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -216,6 +216,8 @@ static int player_get(lua_State *L) LUA_PushUserdata(L, plr->kartstuff, META_KARTSTUFF); else if (fastcmp(field,"frameangle")) lua_pushangle(L, plr->frameangle); + else if (fastcmp(field,"airtime")) + lua_pushinteger(L, plr->airtime); else if (fastcmp(field,"pflags")) lua_pushinteger(L, plr->pflags); else if (fastcmp(field,"panim")) @@ -473,6 +475,8 @@ static int player_set(lua_State *L) return NOSET; else if (fastcmp(field,"frameangle")) plr->frameangle = luaL_checkangle(L, 3); + else if (fastcmp(field,"airtime")) + plr->airtime = (tic_t)luaL_checkinteger(L, 3); else if (fastcmp(field,"kartspeed")) plr->kartspeed = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"kartweight")) diff --git a/src/p_saveg.c b/src/p_saveg.c index f873c2fdf..e343cb651 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -278,6 +278,7 @@ static void P_NetArchivePlayers(void) WRITEUINT32(save_p, players[i].distancetofinish); WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].nextwaypoint)); + WRITEUINT32(save_p, players[i].airtime); } } @@ -443,6 +444,7 @@ static void P_NetUnArchivePlayers(void) players[i].distancetofinish = READUINT32(save_p); players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save_p); + players[i].airtime = READUINT32(save_p); } } diff --git a/src/p_user.c b/src/p_user.c index a11e472b2..be0cd41db 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8361,16 +8361,6 @@ void P_PlayerThink(player_t *player) player->awayviewtics = 0; // reset to zero } - /* - if (player->pflags & PF_GLIDING) - { - if (player->panim != PA_ABILITY) - P_SetPlayerMobjState(player->mo, S_PLAY_ABL1); - } - else if ((player->pflags & PF_JUMPED) && !player->powers[pw_super] && player->panim != PA_ROLL && player->charability2 == CA2_SPINDASH) - P_SetPlayerMobjState(player->mo, S_PLAY_ATK1); - */ - if (player->flashcount) player->flashcount--; @@ -8383,21 +8373,33 @@ void P_PlayerThink(player_t *player) // The timer might've reached zero, but we'll run the remote view camera anyway by setting it to -1. } + // Track airtime + if (P_IsObjectOnGround(player->mo)) + { + player->airtime = 0; + } + else + { + player->airtime++; + } + cmd = &player->cmd; // SRB2kart // Save the dir the player is holding // to allow items to be thrown forward or backward. if (cmd->buttons & BT_FORWARD) + { player->kartstuff[k_throwdir] = 1; + } else if (cmd->buttons & BT_BACKWARD) + { player->kartstuff[k_throwdir] = -1; + } else + { player->kartstuff[k_throwdir] = 0; - - // Add some extra randomization. - if (cmd->forwardmove) - P_RandomFixed(); + } #ifdef PARANOIA if (player->playerstate == PST_REBORN) @@ -8531,15 +8533,9 @@ void P_PlayerThink(player_t *player) // SRB2kart 010217 if (leveltime < starttime) - player->powers[pw_nocontrol] = 2; - /* - if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE) { - cmd->buttons &= BT_BRAKE; // Remove all buttons except BT_BRAKE - cmd->forwardmove = 0; - cmd->sidemove = 0; + player->powers[pw_nocontrol] = 2; } - */ // Synchronizes the "real" amount of time spent in the level. if (!player->exiting)