mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'replayfixes' into 'master'
Replay fixes mark whatever See merge request KartKrew/Kart!463
This commit is contained in:
commit
a326e180ca
8 changed files with 54 additions and 27 deletions
|
|
@ -2390,6 +2390,7 @@ void CL_RemovePlayer(INT32 playernum, kickreason_t reason)
|
|||
|
||||
// remove avatar of player
|
||||
playeringame[playernum] = false;
|
||||
demo_extradata[playernum] |= DXD_PLAYSTATE;
|
||||
playernode[playernum] = UINT8_MAX;
|
||||
while (!playeringame[doomcom->numslots-1] && doomcom->numslots > 1)
|
||||
doomcom->numslots--;
|
||||
|
|
|
|||
48
src/g_demo.c
48
src/g_demo.c
|
|
@ -112,6 +112,10 @@ demoghost *ghosts = NULL;
|
|||
#define DF_BREAKTHECAPSULES 0x04 // This demo is from Break the Capsules and contains its final completion time!
|
||||
#define DF_ATTACKMASK 0x06 // This demo is from ??? attack and contains ???
|
||||
|
||||
// 0x08 free
|
||||
|
||||
#define DF_NONETMP 0x10 // multiplayer but not netgame
|
||||
|
||||
#define DF_LUAVARS 0x20 // this demo contains extra lua vars
|
||||
|
||||
#define DF_ATTACKSHIFT 1
|
||||
|
|
@ -304,11 +308,12 @@ void G_ReadDemoExtraData(void)
|
|||
}
|
||||
if (extradata & DXD_PLAYSTATE)
|
||||
{
|
||||
extradata = READUINT8(demo_p);
|
||||
i = READUINT8(demo_p);
|
||||
|
||||
switch (extradata) {
|
||||
switch (i) {
|
||||
case DXD_PST_PLAYING:
|
||||
players[p].pflags |= PF_WANTSTOJOIN; // fuck you
|
||||
//CONS_Printf("player %s is despectating on tic %d\n", player_names[p], leveltime);
|
||||
break;
|
||||
|
||||
case DXD_PST_SPECTATING:
|
||||
|
|
@ -319,9 +324,11 @@ void G_ReadDemoExtraData(void)
|
|||
playeringame[p] = true;
|
||||
G_AddPlayer(p);
|
||||
players[p].spectator = true;
|
||||
//CONS_Printf("player %s is joining server on tic %d\n", player_names[p], leveltime);
|
||||
}
|
||||
else
|
||||
{
|
||||
//CONS_Printf("player %s is spectating on tic %d\n", player_names[p], leveltime);
|
||||
players[p].spectator = true;
|
||||
if (players[p].mo)
|
||||
P_DamageMobj(players[p].mo, NULL, NULL, 1, DMG_INSTAKILL);
|
||||
|
|
@ -343,11 +350,11 @@ void G_ReadDemoExtraData(void)
|
|||
}
|
||||
if (extradata & DXD_WEAPONPREF)
|
||||
{
|
||||
extradata = READUINT8(demo_p);
|
||||
i = READUINT8(demo_p);
|
||||
players[p].pflags &= ~(PF_KICKSTARTACCEL);
|
||||
if (extradata & 1)
|
||||
if (i & 1)
|
||||
players[p].pflags |= PF_KICKSTARTACCEL;
|
||||
//CONS_Printf("weaponpref is %d for player %d\n", extradata, p);
|
||||
//CONS_Printf("weaponpref is %d for player %d\n", i, p);
|
||||
}
|
||||
|
||||
p = READUINT8(demo_p);
|
||||
|
|
@ -366,7 +373,7 @@ void G_ReadDemoExtraData(void)
|
|||
P_SetRandSeed(rng);
|
||||
|
||||
if (demosynced)
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n"));
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (RNG)!\n"));
|
||||
demosynced = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -493,6 +500,7 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||
|
||||
if (!demo_p || !demo.deferstart)
|
||||
return;
|
||||
|
||||
ziptic = READUINT8(demo_p);
|
||||
|
||||
if (ziptic & ZT_FWD)
|
||||
|
|
@ -530,7 +538,7 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum)
|
|||
|
||||
if (cmd->forwardmove != oldcmd[playernum].forwardmove)
|
||||
{
|
||||
WRITEUINT8(demo_p,cmd->forwardmove);
|
||||
WRITESINT8(demo_p,cmd->forwardmove);
|
||||
oldcmd[playernum].forwardmove = cmd->forwardmove;
|
||||
ziptic |= ZT_FWD;
|
||||
}
|
||||
|
|
@ -863,7 +871,12 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
|
|||
|
||||
void G_ConsAllGhostTics(void)
|
||||
{
|
||||
UINT8 p = READUINT8(demo_p);
|
||||
UINT8 p;
|
||||
|
||||
if (!demo_p || !demo.deferstart)
|
||||
return;
|
||||
|
||||
p = READUINT8(demo_p);
|
||||
|
||||
while (p != 0xFF)
|
||||
{
|
||||
|
|
@ -888,8 +901,6 @@ void G_ConsGhostTic(INT32 playernum)
|
|||
mobj_t *testmo;
|
||||
UINT32 syncleeway;
|
||||
|
||||
if (!demo_p || !demo.deferstart)
|
||||
return;
|
||||
if (!(demoflags & DF_GHOST))
|
||||
return; // No ghost data to use.
|
||||
|
||||
|
|
@ -966,7 +977,7 @@ void G_ConsGhostTic(INT32 playernum)
|
|||
if (th != &thlist[THINK_MOBJ] && mobj->health != health) // Wasn't damaged?! This is desync! Fix it!
|
||||
{
|
||||
if (demosynced)
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n"));
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (health)!\n"));
|
||||
demosynced = false;
|
||||
P_DamageMobj(mobj, players[0].mo, players[0].mo, 1, DMG_NORMAL);
|
||||
}
|
||||
|
|
@ -1019,7 +1030,7 @@ void G_ConsGhostTic(INT32 playernum)
|
|||
if (ghostext[playernum].desyncframes >= 2)
|
||||
{
|
||||
if (demosynced)
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n"));
|
||||
CONS_Alert(CONS_WARNING, "Demo playback has desynced (player %s)!\n", player_names[playernum]);
|
||||
demosynced = false;
|
||||
|
||||
P_UnsetThingPosition(testmo);
|
||||
|
|
@ -1042,7 +1053,7 @@ void G_ConsGhostTic(INT32 playernum)
|
|||
|| players[playernum].bumpers != ghostext[playernum].kartbumpers)
|
||||
{
|
||||
if (demosynced)
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced!\n"));
|
||||
CONS_Alert(CONS_WARNING, M_GetText("Demo playback has desynced (item/bumpers)!\n"));
|
||||
demosynced = false;
|
||||
|
||||
players[playernum].itemtype = ghostext[playernum].kartitem;
|
||||
|
|
@ -1921,6 +1932,9 @@ void G_BeginRecording(void)
|
|||
demo_p = demobuffer;
|
||||
demoflags = DF_GHOST|(multiplayer ? DF_MULTIPLAYER : (modeattacking<<DF_ATTACKSHIFT));
|
||||
|
||||
if (multiplayer && !netgame)
|
||||
demoflags |= DF_NONETMP;
|
||||
|
||||
if (encoremode)
|
||||
demoflags |= DF_ENCORE;
|
||||
|
||||
|
|
@ -2838,6 +2852,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
|
||||
modeattacking = (demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT;
|
||||
multiplayer = !!(demoflags & DF_MULTIPLAYER);
|
||||
demo.netgame = (multiplayer && !(demoflags & DF_NONETMP));
|
||||
CON_ToggleOff();
|
||||
|
||||
hu_demotime = UINT32_MAX;
|
||||
|
|
@ -2927,7 +2942,7 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
|
||||
while (p != 0xFF)
|
||||
{
|
||||
if ((spectator = (p & DEMO_SPECTATOR)))
|
||||
if ((spectator = !!(p & DEMO_SPECTATOR)))
|
||||
{
|
||||
p &= ~DEMO_SPECTATOR;
|
||||
|
||||
|
|
@ -2975,6 +2990,11 @@ void G_DoPlayDemo(char *defdemoname)
|
|||
M_Memcpy(player_names[p],demo_p,16);
|
||||
demo_p += 16;
|
||||
|
||||
/*if (players[p].spectator)
|
||||
{
|
||||
CONS_Printf("player %s is spectator at start\n", player_names[p]);
|
||||
}*/
|
||||
|
||||
// Skin
|
||||
M_Memcpy(skin,demo_p,16);
|
||||
demo_p += 16;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ struct demovars_s {
|
|||
boolean inreplayhut; // Go back to replayhut after demos
|
||||
boolean quitafterplaying; // quit after playing a demo from cmdline
|
||||
boolean deferstart; // don't start playing demo right away
|
||||
boolean netgame; // multiplayer netgame
|
||||
|
||||
tic_t savebutton; // Used to determine when the local player can choose to save the replay while the race is still going
|
||||
enum {
|
||||
|
|
|
|||
|
|
@ -2560,7 +2560,7 @@ mapthing_t *G_FindRaceStart(INT32 playernum)
|
|||
if (j == i)
|
||||
continue;
|
||||
|
||||
if (netgame && cv_kartusepwrlv.value)
|
||||
if ((netgame || (demo.playback && demo.netgame)) && cv_kartusepwrlv.value)
|
||||
{
|
||||
if (clientpowerlevels[j][PWRLV_RACE] == clientpowerlevels[i][PWRLV_RACE])
|
||||
num++;
|
||||
|
|
@ -2581,7 +2581,7 @@ mapthing_t *G_FindRaceStart(INT32 playernum)
|
|||
pos++;
|
||||
else
|
||||
{
|
||||
if (netgame && cv_kartusepwrlv.value)
|
||||
if ((netgame || (demo.playback && demo.netgame)) && cv_kartusepwrlv.value)
|
||||
{
|
||||
if (clientpowerlevels[i][PWRLV_RACE] > clientpowerlevels[playernum][PWRLV_RACE])
|
||||
pos++;
|
||||
|
|
@ -3121,7 +3121,7 @@ boolean G_GametypeHasTeams(void)
|
|||
//
|
||||
boolean G_GametypeHasSpectators(void)
|
||||
{
|
||||
return (netgame || (multiplayer && demo.playback));
|
||||
return (netgame || (multiplayer && demo.netgame));
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ void K_TimerReset(void)
|
|||
void K_TimerInit(void)
|
||||
{
|
||||
UINT8 i;
|
||||
UINT8 numPlayers = 0;
|
||||
UINT8 numPlayers = 0;//, numspec = 0;
|
||||
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
|
|
@ -63,6 +63,7 @@ void K_TimerInit(void)
|
|||
|
||||
if (players[i].spectator == true)
|
||||
{
|
||||
//numspec++;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -98,6 +99,7 @@ void K_TimerInit(void)
|
|||
|
||||
// NOW you can try to spawn in the Battle capsules, if there's not enough players for a match
|
||||
K_SpawnBattleCapsules();
|
||||
//CONS_Printf("numbulbs set to %d (%d players, %d spectators) on tic %d\n", numbulbs, numPlayers, numspec, leveltime);
|
||||
}
|
||||
|
||||
UINT32 K_GetPlayerDontDrawFlag(player_t *player)
|
||||
|
|
@ -9440,6 +9442,7 @@ void K_CheckSpectateStatus(void)
|
|||
{
|
||||
if (cv_ingamecap.value && numingame+i >= cv_ingamecap.value) // Hit the in-game player cap while adding people?
|
||||
break;
|
||||
//CONS_Printf("player %s is joining on tic %d\n", player_names[respawnlist[i]], leveltime);
|
||||
P_SpectatorJoinGame(&players[respawnlist[i]]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ SINT8 K_UsingPowerLevels(void)
|
|||
{
|
||||
SINT8 pt = PWRLV_DISABLED;
|
||||
|
||||
if (!cv_kartusepwrlv.value || !netgame || grandprixinfo.gp == true)
|
||||
if (!cv_kartusepwrlv.value || !(netgame || (demo.playback && demo.netgame)) || grandprixinfo.gp == true)
|
||||
{
|
||||
return PWRLV_DISABLED;
|
||||
}
|
||||
|
|
@ -346,7 +346,7 @@ void K_PlayerForfeit(UINT8 playernum, boolean pointloss)
|
|||
|
||||
clientpowerlevels[playernum][powertype] += inc;
|
||||
|
||||
if (playernum == consoleplayer)
|
||||
if (!demo.playback && playernum == consoleplayer)
|
||||
{
|
||||
vspowerlevel[powertype] = clientpowerlevels[playernum][powertype];
|
||||
if (M_UpdateUnlockablesAndExtraEmblems())
|
||||
|
|
|
|||
|
|
@ -1058,6 +1058,9 @@ boolean P_IsLocalPlayer(player_t *player)
|
|||
{
|
||||
UINT8 i;
|
||||
|
||||
if (demo.playback)
|
||||
return P_IsDisplayPlayer(player);
|
||||
|
||||
for (i = 0; i <= r_splitscreen; i++) // DON'T skip P1
|
||||
{
|
||||
if (player == &players[g_localplayers[i]])
|
||||
|
|
@ -4369,6 +4372,7 @@ void P_PlayerThink(player_t *player)
|
|||
player->flashing = TICRATE/2 + 1;
|
||||
/*if (P_SpectatorJoinGame(player))
|
||||
return; // player->mo was removed.*/
|
||||
//CONS_Printf("player %s wants to join on tic %d\n", player_names[player-players], leveltime);
|
||||
}
|
||||
|
||||
if (player->respawn.state != RESPAWNST_NONE)
|
||||
|
|
|
|||
|
|
@ -481,7 +481,7 @@ void Y_IntermissionDrawer(void)
|
|||
else
|
||||
hilicol = ((intertype == int_race) ? V_SKYMAP : V_REDMAP);
|
||||
|
||||
if (sorttic != -1 && intertic > sorttic && !demo.playback)
|
||||
if (sorttic != -1 && intertic > sorttic && multiplayer)
|
||||
{
|
||||
INT32 count = (intertic - sorttic);
|
||||
|
||||
|
|
@ -586,7 +586,7 @@ void Y_IntermissionDrawer(void)
|
|||
|
||||
y2 = y;
|
||||
|
||||
if (netgame && playerconsole[data.num[i]] == 0 && server_lagless && !players[data.num[i]].bot)
|
||||
if ((netgame || (demo.playback && demo.netgame)) && playerconsole[data.num[i]] == 0 && server_lagless && !players[data.num[i]].bot)
|
||||
{
|
||||
static int alagles_timer = 0;
|
||||
patch_t *alagles;
|
||||
|
|
@ -799,7 +799,7 @@ void Y_Ticker(void)
|
|||
|
||||
if (intertype == int_race || intertype == int_battle)
|
||||
{
|
||||
if (!(multiplayer && demo.playback)) // Don't advance to rankings in replays
|
||||
//if (!(multiplayer && demo.playback)) // Don't advance to rankings in replays
|
||||
{
|
||||
if (!data.rankingsmode && (intertic >= sorttic + 8))
|
||||
{
|
||||
|
|
@ -868,8 +868,6 @@ void Y_Ticker(void)
|
|||
endtic = intertic + 3*TICRATE; // 3 second pause after end of tally
|
||||
}
|
||||
}
|
||||
else if (!(intertic & 1))
|
||||
S_StartSound(NULL, sfx_ptally); // tally sound effect
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1013,7 +1011,7 @@ static void K_UpdatePowerLevels(void)
|
|||
data.increase[i] = increment[i];
|
||||
clientpowerlevels[i][powertype] += data.increase[i];
|
||||
|
||||
if (i == consoleplayer)
|
||||
if (!demo.playback && i == consoleplayer)
|
||||
{
|
||||
CONS_Debug(DBG_GAMELOGIC, "Player %d is you! Saving...\n", i);
|
||||
vspowerlevel[powertype] = clientpowerlevels[i][powertype];
|
||||
|
|
@ -1069,7 +1067,7 @@ void Y_StartIntermission(void)
|
|||
{
|
||||
if (cv_inttime.value == 0)
|
||||
timer = 0;
|
||||
else if (demo.playback) // Override inttime (which is pulled from the replay anyway
|
||||
else if (demo.playback && !multiplayer) // Override inttime (which is pulled from the replay anyway
|
||||
timer = 10*TICRATE;
|
||||
else
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue