Merge branch 'vote-anger-fix' into 'master'

Fix map anger race condition

See merge request KartKrew/Kart!2447
This commit is contained in:
Sal 2024-10-18 01:13:42 +00:00
commit 323452df73
4 changed files with 33 additions and 20 deletions

View file

@ -2292,13 +2292,12 @@ void D_ModifyClientVote(UINT8 player, SINT8 voted)
SendNetXCmdForPlayer(sendPlayer, XD_MODIFYVOTE, buf, p - buf);
}
void D_PickVote(void)
void D_PickVote(SINT8 angry_map)
{
char buf[2];
char buf[3];
char* p = buf;
SINT8 temppicks[VOTE_TOTAL];
SINT8 templevels[VOTE_TOTAL];
SINT8 votecompare = VOTE_NOT_PICKED;
UINT8 numvotes = 0, key = 0;
INT32 i;
@ -2309,16 +2308,23 @@ void D_PickVote(void)
continue;
}
if (i == VOTE_SPECIAL && angry_map != VOTE_NOT_PICKED)
{
// Anger map is going to change because of
// the vote ending. We need to account for this
// here because a net command would not be ready
// in time for this code.
temppicks[numvotes] = i;
templevels[numvotes] = angry_map;
numvotes++;
continue;
}
if (g_votes[i] != VOTE_NOT_PICKED)
{
temppicks[numvotes] = i;
templevels[numvotes] = g_votes[i];
numvotes++;
if (votecompare == VOTE_NOT_PICKED)
{
votecompare = g_votes[i];
}
}
}
@ -2327,14 +2333,16 @@ void D_PickVote(void)
key = M_RandomKey(numvotes);
WRITESINT8(p, temppicks[key]);
WRITESINT8(p, templevels[key]);
WRITESINT8(p, angry_map);
}
else
{
WRITESINT8(p, VOTE_NOT_PICKED);
WRITESINT8(p, 0);
WRITESINT8(p, VOTE_NOT_PICKED);
}
SendNetXCmd(XD_PICKVOTE, &buf, 2);
SendNetXCmd(XD_PICKVOTE, &buf, 3);
}
static char *
@ -5410,6 +5418,7 @@ static void Got_PickVotecmd(const UINT8 **cp, INT32 playernum)
{
SINT8 pick = READSINT8(*cp);
SINT8 level = READSINT8(*cp);
SINT8 anger = READSINT8(*cp);
if (playernum != serverplayer && !IsPlayerAdmin(playernum))
{
@ -5419,7 +5428,7 @@ static void Got_PickVotecmd(const UINT8 **cp, INT32 playernum)
return;
}
Y_SetupVoteFinish(pick, level);
Y_SetupVoteFinish(pick, level, anger);
}
static void Got_ScheduleTaskcmd(const UINT8 **cp, INT32 playernum)

View file

@ -207,7 +207,7 @@ void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function any
void D_MapChange(UINT16 pmapnum, INT32 pgametype, boolean pencoremode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pforcespecialstage);
void D_SetupVote(INT16 newgametype);
void D_ModifyClientVote(UINT8 player, SINT8 voted);
void D_PickVote(void);
void D_PickVote(SINT8 angry_map);
void ObjectPlace_OnChange(void);
void P_SetPlayerSpectator(INT32 playernum);
boolean IsPlayerAdmin(INT32 playernum);

View file

@ -1352,7 +1352,7 @@ static void Y_TickVoteRoulette(void)
}
}
static void Y_TryMapAngerVote(void)
static SINT8 Y_TryMapAngerVote(void)
{
SINT8 angryMaps[VOTE_NUM_LEVELS] = { -1 };
size_t angryMapsCount = 0;
@ -1381,7 +1381,7 @@ static void Y_TryMapAngerVote(void)
if (numPlayers < 3)
{
// Don't handle map anger if there's not enough players.
return;
return VOTE_NOT_PICKED;
}
for (i = 0; i < VOTE_NUM_LEVELS; i++)
@ -1409,12 +1409,12 @@ static void Y_TryMapAngerVote(void)
if (angryMapsCount == 0)
{
return;
return VOTE_NOT_PICKED;
}
// Set the special vote to a random angry map.
pick = M_RandomKey(angryMapsCount);
D_ModifyClientVote(UINT8_MAX, angryMaps[pick]);
return angryMaps[pick];
}
static void Y_TickVoteSelection(void)
@ -1542,8 +1542,7 @@ static void Y_TickVoteSelection(void)
if (server)
{
Y_TryMapAngerVote();
D_PickVote();
D_PickVote( Y_TryMapAngerVote() );
}
}
}
@ -1593,7 +1592,7 @@ void Y_VoteTicker(void)
if (server && g_pickedVote != VOTE_NOT_PICKED && g_votes[g_pickedVote] == VOTE_NOT_PICKED) // Uh oh! The person who got picked left! Recalculate, quick!
{
D_PickVote();
D_PickVote( VOTE_NOT_PICKED );
}
if (vote.tic == 0)
@ -1849,13 +1848,18 @@ enum
VOTE_END_NORMAL,
};
void Y_SetupVoteFinish(SINT8 pick, SINT8 level)
void Y_SetupVoteFinish(SINT8 pick, SINT8 level, SINT8 anger)
{
if (vote.loaded == false)
{
return;
}
if (anger != VOTE_NOT_PICKED)
{
Y_SetPlayersVote(VOTE_SPECIAL, anger);
}
if (pick == VOTE_NOT_PICKED || level == VOTE_NOT_PICKED) // No other votes? We gotta get out of here, then!
{
Y_EndVote();

View file

@ -31,7 +31,7 @@ void Y_VoteDrawer(void);
void Y_VoteTicker(void);
void Y_StartVote(void);
void Y_EndVote(void);
void Y_SetupVoteFinish(SINT8 pick, SINT8 level);
void Y_SetupVoteFinish(SINT8 pick, SINT8 level, SINT8 anger);
#ifdef __cplusplus
} // extern "C"