distancetofinishprev related stuff

This commit is contained in:
NepDisk 2024-09-02 07:42:33 -04:00
parent fa09c1beea
commit 8de69a20c7
5 changed files with 48 additions and 4 deletions

View file

@ -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

View file

@ -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

View file

@ -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"))

View file

@ -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);

View file

@ -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);
}
//