distancetofinishprev related stuff
This commit is contained in:
parent
fa09c1beea
commit
8de69a20c7
5 changed files with 48 additions and 4 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
Loading…
Reference in a new issue