mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'vote-anger-fix' into 'master'
Fix map anger race condition See merge request KartKrew/Kart!2447
This commit is contained in:
commit
323452df73
4 changed files with 33 additions and 20 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
20
src/k_vote.c
20
src/k_vote.c
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue