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