mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Rearrange P_PlayerThink to make some things occur even in Hitlag
Notably REALTIME - prevents the timer stopping when you get hit, but also: - Typing indicator - Airtime tracking - Kickstart accel - No Contesting due to racecountdown - Spectator data wipe - Stronger preventative measure for possible finish line multi-hit events
This commit is contained in:
parent
287c018790
commit
ec437b199c
1 changed files with 97 additions and 89 deletions
186
src/p_user.c
186
src/p_user.c
|
|
@ -3861,8 +3861,6 @@ void P_PlayerThink(player_t *player)
|
||||||
|
|
||||||
player->old_drawangle = player->drawangle;
|
player->old_drawangle = player->drawangle;
|
||||||
|
|
||||||
player->pflags &= ~PF_HITFINISHLINE;
|
|
||||||
|
|
||||||
if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj))
|
if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj))
|
||||||
{
|
{
|
||||||
P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid
|
P_SetTarget(&player->awayviewmobj, NULL); // remove awayviewmobj asap if invalid
|
||||||
|
|
@ -3875,11 +3873,6 @@ void P_PlayerThink(player_t *player)
|
||||||
if (player->awayviewtics && player->awayviewtics != -1)
|
if (player->awayviewtics && player->awayviewtics != -1)
|
||||||
player->awayviewtics--;
|
player->awayviewtics--;
|
||||||
|
|
||||||
if (player->mo->hitlag > 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Track airtime
|
// Track airtime
|
||||||
if (P_IsObjectOnGround(player->mo)
|
if (P_IsObjectOnGround(player->mo)
|
||||||
&& !P_PlayerInPain(player)) // This isn't airtime, but it's control loss all the same.
|
&& !P_PlayerInPain(player)) // This isn't airtime, but it's control loss all the same.
|
||||||
|
|
@ -3980,29 +3973,6 @@ void P_PlayerThink(player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check water content, set stuff in mobj
|
|
||||||
P_MobjCheckWater(player->mo);
|
|
||||||
|
|
||||||
#ifndef SECTORSPECIALSAFTERTHINK
|
|
||||||
if (player->onconveyor != 1 || !P_IsObjectOnGround(player->mo))
|
|
||||||
player->onconveyor = 0;
|
|
||||||
// check special sectors : damage & secrets
|
|
||||||
|
|
||||||
if (!player->spectator)
|
|
||||||
P_PlayerInSpecialSector(player);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (player->playerstate == PST_DEAD)
|
|
||||||
{
|
|
||||||
if (player->spectator)
|
|
||||||
player->mo->renderflags |= RF_GHOSTLY;
|
|
||||||
else
|
|
||||||
player->mo->renderflags &= ~RF_GHOSTLYMASK;
|
|
||||||
P_DeathThink(player);
|
|
||||||
LUA_HookPlayer(player, HOOK(PlayerThink));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure spectators always have a score and ring count of 0.
|
// Make sure spectators always have a score and ring count of 0.
|
||||||
if (player->spectator)
|
if (player->spectator)
|
||||||
{
|
{
|
||||||
|
|
@ -4039,7 +4009,103 @@ void P_PlayerThink(player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((netgame || multiplayer) && player->spectator && cmd->buttons & BT_ATTACK && !player->flashing)
|
if (cmd->flags & TICCMD_TYPING)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
typing_duration is slow to start and slow to stop.
|
||||||
|
|
||||||
|
typing_timer counts down a grace period before the player is not
|
||||||
|
actually considered typing anymore.
|
||||||
|
*/
|
||||||
|
if (cmd->flags & TICCMD_KEYSTROKE)
|
||||||
|
{
|
||||||
|
/* speed up if we are typing quickly! */
|
||||||
|
if (player->typing_duration > 0 && player->typing_timer > 12)
|
||||||
|
{
|
||||||
|
if (player->typing_duration < 16)
|
||||||
|
{
|
||||||
|
player->typing_duration = 24;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* slows down a tiny bit as it approaches the next dot */
|
||||||
|
const UINT8 step = (((player->typing_duration + 15) & ~15) -
|
||||||
|
player->typing_duration) / 2;
|
||||||
|
player->typing_duration += max(step, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
player->typing_timer = 15;
|
||||||
|
}
|
||||||
|
else if (player->typing_timer > 0)
|
||||||
|
{
|
||||||
|
player->typing_timer--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we are in the grace period (including currently typing) */
|
||||||
|
if (player->typing_timer + player->typing_duration > 0)
|
||||||
|
{
|
||||||
|
/* always end the cycle on two dots */
|
||||||
|
if (player->typing_timer == 0 &&
|
||||||
|
(player->typing_duration < 16 || player->typing_duration == 40))
|
||||||
|
{
|
||||||
|
player->typing_duration = 0;
|
||||||
|
}
|
||||||
|
else if (player->typing_duration < 63)
|
||||||
|
{
|
||||||
|
player->typing_duration++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->typing_duration = 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
player->typing_timer = 0;
|
||||||
|
player->typing_duration = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------ /
|
||||||
|
ALL ABOVE THIS BLOCK OCCURS EVEN WITH HITLAG
|
||||||
|
/ ------------------------------------------ */
|
||||||
|
|
||||||
|
if (player->mo->hitlag > 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------ /
|
||||||
|
ALL BELOW THIS BLOCK IS STOPPED DURING HITLAG
|
||||||
|
/ ------------------------------------------ */
|
||||||
|
|
||||||
|
player->pflags &= ~PF_HITFINISHLINE;
|
||||||
|
|
||||||
|
// check water content, set stuff in mobj
|
||||||
|
P_MobjCheckWater(player->mo);
|
||||||
|
|
||||||
|
#ifndef SECTORSPECIALSAFTERTHINK
|
||||||
|
if (player->onconveyor != 1 || !P_IsObjectOnGround(player->mo))
|
||||||
|
player->onconveyor = 0;
|
||||||
|
// check special sectors : damage & secrets
|
||||||
|
|
||||||
|
if (!player->spectator)
|
||||||
|
P_PlayerInSpecialSector(player);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (player->playerstate == PST_DEAD)
|
||||||
|
{
|
||||||
|
if (player->spectator)
|
||||||
|
player->mo->renderflags |= RF_GHOSTLY;
|
||||||
|
else
|
||||||
|
player->mo->renderflags &= ~RF_GHOSTLYMASK;
|
||||||
|
P_DeathThink(player);
|
||||||
|
LUA_HookPlayer(player, HOOK(PlayerThink));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((netgame || multiplayer) && player->spectator && !player->bot && cmd->buttons & BT_ATTACK && !player->flashing)
|
||||||
{
|
{
|
||||||
player->pflags ^= PF_WANTSTOJOIN;
|
player->pflags ^= PF_WANTSTOJOIN;
|
||||||
player->flashing = TICRATE/2 + 1;
|
player->flashing = TICRATE/2 + 1;
|
||||||
|
|
@ -4121,64 +4187,6 @@ void P_PlayerThink(player_t *player)
|
||||||
player->mo->renderflags &= ~RF_DONTDRAW;
|
player->mo->renderflags &= ~RF_DONTDRAW;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->flags & TICCMD_TYPING)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
typing_duration is slow to start and slow to stop.
|
|
||||||
|
|
||||||
typing_timer counts down a grace period before the player is not
|
|
||||||
actually considered typing anymore.
|
|
||||||
*/
|
|
||||||
if (cmd->flags & TICCMD_KEYSTROKE)
|
|
||||||
{
|
|
||||||
/* speed up if we are typing quickly! */
|
|
||||||
if (player->typing_duration > 0 && player->typing_timer > 12)
|
|
||||||
{
|
|
||||||
if (player->typing_duration < 16)
|
|
||||||
{
|
|
||||||
player->typing_duration = 24;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* slows down a tiny bit as it approaches the next dot */
|
|
||||||
const UINT8 step = (((player->typing_duration + 15) & ~15) -
|
|
||||||
player->typing_duration) / 2;
|
|
||||||
player->typing_duration += max(step, 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
player->typing_timer = 15;
|
|
||||||
}
|
|
||||||
else if (player->typing_timer > 0)
|
|
||||||
{
|
|
||||||
player->typing_timer--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we are in the grace period (including currently typing) */
|
|
||||||
if (player->typing_timer + player->typing_duration > 0)
|
|
||||||
{
|
|
||||||
/* always end the cycle on two dots */
|
|
||||||
if (player->typing_timer == 0 &&
|
|
||||||
(player->typing_duration < 16 || player->typing_duration == 40))
|
|
||||||
{
|
|
||||||
player->typing_duration = 0;
|
|
||||||
}
|
|
||||||
else if (player->typing_duration < 63)
|
|
||||||
{
|
|
||||||
player->typing_duration++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->typing_duration = 16;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->typing_timer = 0;
|
|
||||||
player->typing_duration = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->stairjank > 0)
|
if (player->stairjank > 0)
|
||||||
{
|
{
|
||||||
player->stairjank--;
|
player->stairjank--;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue