This commit is contained in:
root 2022-03-08 20:00:45 +01:00
commit dae4dbcf20
4 changed files with 321 additions and 191 deletions

View File

@ -4,8 +4,8 @@
#Extends "Libs/Nadeo/TMNext/TrackMania/Modes/TMNextRoundsBase.Script.txt"
#Const CompatibleMapTypes "TrackMania\\TM_Race,TM_Race"
#Const Version "2021-06-14"
#Const ScriptName "Modes/TrackMania/LastManStanding.Script.txt"
#Const Version "2022-03-08"
#Const ScriptName "Modes/TM2020-Gamemodes/LastManStanding.Script.txt"
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Libraries
@ -20,14 +20,13 @@
#Include "ManiaApps/Nadeo/TMxSM/Race/UIModules/ScoresTable_Server.Script.txt" as UIModules_ScoresTable
#Include "ManiaApps/Nadeo/TMxSM/Race/UIModules/PauseMenuOnline_Server.Script.txt" as UIModules_PauseMenu_Online
#Include "Libs/Nadeo/ModeLibs/Common/Debug.Script.txt" as Debug
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Settings
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
#Setting S_ForceLapsNb 1
#Setting S_RoundsPerMap 1 as _("Number of rounds per map") ///< Number of round to play on one map before going to the next one
#Setting S_IntroTime 5 as "Time of the map intro"
#Setting S_TimeBeforeMalus 10 as "Time Before Malus"
#Setting S_TimeBeforeNightmare 150 as "Time Before Nightmare"
#Setting S_MalusEveryNSecs 10 as "Roll a new Malus every N Sec"
@ -72,6 +71,11 @@
12 => "25% AccelCoef", 13 => "25% Adherence", 14 => "25% Control",
15 => "25% Gravity", 99 => "NightMare"]
#Struct K_Malus {
Integer Time;
Integer MalusIndex;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Extends
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
@ -97,6 +101,7 @@ MB_Settings_UseDefaultTimer = False;
MB_Settings_UseDefaultHud = (C_HudModulePath == "");
MB_Settings_UseDefaultPodiumSequence = False;
Rounds_Settings_UseDefaultSpawnManagement = False;
MB_Settings_UseDefaultIntroSequence = False;
***
***Match_Rules***
@ -126,7 +131,9 @@ UIManager.UIAll.OverlayHideCountdown = True;
Markers::SetDefaultMarker_HudVisibility(CUIConfigMarker::EHudVisibility::Always);
UIManager.UIAll.LabelsVisibility = CUIConfig::EHudVisibility::Everything ;
SetML(Null);
UIModules::UnloadModules(["UIModule_Race_LapsCounter"]);
SetML();
***
***Match_Yield***
@ -153,9 +160,6 @@ UsePvECollisions = True;
StateMgr::ForcePlayersStates([StateMgr::C_State_Waiting]);
WarmUp::SetAvailability(True);
CarRank::Reset();
Debug::AddFakeUsers(C_FakeUsersNb);
//Debug::SetTargetSpeed([10.0, 100.0]);
***
***Match_InitMap***
@ -173,6 +177,7 @@ declare Integer Map_RoundsPerMap;
declare Text[] AccountIdsOfPlayers for This = [];
declare Integer LandmarkIndex for This = 0;
declare Integer[Text] CustomTimes for This = [];
declare K_Malus[Text] MalusQueue;
declare Boolean ActiveMalus = False;
declare Boolean PendingMalus = False;
@ -186,25 +191,46 @@ declare netwrite Integer Net_NextMalus for Teams[0] = -1;
declare netwrite Integer Net_TimeBeforeMalus for Teams[0] = -1;
declare netwrite Integer Net_RoundsPerMap for Teams[0] = 0;
declare netwrite Integer Net_CurrentRoundNb for Teams[0] = 0;
// Map Intro
declare Boolean MapIsCompatible;
declare CMapLandmark[] Landmarks = Map::GetFinishesAndMultilaps();
foreach (Landmark in Landmarks) {
if (Map::IsMultilap(Landmark)) {
MapIsCompatible = True;
break;
}
}
if (!MapIsCompatible) {
UIManager.UIAll.QueueMessage(3000, 1, CUIConfig::EMessageDisplay::Big, _("This map is not valid"));
MB_Sleep(3000);
MB_StopMap();
} else if (S_IntroTime > 0) {
declare netwrite Boolean Net_LMS_IsIntro for Teams[0];
Net_LMS_IsIntro = True;
StateMgr::ForcePlayersStates([StateMgr::C_State_Waiting]);
ModeUtils::PushAndApplyUISequence(UIManager.UIAll, CUIConfig::EUISequence::RollingBackgroundIntro);
declare Integer WaitingScreenDuration = 0;
while (MB_MapIsRunning() && S_IntroTime - WaitingScreenDuration > 0) {
WaitingScreenDuration = WaitingScreenDuration + 1;
MB_Sleep(1000);
}
ModeUtils::PopAndApplyUISequence(UIManager.UIAll);
Net_LMS_IsIntro = False;
}
***
***Match_StartMap***
***
// Add bot when necessary
//Users_SetNbFakeUsers(C_FakeUsersNb, 0);
Race::SetRespawnBehaviour(Race::C_RespawnBehaviour_AlwaysGiveUp);
CarRank::Reset();
// Warm up
/*UIModules_ScoresTable::SetFooterInfo(_("Warm up"));
MB_WarmUp(S_WarmUpNb, S_WarmUpDuration * 1000, S_WarmUpTimeout * 1000);*/
***
***Match_StartRound***
***
Scores::Clear();
SetMalusToAll(C_Malus_Reset);
// WorkAround for longloading
declare StartMapTime = Now;
@ -226,12 +252,13 @@ Net_TimeBeforeMalus = MalusTime;
Net_NextMalus = -1;
Net_RoundsPerMap = Map_RoundsPerMap;
Net_CurrentRoundNb = Map_ValidRoundsNb + 1;
MalusQueue = [];
// Spawn players for the race
---Rounds_CanSpawn---
declare Text[] AccountIdsOfPlayers for This = [];
declare CMapLandmark[] Landmarks = Map::GetFinishesAndMultilaps();
declare CMapLandmark PlayerLM;
declare Integer LandmarkIndex for This = 0;
AccountIdsOfPlayers = [];
@ -265,6 +292,7 @@ foreach (Player in ShuffledPlayers) {
}
Race::Start(Player, PlayerLM , StartTime);
AccountIdsOfPlayers.add(Player.User.WebServicesUserId);
MalusQueue[Player.User.WebServicesUserId] = GetNewMalus(C_Malus_Reset);
}
Net_NBPlayers = AccountIdsOfPlayers.count;
@ -274,8 +302,14 @@ StateMgr::ForcePlayersStates([StateMgr::C_State_Playing]);
CarRank::Update(CarRank::C_SortCriteria_BestRace);
Race::EnableIntroDuringMatch(False);
UIManager.UIAll.SendChat("$<$ff3$> Stay the most time on the structure. $<$ff9GL HF!$>");
***
/***Match_InitPlayLoop***
***
MalusQueue = [];
***/
***Match_PlayLoop***
***
// Update CarRank & UI Interface
@ -310,8 +344,7 @@ if (Now < StartTime + 3000) {
Race::Start(Player, PlayerLM , StartTime);
AccountIdsOfPlayers.add(Player.User.WebServicesUserId);
MB_Sleep(100);
while (!SetMalus(Player, C_Malus_Reset)) MB_Yield();
MalusQueue[Player.User.WebServicesUserId] = GetNewMalus(C_Malus_Reset);
}
}
}
@ -329,8 +362,7 @@ if (Now < StartTime + 3000) {
// Manage race events
declare RacePendingEvents = Race::GetPendingEvents();
foreach (Event in RacePendingEvents) {
//log("""Event.Type: {{{Event.Type}}} / Event.IsEndRace: {{{TL::ToText(Event.IsEndRace)}}} / Event.IsEndLap: {{{TL::ToText(Event.IsEndLap)}}} / Event.Player.User.Login: {{{Event.Player.User.Login}}}""");
Race::ValidEvent(Event);// TODO : Check why event not regitered in NightMare (bot?)
Race::ValidEvent(Event);
// Waypoint
if (Event.Type == Events::C_Type_Waypoint) {
@ -426,7 +458,9 @@ if (Players.count > 0 && S_MalusDuration > 0 && MalusTime != -1 && Now > MalusTi
Net_NextMalus = MalusIndex;
Net_TimeBeforeMalus = NextStepMalusTime;
} else if (PendingMalus && !ActiveMalus) {
SetMalusToAll(MalusIndex);
foreach (Player in Players) {
MalusQueue[Player.User.WebServicesUserId] = GetNewMalus(MalusIndex);
}
PendingMalus = False;
ActiveMalus = True;
NextStepMalusTime = Now + (S_MalusDuration*1000);
@ -439,7 +473,9 @@ if (Players.count > 0 && S_MalusDuration > 0 && MalusTime != -1 && Now > MalusTi
Net_TimeBeforeMalus = NextStepMalusTime;
} else if (!PendingMalus && ActiveMalus) {
if (MalusIndex != 99) {
SetMalusToAll(C_Malus_Reset);
foreach (Player in Players) {
MalusQueue[Player.User.WebServicesUserId] = GetNewMalus(C_Malus_Reset);
}
PendingMalus = False;
ActiveMalus = False;
@ -452,15 +488,26 @@ if (Players.count > 0 && S_MalusDuration > 0 && MalusTime != -1 && Now > MalusTi
Net_NextMalus = -1;
Net_TimeBeforeMalus = NextStepMalusTime;
} else {
SetMalusToAll(C_Malus_Nightmare);
foreach (Player in Players) {
MalusQueue[Player.User.WebServicesUserId] = GetNewMalus(C_Malus_Nightmare);
}
NextStepMalusTime = Now + (S_MalusDuration*1000);
}
}
}
}
//Debug::Yield();
foreach (AccountId => Malus in MalusQueue) {
declare CSmPlayer Player = ModeUtils::GetPlayerFromAccountId(AccountId);
if (Malus.Time + 1000 < Now) { // Clear old entry
MalusQueue.removekey(AccountId);
} else if (Player != Null && (Player.SpawnStatus == CSmPlayer::ESpawnStatus::Spawned || Player.SpawnStatus == CSmPlayer::ESpawnStatus::Spawning)) {
Log::Log("[ApplyPhysics] Trying to set Event " ^ C_Malus_Name[Malus.MalusIndex] ^ " for " ^ Player.User.Name);
if (SetMalus(Player, Malus.MalusIndex)) {
MalusQueue.removekey(AccountId);
}
}
}
***
***Match_EndRound***
@ -486,20 +533,30 @@ if (Round_ForceEndRound || Round_SkipPauseRound) {
}
} else {
Map_ValidRoundsNb += 1;
Scores::SetPlayerWinner(Scores::GetBestPlayer(Race::C_Sort_RoundPoints));
Race::SortScores(Race::C_Sort_TotalPoints);
Scores::EndRound();
UIManager.UIAll.BigMessageSound = CUIConfig::EUISound::EndRound;
UIManager.UIAll.BigMessageSoundVariant = 0;
declare CSmScore WinnerScore <=> Scores::GetBestPlayer(Race::C_Sort_RoundPoints);
if (WinnerScore == Null) {
foreach (Score in Scores) {
if (Score.BestRaceTimes.count <= 0 && Score.User != Null && AccountIdsOfPlayers.exists(Score.User.WebServicesUserId)) {
WinnerScore <=> Score;
break;
}
}
}
Scores::SetPlayerWinner(WinnerScore);
declare Text Message = _("|Match|Draw");
declare CSmScore WinnerScore <=> Scores::GetBestPlayer(Race::C_Sort_RoundPoints);
if (WinnerScore != Null) {
Message = TL::Compose(_("$<%1$> wins the match!"), Tools::GetNameWithClubTag(WinnerScore.User)); // TODO CHeck why display draw when someone leave
}
UIManager.UIAll.BigMessageSound = CUIConfig::EUISound::EndRound;
UIManager.UIAll.BigMessageSoundVariant = 0;
UIManager.UIAll.BigMessage = Message;
Scores::EndRound();
Race::SortScores(Race::C_Sort_TotalPoints);
MB_Sleep(5000);
UIManager.UIAll.BigMessage = "";
UIManager.UIAll.ScoreTableVisibility = CUIConfig::EVisibility::ForcedVisible;
@ -596,13 +653,20 @@ if (Round_ForceEndRound || Round_SkipPauseRound) {
UIModules_ScoresTable::SetFooterInfo(Footer);
}
K_Malus GetNewMalus(Integer _MalusIndex) {
return K_Malus {
Time = Now,
MalusIndex = _MalusIndex
};
}
/** Set Malus to a specific Players
*
* @param _Player Player
* @param _Type Malus Index
*/
Boolean SetMalus(CSmPlayer _Player, Integer _Type) {
if (_Player.SpawnStatus == CSmPlayer::ESpawnStatus::Spawned) {
if (_Player.SpawnStatus == CSmPlayer::ESpawnStatus::Spawned && !SetPlayer_DelayedIsFull(_Player)) {
if (_Type > 0) {
_Player.Dossard_Color = <1., 0., 0.>;
} else {
@ -612,66 +676,51 @@ Boolean SetMalus(CSmPlayer _Player, Integer _Type) {
case C_Malus_Reset: {
SetPlayerVehicle_ControlledByMode(_Player, False);
SetPlayerVehicle_ResetControlledModeValues(_Player);
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_Reset(_Player);
}
case C_Malus_ForceEngine: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_ForceEngine(_Player,True);
}
case C_Malus_NoEngine: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_NoEngine(_Player,True);
}
case C_Malus_BackwardOnly: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_Cruise(_Player,True,-999.);
}
case C_Malus_NoBrakes: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_NoBrakes(_Player,True);
}
case C_Malus_NoSteer: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_NoSteer(_Player,True);
}
case C_Malus_SlowMotion: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_SlowMotion(_Player,True);
}
case C_Malus_BoostDown: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_BoostDown(_Player,True);
}
case C_Malus_BoostUp: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_BoostUp(_Player,True);
}
case C_Malus_Boost2Down: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_Boost2Down(_Player,True);
}
case C_Malus_Boost2Up: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_Boost2Up(_Player,True);
}
case C_Malus_LockPlayer: {
SetPlayerVehicle_ControlledByMode(_Player, True);
}
case C_Malus_AccelCoef25: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_AccelCoef(_Player,0.25);
}
case C_Malus_AdherenceCoef25: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_AdherenceCoef(_Player,0.25);
}
case C_Malus_ControlCoef25: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_ControlCoef(_Player,0.25);
}
case C_Malus_GravityCoef25: {
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_GravityCoef(_Player,0.25);
}
// The goal is to kill all Players
@ -679,9 +728,7 @@ Boolean SetMalus(CSmPlayer _Player, Integer _Type) {
SetPlayerVehicle_ControlledByMode(_Player, True);
SetPlayerVehicle_TargetSpeedValue(_Player, ML::Rand(-500.,500.));
SetPlayerVehicle_SteerValue(_Player,ML::Rand(-1.,1.));
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_Boost2Up(_Player,True);
while (SetPlayer_DelayedIsFull(_Player)) MB_Yield();
SetPlayer_Delayed_AdherenceCoef(_Player,0.1);
}
}
@ -690,25 +737,15 @@ Boolean SetMalus(CSmPlayer _Player, Integer _Type) {
return False;
}
/** Set Malus to all Players
*
* @param _Type Malus Index
*/
Void SetMalusToAll(Integer _Type) {
foreach (Player in Players) {
SetMalus(Player, _Type);
}
}
/** Set the UI
*
* @param _Player Malus Index
*/
Void SetML(CSmPlayer _Player) {
Void SetML() {
declare TotalWidth = 44.5;
declare Text MLText = """
<manialink name="LMS_UI" version="3">
<manialink name="LMS_InfoPanel" version="3">
<script><!--
#Include "TextLib" as TL
@ -828,13 +865,58 @@ Void SetML(CSmPlayer _Player) {
</manialink>
""";
Layers::Create("LMS_UI", MLText);
Layers::SetType("LMS_UI", CUILayer::EUILayerType::Normal);
if (_Player == Null) {
Layers::Attach("LMS_UI");
} else {
Layers::Attach("LMS_UI", _Player);
}
Layers::Create("LMS_InfoPanel", MLText);
Layers::SetType("LMS_InfoPanel", CUILayer::EUILayerType::Normal);
Layers::Attach("LMS_InfoPanel");
MLText = """
<manialink name="LMS_MapInfo" version="3">
<script><!--
#Include "TextLib" as TL
main() {
declare netread Boolean Net_LMS_IsIntro for Teams[0];
declare Boolean Last_IsIntro;
declare CMlFrame Frame_Global = (Page.GetFirstChild("frame-global") as CMlFrame);
declare CMlLabel Label_MapInfo_Name = (Page.GetFirstChild("label-mapinfo-name") as CMlLabel);
declare CMlLabel Label_MapInfo_Author = (Page.GetFirstChild("label-mapinfo-author") as CMlLabel);
while(True) {
yield;
if (Last_IsIntro != Net_LMS_IsIntro) {
Last_IsIntro = Net_LMS_IsIntro;
if (Last_IsIntro) {
Label_MapInfo_Name.Value = Map.MapName;
Label_MapInfo_Author.Value = "by " ^ Map.AuthorNickName;
AnimMgr.Flush(Frame_Global);
AnimMgr.Add(Frame_Global, "<anim hidden=\"0\" pos=\"0 60\"/>", 200 , CAnimManager::EAnimManagerEasing::SineInOut);
} else {
AnimMgr.Flush(Frame_Global);
AnimMgr.Add(Frame_Global, "<anim hidden=\"1\" pos=\"0 115\"/>", 200 , CAnimManager::EAnimManagerEasing::SineInOut);
}
}
}
}
--></script>
<stylesheet>
<style class="text" textfont="GameFontBlack" textcolor="ffffffff" textsize="8" valign="center2" halign="center"/>
</stylesheet>
<frame id="frame-global" pos="0 115" hidden="1">
<quad size="150 25" halign="center" z-index="-1" bgcolor="000" opacity="0.7"/>
<label id="label-mapinfo-name" class="text" pos="0 -8" size="140 10"/>
<label id="label-mapinfo-author" class="text" pos="0 -18" size="140 10" textsize="6"/>
</frame>
</manialink>
""";
Layers::Create("LMS_MapInfo", MLText);
Layers::SetType("LMS_MapInfo", CUILayer::EUILayerType::Normal);
Layers::Attach("LMS_MapInfo");
}

117
TM_EventCup.Script.txt Normal file
View File

@ -0,0 +1,117 @@
/*
* This mode uses the TMGL World Cup mode and removes all references to it
*/
#Extends "Modes/TrackMania/TM_Final86TMGL_Online.Script.txt"
// #RequireContext CSmMode
#Include "ManiaApps/Nadeo/TMNext/TrackMania/UIModules/TMGLMarkers_Server.Script.txt" as UIModules_TMGLMarkers
#Setting S_PointsLimit 100
#Setting S_RoundsPerMap 3
#Setting S_ForceLapsNb -1
#Setting S_PointsRepartition ""
#Setting S_KOCheckpointNb 0 // Number of checkpoints in lead to validate a K.O.
#Setting S_KOCheckpointTime 1500 // Advance in milliseconds to validate a K.O.
#Setting S_KOValidationDelay 1000 // Delay in milliseconds before validating a K.O.
#Setting S_EnableAmbientSound True //"Enable ambient sound"
#Setting S_WorldRecords "" // Format : {"map uid": {"AcountId": "player account id", "Time": time in milliseconds}, ...}
#Setting S_DelayBetweenRounds 0
#Setting S_ForceRoadSpectatorsNb -1 //< Force the number of spectators displayed on the border of the road
#Setting S_DecoImageUrl_Screen16x9 ""
#Setting S_DecoImageUrl_Screen8x1 ""
#Setting S_DecoImageUrl_Screen16x1 ""
#Setting S_OverridePlayerProfiles ""
#Setting S_DisplayTeamName True as "Display Marker Name on the Live Ranking Interface"
#Setting S_DisplayTeamColor False as "Display Team Color on the Live Ranking Interface"
/*
S_OverridePlayerProfiles Json format : (enpty values can be removed)
{
"56f8dd9f-8581-444e-a2ad-1e8e89eed1a4": {
"WebServicesUserId": "56f8dd9f-8581-444e-a2ad-1e8e89eed1a4",
"Nickname": "Beu",
"Flag": "",
"TeamColor": "",
"Cheers": "",
"MarkerName": "$F0FTeam Beu"
},
"iiii-jjjj-kkkk-llll": {
...
},
...
}
TeamColor is not used if S_DisplayTeamColor = False
*/
***Match_AfterLoadHud***
***
// Remove TMGL Signs
UIModules::UnloadModules(["UIModule_ChampionTMGL_InfoPanels_2x3", "UIModule_ChampionTMGL_InfoPanels_16x9", "UIModule_ChampionCup_Sign64x10_64x10_Start","UIModule_ChampionCup_Sign64x10_64x10_Finish","UIModule_ChampionCup_Sign64x10_64x10_Checkpoint","FinalTMGL_WinScreen","UIModule_Champion_Chat"]);
***
***Match_InitMap***
***
declare Boolean Last_DisplayTeamName;
declare Boolean Last_DisplayTeamColor;
declare Text Last_OverridePlayerProfiles;
if (Last_DisplayTeamName != S_DisplayTeamName || Last_DisplayTeamColor != S_DisplayTeamColor) {
Last_DisplayTeamName = S_DisplayTeamName;
Last_DisplayTeamColor = S_DisplayTeamColor;
UIModules_LiveRanking::DisplayTeamName(S_DisplayTeamName);
UIModules_LiveRanking::DisplayTeamColor(S_DisplayTeamColor);
}
if (Last_OverridePlayerProfiles != S_OverridePlayerProfiles) {
Last_OverridePlayerProfiles = S_OverridePlayerProfiles;
PlayerProfiles::OverridePlayerProfiles(Teams[0], S_OverridePlayerProfiles);
ResetMarkersConfig();
}
***
***Match_PlayLoop***
***
if (Last_DisplayTeamName != S_DisplayTeamName || Last_DisplayTeamColor != S_DisplayTeamColor) {
Last_DisplayTeamName = S_DisplayTeamName;
Last_DisplayTeamColor = S_DisplayTeamColor;
UIModules_LiveRanking::DisplayTeamName(S_DisplayTeamName);
UIModules_LiveRanking::DisplayTeamColor(S_DisplayTeamColor);
}
if (Last_OverridePlayerProfiles != S_OverridePlayerProfiles) {
Last_OverridePlayerProfiles = S_OverridePlayerProfiles;
PlayerProfiles::OverridePlayerProfiles(Teams[0], S_OverridePlayerProfiles);
ResetMarkersConfig();
}
***
Void ResetMarkersConfig() {
// Manialink variables
declare netwrite Text[Integer] Net_ChampionTMGL_TMGLMarkers_MarkerFrameIds for Teams[0] = [];
declare netwrite Integer Net_ChampionTMGL_TMGLMarkers_MarkerFrameIdsUpdate for Teams[0] = 0;
// TMGLMarkers Lib variables
declare Ident[Ident] LibTMGLMarkers_MarkedPlayerIds for UIManager.UIAll = [];
declare Integer[Ident] LibTMGLMarkers_MarkerFrameIds for UIManager.UIAll = [];
declare Text[Integer] MarkerToUpdate;
foreach (Key => Value in Net_ChampionTMGL_TMGLMarkers_MarkerFrameIds) {
MarkerToUpdate[Key] = "";
}
LibTMGLMarkers_MarkedPlayerIds = [];
LibTMGLMarkers_MarkerFrameIds = [];
Net_ChampionTMGL_TMGLMarkers_MarkerFrameIds = MarkerToUpdate;
Net_ChampionTMGL_TMGLMarkers_MarkerFrameIdsUpdate += 1;
// Force update at next yield
foreach (Player in Players) {
declare Boolean LibTMGLMarkers_NewPlayer for Player = True;
LibTMGLMarkers_NewPlayer = True;
break;
}
}

View File

@ -246,6 +246,11 @@ MB_WarmUp(S_WarmUpNb, S_WarmUpDuration * 1000, S_WarmUpTimeout * 1000);
***
declare netwrite Boolean Net_RoyalRounds_WarmUpUI_IsActive for Teams[0];
Net_RoyalRounds_WarmUpUI_IsActive = True;
foreach (Player in Players) {
declare netwrite Integer Net_RoyalRounds_WarmUpUI_SelectedSegment for Player = 1;
Player.LandmarkOrderSelector_Race = Net_RoyalRounds_WarmUpUI_SelectedSegment;
}
***
***Match_WarmUpLoop***

View File

@ -5,7 +5,7 @@
#Const CompatibleMapTypes "TrackMania\\TM_Race,TM_Race"
#Const Version "2021-10-16"
#Const ScriptName "Modes/TrackMania/TM_SeedingTimeAttack_Online.Script.txt"
#Const ScriptName "Modes/TM2020-Gamemodes/TM_SeedingTimeAttack_Online.Script.txt"
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Libraries
@ -17,6 +17,7 @@
#Include "Libs/Nadeo/TMNext/TrackMania/Modes/TrophyRanking.Script.txt" as TrophyRanking
#Include "Libs/Nadeo/TMNext/TrackMania/Menu/Constants.Script.txt" as MenuConsts
#Include "Libs/Nadeo/ModeLibs/Common/Utils.Script.txt" as ModeUtils
#Include "Libs/Nadeo/CommonLibs/Common/Semver.Script.txt" as Semver
// UI from Race
#Include "ManiaApps/Nadeo/TMxSM/Race/UIModules/TimeGap_Server.Script.txt" as UIModules_TimeGap
@ -26,7 +27,6 @@
#Include "ManiaApps/Nadeo/TMNext/TrackMania/TimeAttack/UIModules/EndMatchTrophy_Server.Script.txt" as UIModules_EndMatchTrophy
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Settings
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
@ -124,7 +124,7 @@ foreach (Event in PendingEvents) {
StateMgr::InitializePlayer(Event.Player);
CarRank::InitializePlayer(Event.Player);
if (Event.Player != Null) {
Log::Log("[Match_Yield][PendingEvents] New player added: " ^ Event.Player.Name);
Log::Log("[Match_Yield][PendingEvents] New player added: " ^ Event.Player.User.Name);
declare Boolean Match_CanForceTrophyRankUpdate for This;
TrophyRanking::InitializeUser(Event.Player.User, Match_CanForceTrophyRankUpdate);
if (Scores::GetPlayerMatchPoints(Event.Player.Score) == 0) {
@ -202,7 +202,7 @@ declare Boolean Map_UseTheWorstTimeForDNF;
***Match_StartMap***
***
// Add bot when necessary
Users_SetNbFakeUsers(C_FakeUsersNb, 0);
if (S_ScriptEnvironment == "production") Users_SetNbFakeUsers(C_FakeUsersNb, 0);
// Warm up
UIModules_ScoresTable::SetFooterInfo(_("Warmup"));
@ -243,12 +243,11 @@ UpdateCustomRanking(Null);
***Match_PlayLoop***
***
foreach (Event in PendingEvents) {
Log::Log("[PlayLoop][PendingEvents] Event.Type: " ^ Event.Type);
if (Event.Type == CSmModeEvent::EType::OnPlayerAdded) {
if (Event.Player != Null) {
Log::Log("[PlayLoop][PendingEvents] New player added: " ^ Event.Player.Name);
Log::Log("[PlayLoop][PendingEvents] New player added: " ^ Event.Player.User.Name);
UpdateCustomRanking(Event.Player);
}
}
@ -359,8 +358,13 @@ if (EndTime > 0 && Now >= EndTime) {
}
***
***Match_EndMap***
***Match_EndRound***
***
if (Semver::Compare(XmlRpc::GetApiVersion(), ">=", "2.1.1")) {
Scores::XmlRpc_SendScores(Scores::C_Section_PreEndRound, "");
}
UpdateCustomRanking(Null);
EndTime = -1;
declare Integer WorstTime for This;
@ -378,6 +382,10 @@ CarRank::Update(CarRank::C_SortCriteria_BestRace);
Race::StopSkipOutroAll();
Scores::EndRound();
***
***Match_EndMap***
***
if (MB_GetMapCount() >= S_MapsPerMatch) {
Log::Log("[Match_EndMap] Stop Match");
@ -676,7 +684,7 @@ Void SetML() {
Void SetPlayerEntry(Integer _Index, Integer _Rank, Text _Name, Text _Login, Vec3 _PlayerNameColor, Integer _RoundPoints, Integer _MatchPoints) {
DevLog("[SetPlayerEntry UI] Set entry for " ^ _Name ^ " at index " ^_Index);
declare CMlFrame Frame_ParentFrame <=> (Page.GetFirstChild("player-" ^ _Index) as CMlFrame);
declare CMlQuad Quad_Bg <=> (Page.GetFirstChild("bg-player-" ^ _Index) as CMlQuad);
declare CMlQuad Quad_Bg <=> (Frame_ParentFrame.GetFirstChild("player-bg") as CMlQuad);
declare CMlLabel Label_PlayerPos <=> (Frame_ParentFrame.GetFirstChild("player-pos") as CMlLabel);
declare CMlLabel Label_PlayerName <=> (Frame_ParentFrame.GetFirstChild("player-name") as CMlLabel);
declare CMlLabel Label_PlayerMapTime <=> (Frame_ParentFrame.GetFirstChild("player-maptime") as CMlLabel);
@ -701,6 +709,8 @@ Void SetML() {
}
main() {
declare CMlQuad Quad_Sep10 <=> (Page.GetFirstChild("sep-10") as CMlQuad);
declare netread Integer Net_SerialNeedToUpdate for Teams[0];
declare Integer Last_SerialNeedToUpdate = -1;
declare Text Last_GUIPlayerUID;
@ -725,11 +735,11 @@ Void SetML() {
DevLog("[PendingEvents] Toggle UI by " ^ InputPlayer.User.Login);
ToggleUI();
}
} else if (Event.Type == CMlScriptEvent::Type::MouseOver && TL::Find("bg-player-", Event.ControlId, True, True) && InputPlayerIsSpectator()) {
declare Quad <=> (Page.GetFirstChild(Event.ControlId) as CMlQuad);
} else if (Event.Type == CMlScriptEvent::Type::MouseOver && TL::Find("player-bg", Event.ControlId, True, True) && InputPlayerIsSpectator()) {
declare Quad <=> (Event.Control as CMlQuad);
Quad.Opacity = 0.1;
} else if (Event.Type == CMlScriptEvent::Type::MouseOut && TL::Find("bg-player-", Event.ControlId, True, True)) {
declare Quad <=> (Page.GetFirstChild(Event.ControlId) as CMlQuad);
} else if (Event.Type == CMlScriptEvent::Type::MouseOut && TL::Find("player-bg", Event.ControlId, True, True)) {
declare Quad <=> (Event.Control as CMlQuad);
Quad.Opacity = 0.;
}
}
@ -759,6 +769,8 @@ Void SetML() {
declare CUser PreviousUser;
declare CUser PreviousPreviousUser;
Quad_Sep10.Visible = False;
foreach (PlayerUID => Points in PlayersMatchPoints) {
declare CUser User <=> GetUserFromAccountId(PlayerUID);
if (User == Null) continue;
@ -767,6 +779,7 @@ Void SetML() {
if (GUIPlayer != Null && PlayerUID == GUIPlayer.User.WebServicesUserId) {
PlayerNameColor = <0.922,0.855,0.42>; //Gold
GUIPlayerPassed = True;
if (Rank > 12 || (Rank == 12 && PlayersMatchPoints.count > 12)) Quad_Sep10.Visible = True;
} else if (InputPlayer != Null && PlayerUID == InputPlayer.User.WebServicesUserId) {
PlayerNameColor = <0.431,0.98,0.627>; // Green
}
@ -801,122 +814,35 @@ Void SetML() {
<style class="text" textfont="GameFontBlack" textcolor="fff" textsize="1.5" halign="left" valign="center2" textprefix="$i$t" />
<style class="text-suffix" textfont="GameFontBlack" textcolor="ffffff" textsize="0.7" halign="center" valign="center2" textprefix="$i$t"/>
</stylesheet>
<framemodel id="player-model">
<quad id="player-bg" valign="center" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="1"/>
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="1"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</framemodel>
<frame id="frame-global" pos="-160 30">
<frame pos="53 -2.5" id="frame-toggle">
<frame pos="53 -2.5" id="frame-toggle" z-index="1" >
<quad id="quad-toggle" pos="0 0" size="4 4" class="quad-base" z-index="3" opacity="0.9" scriptevents="1" halign="center" valign="center" image="file://Media/Manialinks/Nadeo/TMNext/Menus/Icons/128x128/ICON_ARROW_LEFT_OBLIQUE.dds" colorize="fff"/>
</frame>
<quad pos="0 0" z-index="0" size="55 71" bgcolor="000" opacity="0.5"/>
<frame id="frame-ui" z-index="1">
<quad pos="0 0" z-index="0" size="55 69" bgcolor="000" opacity="0.5"/>
<label pos="27.5 -5" z-index="2" size="55 7" text="Match Ranking" textfont="GameFontBlack" textprefix="$i$t" valign="center2" halign="center" textcolor="fff"/>
<frame pos="0 -10" z-index="2">
<frame hidden=1 id="player-1" pos="0 0">
<quad id="bg-player-1" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="1"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-2" pos="0 -5">
<quad id="bg-player-2" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="2"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-3" pos="0 -10">
<quad id="bg-player-3" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="3"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-4" pos="0 -15">
<quad id="bg-player-4" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="4"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-5" pos="0 -20">
<quad id="bg-player-5" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="5"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-6" pos="0 -25">
<quad id="bg-player-6" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="6"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-7" pos="0 -30">
<quad id="bg-player-7" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="7"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-8" pos="0 -35">
<quad id="bg-player-8" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="8"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-9" pos="0 -40">
<quad id="bg-player-8" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="9"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-10" pos="0 -45">
<quad id="bg-player-10" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="10"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-11" pos="0 -45">
<quad id="bg-player-11" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="11"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame hidden=1 id="player-12" pos="0 -45">
<quad id="bg-player-12" pos="0 0" z-index="0" size="55 5" bgcolor="999" opacity="0" scriptevents="1"/>
<frame pos="0 -2.7">
<label id="player-pos" class="text" pos="1 0" z-index="0" size="5 6" text="12"/>
<label id="player-name" class="text" pos="7 0" z-index="0" size="25 6" text=""/>
<label id="player-maptime" class="text" pos="42 0" z-index="0" size="8 6" text="--:--.---" textcolor="aaa" textsize="0.5" halign="right"/>
<label id="player-totaltimes" class="text" pos="54 0" z-index="0" size="10 6" text="--:--.---" halign="right"/>
</frame>
</frame>
<frame pos="0 -11" z-index="2">
<frameinstance pos="0 0" hidden="1" modelid="player-model" id="player-1"/>
<frameinstance pos="0 -5" hidden="1" modelid="player-model" id="player-2"/>
<frameinstance pos="0 -10" hidden="1" modelid="player-model" id="player-3"/>
<frameinstance pos="0 -15" hidden="1" modelid="player-model" id="player-4"/>
<frameinstance pos="0 -20" hidden="1" modelid="player-model" id="player-5"/>
<frameinstance pos="0 -25" hidden="1" modelid="player-model" id="player-6"/>
<frameinstance pos="0 -30" hidden="1" modelid="player-model" id="player-7"/>
<frameinstance pos="0 -35" hidden="1" modelid="player-model" id="player-8"/>
<frameinstance pos="0 -40" hidden="1" modelid="player-model" id="player-9"/>
<quad id=sep-10 pos="0 -42" hidden=1 opacity="0.8" z-index="2" size="55 0.5" bgcolor="fff" />
<frameinstance pos="0 -45" hidden="1" modelid="player-model" id="player-10"/>
<frameinstance pos="0 -50" hidden="1" modelid="player-model" id="player-11"/>
<frameinstance pos="0 -55" hidden="1" modelid="player-model" id="player-12"/>
</frame>
</frame>
</frame>