fix how the custom rank is managed (it also fix no time when player disconnect)
This commit is contained in:
		@@ -238,6 +238,11 @@ Race::SetRespawnBehaviour(Race::C_RespawnBehaviour_AlwaysGiveUp);
 | 
				
			|||||||
CarRank::Reset();
 | 
					CarRank::Reset();
 | 
				
			||||||
***
 | 
					***
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					***Match_InitRound***
 | 
				
			||||||
 | 
					***
 | 
				
			||||||
 | 
					declare Boolean ThrottleUpdate;
 | 
				
			||||||
 | 
					***
 | 
				
			||||||
 | 
					
 | 
				
			||||||
***Match_StartRound***
 | 
					***Match_StartRound***
 | 
				
			||||||
***
 | 
					***
 | 
				
			||||||
Scores::Clear();
 | 
					Scores::Clear();
 | 
				
			||||||
@@ -310,48 +315,40 @@ foreach (Player in ShuffledPlayers) {
 | 
				
			|||||||
	MalusQueue[Player.User.Login] = GetNewMalus(C_Malus_Reset, 1500);
 | 
						MalusQueue[Player.User.Login] = GetNewMalus(C_Malus_Reset, 1500);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Net_NBPlayers = AccountIdsOfPlayers.count;
 | 
					UIModules_ScoresTable::DisplayOnly(AccountIdsOfPlayers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
StateMgr::ForcePlayersStates([StateMgr::C_State_Playing]);
 | 
					StateMgr::ForcePlayersStates([StateMgr::C_State_Playing]);
 | 
				
			||||||
Race::EnableIntroDuringMatch(False);
 | 
					Race::EnableIntroDuringMatch(False);
 | 
				
			||||||
UIManager.UIAll.SendChat("$<$ff3$> Stay the most time on the structure. $<$ff9GL HF!$>");
 | 
					UIManager.UIAll.SendChat("$<$ff3$> Stay the most time on the structure. $<$ff9GL HF!$>");
 | 
				
			||||||
***
 | 
					***
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/***Match_InitPlayLoop***
 | 
					 | 
				
			||||||
***
 | 
					 | 
				
			||||||
MalusQueue = [];
 | 
					 | 
				
			||||||
***/
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
***Match_PlayLoop***
 | 
					***Match_PlayLoop***
 | 
				
			||||||
***
 | 
					***
 | 
				
			||||||
// Manage race events
 | 
					// Manage race events
 | 
				
			||||||
declare RacePendingEvents = Race::GetPendingEvents();
 | 
					declare Events::K_RaceEvent[] RacePendingEvents = Race::GetPendingEvents();
 | 
				
			||||||
foreach (Event in RacePendingEvents) {
 | 
					foreach (Event in RacePendingEvents) {
 | 
				
			||||||
	Race::ValidEvent(Event);
 | 
						Race::ValidEvent(Event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Event.Player == Null) continue;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	// Waypoint
 | 
						// Waypoint
 | 
				
			||||||
	if (Event.Type == Events::C_Type_Waypoint) {
 | 
						switch (Event.Type) {
 | 
				
			||||||
		if (Event.IsEndLap) {
 | 
							case Events::C_Type_Waypoint: {
 | 
				
			||||||
 | 
								ThrottleUpdate = True;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Scores::UpdatePlayerBestRaceIfBetter(Event.Player);
 | 
				
			||||||
			Race::StopSkipOutro(Event.Player);
 | 
								Race::StopSkipOutro(Event.Player);
 | 
				
			||||||
			foreach (Player in Players) { 
 | 
								UpdateCustomRanking(Event.Player.User, False);
 | 
				
			||||||
				CarRank::SetRank(Player, PlayersNbAlive);
 | 
					 | 
				
			||||||
				Net_PlayersNbAlive = PlayersNbAlive;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			UpdateCustomRanking(Event.Player, Event.Type);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else if (Event.Type == Events::C_Type_GiveUp) {
 | 
							case Events::C_Type_GiveUp: {
 | 
				
			||||||
		foreach (Player in Players) { 
 | 
								ThrottleUpdate = True;
 | 
				
			||||||
			CarRank::SetRank(Player, PlayersNbAlive);
 | 
								UpdateCustomRanking(Event.Player.User, True);
 | 
				
			||||||
			Net_PlayersNbAlive = PlayersNbAlive;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		UpdateCustomRanking(Event.Player, Event.Type);
 | 
							case Events::C_Type_Eliminated: {
 | 
				
			||||||
	} else if (Event.Type == Events::C_Type_Eliminated) {
 | 
								ThrottleUpdate = True;
 | 
				
			||||||
		Race::StopSkipOutro(Event.Player);
 | 
								UpdateCustomRanking(Event.Player.User, True);
 | 
				
			||||||
		foreach (Player in Players) { 
 | 
					 | 
				
			||||||
			CarRank::SetRank(Player, PlayersNbAlive);
 | 
					 | 
				
			||||||
			Net_PlayersNbAlive = PlayersNbAlive;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		UpdateCustomRanking(Event.Player, Event.Type);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -359,6 +356,13 @@ foreach (Event in RacePendingEvents) {
 | 
				
			|||||||
foreach (Event in PendingEvents) {
 | 
					foreach (Event in PendingEvents) {
 | 
				
			||||||
	if (Event.HasBeenPassed || Event.HasBeenDiscarded) continue;
 | 
						if (Event.HasBeenPassed || Event.HasBeenDiscarded) continue;
 | 
				
			||||||
	Events::Invalid(Event);
 | 
						Events::Invalid(Event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (Event.Type == CSmModeEvent::EType::OnPlayerRemoved) {
 | 
				
			||||||
 | 
							if (Event.User == Null ) continue;
 | 
				
			||||||
 | 
							if (!AccountIdsOfPlayers.exists(Event.User.WebServicesUserId)) continue;
 | 
				
			||||||
 | 
							ThrottleUpdate = True;
 | 
				
			||||||
 | 
							UpdateCustomRanking(Event.User, True);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if (PlayersNbAlive <= 1 && AccountIdsOfPlayers.count >= 2) { //TODO just respawn in case of 1 player
 | 
					if (PlayersNbAlive <= 1 && AccountIdsOfPlayers.count >= 2) { //TODO just respawn in case of 1 player
 | 
				
			||||||
@@ -366,6 +370,18 @@ if (PlayersNbAlive <= 1 && AccountIdsOfPlayers.count >= 2) { //TODO just respawn
 | 
				
			|||||||
	MB_StopRound();
 | 
						MB_StopRound();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (ThrottleUpdate) {
 | 
				
			||||||
 | 
						ThrottleUpdate = False;
 | 
				
			||||||
 | 
						Net_PlayersNbAlive = PlayersNbAlive;
 | 
				
			||||||
 | 
						declare Integer Points = Net_NBPlayers - Net_PlayersNbAlive;
 | 
				
			||||||
 | 
						foreach (Player in Players) { 
 | 
				
			||||||
 | 
							CarRank::SetRank(Player, PlayersNbAlive);
 | 
				
			||||||
 | 
							if (Player.SpawnStatus == CSmPlayer::ESpawnStatus::Spawned) {
 | 
				
			||||||
 | 
								Scores::SetPlayerRoundPoints(Player.Score, Points);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Update the map duration setting
 | 
					// Update the map duration setting
 | 
				
			||||||
if (Map_TimeBeforeMalus != S_TimeBeforeMalus || Map_TimeBeforeMalus != S_TimeBeforeNightmare || Map_MalusEveryNSecs != S_MalusEveryNSecs || Map_NextMalusPreparationTime != S_NextMalusPreparationTime || Map_MalusDuration != S_MalusDuration || Map_RoundsPerMap != S_RoundsPerMap) {
 | 
					if (Map_TimeBeforeMalus != S_TimeBeforeMalus || Map_TimeBeforeMalus != S_TimeBeforeNightmare || Map_MalusEveryNSecs != S_MalusEveryNSecs || Map_NextMalusPreparationTime != S_NextMalusPreparationTime || Map_MalusDuration != S_MalusDuration || Map_RoundsPerMap != S_RoundsPerMap) {
 | 
				
			||||||
@@ -474,7 +490,6 @@ PendingMalus = False;
 | 
				
			|||||||
ActiveMalus = False;
 | 
					ActiveMalus = False;
 | 
				
			||||||
Net_TimeBeforeMalus = -1;
 | 
					Net_TimeBeforeMalus = -1;
 | 
				
			||||||
Net_NextMalus = -1;
 | 
					Net_NextMalus = -1;
 | 
				
			||||||
RankInitialized = False;
 | 
					 | 
				
			||||||
CustomTimes.clear();
 | 
					CustomTimes.clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Race::StopSkipOutroAll();
 | 
					Race::StopSkipOutroAll();
 | 
				
			||||||
@@ -557,31 +572,18 @@ if (Round_ForceEndRound || Round_SkipPauseRound) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/** Update the Scores Table with hidden custom points
 | 
					/** Update the Scores Table with hidden custom points
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *	@param	_EliminatedPlayer						The Player who is eliminated
 | 
					 *	@param	_User									The User who is eliminated
 | 
				
			||||||
 *	@param	_EventType								Type of event that led to the update (EndRace or GiveUp)
 | 
					 *	@param	_OverrideTime							Compute time because it not ended the Map
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 Void UpdateCustomRanking(CSmPlayer _EliminatedPlayer, Integer _EventType) {
 | 
					 Void UpdateCustomRanking(CUser _User, Boolean _OverrideTime) {
 | 
				
			||||||
	declare Integer[Text] CustomTimes for This;
 | 
						if (_User == Null) return;
 | 
				
			||||||
	declare Text[] AccountIdsOfPlayers for This;
 | 
						
 | 
				
			||||||
	foreach (Score in Scores) {
 | 
						if (_OverrideTime) {
 | 
				
			||||||
		if (Score == Null) continue;
 | 
							declare Integer[Text] CustomTimes for This = [];
 | 
				
			||||||
		declare CSmPlayer Player = GetPlayer(Score.User.Login);
 | 
							CustomTimes[_User.WebServicesUserId] = Now - StartTime;
 | 
				
			||||||
		if (Player == Null) continue;
 | 
							UIModules_ScoresTable::SetCustomTimes(CustomTimes);
 | 
				
			||||||
		if (Player.SpawnStatus == CSmPlayer::ESpawnStatus::NotSpawned) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			Scores::UpdatePlayerBestRaceIfBetter(Player);
 | 
					 | 
				
			||||||
			if (_EliminatedPlayer != Null && _EliminatedPlayer == Player) {
 | 
					 | 
				
			||||||
				if (_EventType == Events::C_Type_GiveUp || _EventType == Events::C_Type_Eliminated) {
 | 
					 | 
				
			||||||
					CustomTimes[Score.User.WebServicesUserId] = Now - StartTime;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				UIManager.UIAll.SendChat("""$<$ff3$> Player $<$ff9{{{Player.User.Name}}}$> is eliminated""");
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			Scores::SetPlayerRoundPoints(Score,PlayersNbDead);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	UIModules_ScoresTable::DisplayOnly(AccountIdsOfPlayers);
 | 
						UIManager.UIAll.SendChat("""$<$ff3$> Player $<$ff9{{{_User.Name}}}$> is eliminated""");
 | 
				
			||||||
	UIModules_ScoresTable::SetCustomTimes(CustomTimes);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Update the scores table footer text
 | 
					/** Update the scores table footer text
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user