diff --git a/src/d_player.h b/src/d_player.h index d88fd47cb..86f3b0420 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -372,6 +372,7 @@ typedef struct player_s UINT8 oldposition; // Used for taunting when you pass someone UINT8 positiondelay; // Used for position number, so it can grow when passing/being passed UINT32 distancetofinish; + UINT32 distancetofinishprev; waypoint_t *currentwaypoint; waypoint_t *nextwaypoint; tic_t airtime; // Keep track of how long you've been in the air diff --git a/src/k_kart.c b/src/k_kart.c index 0bdc61aef..415a7d822 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7527,11 +7527,12 @@ static void K_UpdatePlayerWaypoints(player_t *const player) boolean updaterespawn = K_SetPlayerNextWaypoint(player); // Update prev value (used for grief prevention code) + player->distancetofinishprev = player->distancetofinish; K_UpdateDistanceFromFinishLine(player); // Respawning should be a full reset. UINT32 delta = u32_delta(player->distancetofinish, player->distancetofinishprev); - if (player->respawn.state == RESPAWNST_NONE && delta > distance_threshold) + if (!player->respawn && delta > distance_threshold) { CONS_Debug(DBG_GAMELOGIC, "Player %s: waypoint ID %d too far away (%u > %u)\n", sizeu1(player - players), K_GetWaypointID(player->nextwaypoint), delta, distance_threshold); @@ -7539,7 +7540,7 @@ static void K_UpdatePlayerWaypoints(player_t *const player) // Distance jump is too great, keep the old waypoints and recalculate distance. player->currentwaypoint = old_currentwaypoint; player->nextwaypoint = old_nextwaypoint; - K_UpdateDistanceFromFinishLine(player); + player->distancetofinish = player->distancetofinishprev; } // Respawn point should only be updated when we're going to a nextwaypoint diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 061f0ffc5..84528f94b 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -226,6 +226,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->nextcheck); else if (fastcmp(field,"distancetofinish")) lua_pushinteger(L, plr->distancetofinish); + else if (fastcmp(field,"distancetofinishprev")) + lua_pushinteger(L, plr->distancetofinishprev); else if (fastcmp(field,"airtime")) lua_pushinteger(L, plr->airtime); else if (fastcmp(field,"flashing")) @@ -576,6 +578,8 @@ static int player_set(lua_State *L) plr->nextcheck = luaL_checkinteger(L, 3); else if (fastcmp(field,"distancetofinish")) return NOSET; + else if (fastcmp(field,"distancetofinishprev")) + return NOSET; else if (fastcmp(field,"airtime")) plr->airtime = luaL_checkinteger(L, 3); else if (fastcmp(field,"flashing")) diff --git a/src/p_saveg.c b/src/p_saveg.c index de082442d..507eabe6c 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -254,6 +254,7 @@ static void P_NetArchivePlayers(void) WRITEUINT8(save_p, players[i].oldposition); WRITEUINT8(save_p, players[i].positiondelay); WRITEUINT32(save_p, players[i].distancetofinish); + WRITEUINT32(save_p, players[i].distancetofinishprev); WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].currentwaypoint)); WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].nextwaypoint)); WRITEUINT32(save_p, players[i].airtime); @@ -521,6 +522,7 @@ static void P_NetUnArchivePlayers(void) players[i].oldposition = READUINT8(save_p); players[i].positiondelay = READUINT8(save_p); players[i].distancetofinish = READUINT32(save_p); + players[i].distancetofinishprev = READUINT32(save_p); players[i].currentwaypoint = (waypoint_t *)(size_t)READUINT32(save_p); players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save_p); players[i].airtime = READUINT32(save_p); diff --git a/src/p_sight.c b/src/p_sight.c index 3a1748c47..f6e700999 100644 --- a/src/p_sight.c +++ b/src/p_sight.c @@ -446,15 +446,45 @@ static boolean P_CanWaypointTraverse(seg_t *seg, divline_t *divl, register los_t } // calculate fractional intercept (how far along we are divided by how far we are from t2) - frac = P_InterceptVector2(&los->strace, divl); + frac = P_InterceptVector(&los->strace, divl); // calculate position at intercept tmx = los->strace.x + FixedMul(los->strace.dx, frac); tmy = los->strace.y + FixedMul(los->strace.dy, frac); + // set openrange, opentop, openbottom + open.fofType = (flip ? LO_FOF_CEILINGS : LO_FOF_FLOORS); P_LineOpening(line, los->t1, &open); maxstep = P_GetThingStepUp(los->t1, tmx, tmy); +#if 0 + if (los->t2->type == MT_WAYPOINT) + { + waypoint_t *wp = K_SearchWaypointHeapForMobj(los->t2); + + if (wp != NULL) + { + CONS_Printf( + "========\nID: %d\nrange: %.2f >= %.2f\n", + K_GetWaypointID(wp), + FIXED_TO_FLOAT(open.range), + FIXED_TO_FLOAT(los->t1->height) + ); + + if (open.range >= los->t1->height) + { + CONS_Printf( + "floor: %.2f\nlowfloor: %.2f\nstep: %.2f <= %.2f\n", + FIXED_TO_FLOAT(open.floor), + FIXED_TO_FLOAT(open.lowfloor), + FIXED_TO_FLOAT(open.floor - open.lowfloor), + FIXED_TO_FLOAT(maxstep) + ); + } + } + } +#endif + if (open.range < los->t1->height) { // Can't fit @@ -467,7 +497,13 @@ static boolean P_CanWaypointTraverse(seg_t *seg, divline_t *divl, register los_t // Or if we're on the higher side... canDropOff = (flip ? (los->t1->z + los->t1->height <= open.ceiling) : (los->t1->z >= open.floor)); - return (canStepUp || canDropOff); + if (canStepUp || canDropOff) + { + return true; + } + + los->traversed++; + return (los->traversed < TRAVERSE_MAX); } //