Add XmlRpc callbacks

This commit is contained in:
Beu 2023-09-08 17:21:24 +02:00
parent 90a2f893da
commit 11f2683a3e

View File

@ -6,7 +6,7 @@
//#RequireContext CSmMode //#RequireContext CSmMode
#Const CompatibleMapTypes "TrackMania\\TM_Race,TM_Race" #Const CompatibleMapTypes "TrackMania\\TM_Race,TM_Race"
#Const Version "2023-09-04" #Const Version "2023-09-08"
#Const ScriptName "Modes/TrackMania/TM_TimeAttack_Online.Script.txt" #Const ScriptName "Modes/TrackMania/TM_TimeAttack_Online.Script.txt"
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
@ -28,7 +28,8 @@
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Settings // Settings
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
#Setting S_AltitudeUpdateFrequency 500 as "Altitude Update Frequency" #Setting S_AltitudeUpdateFrequency 500 as "Altitude Update Frequency in ms"
#Setting S_XmlRpcUpdateFrequency 10000 as "XmlRpc update frequency in ms"
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Constants // Constants
@ -49,6 +50,10 @@
#Const C_MlId_LiveAltitude "ClimbTheMap_Altidude" #Const C_MlId_LiveAltitude "ClimbTheMap_Altidude"
#Const C_Callback_UpdatePBs "Trackmania.ClimbTheMap.UpdatePBs"
#Const C_Method_SetPlayersPB "Trackmania.ClimbTheMap.SetPlayersPB"
#Const C_Method_SetWR "Trackmania.ClimbTheMap.SetWR"
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //
// Extends // Extends
@ -62,11 +67,59 @@ Log::RegisterScript(StateMgr::ScriptName, StateMgr::Version);
***Match_LoadLibraries*** ***Match_LoadLibraries***
*** ***
StateMgr::Load(); StateMgr::Load();
XmlRpc::RegisterCallback(C_Callback_UpdatePBs, """
* Name: {{{C_Callback_UpdatePBs}}}
* Type: CallbackArray
* Description:
* Data:
- Version >=2.0.0:
```
[
"[
"Vvjdn4WBRE6irR6Oie7RpA": 2000,
...
]"
]
```
""");
XmlRpc::RegisterMethod(C_Method_SetPlayersPB, """
* Name: {{{C_Method_SetPlayersPB}}}
* Type: TriggerModeScriptEventArray
* Description: Request the current properties of the AFK libraries.
* Data:
- Version >=3.5.0:
```
[
"[
"Vvjdn4WBRE6irR6Oie7RpA": 2000,
...
]"
]
```
""");
XmlRpc::RegisterMethod(C_Method_SetWR, """
* Name: {{{C_Method_SetWR}}}
* Type: TriggerModeScriptEventArray
* Description: Request the current properties of the AFK libraries.
* Data:
- Version >=3.5.0:
```
[
"Beu_",
"2000"
]
```
""");
*** ***
***Match_UnloadLibraries*** ***Match_UnloadLibraries***
*** ***
StateMgr::Unload(); StateMgr::Unload();
XmlRpc::UnregisterCallback(C_Callback_UpdatePBs);
XmlRpc::UnregisterMethod(C_Method_SetPlayersPB);
XmlRpc::UnregisterMethod(C_Method_SetWR);
*** ***
***Match_Settings*** ***Match_Settings***
@ -117,6 +170,43 @@ foreach (Event in PendingEvents) {
} }
} }
foreach (Event in XmlRpc.PendingEvents) {
if (Event.Type == CXmlRpcEvent::EType::CallbackArray) {
if (Event.ParamArray1 == C_Method_SetPlayersPB) {
if (Event.ParamArray2.count < 1) continue;
declare Integer[Text] AltitudePerLogin;
AltitudePerLogin.fromjson(Event.ParamArray2[0]);
foreach (Login => Altitude in AltitudePerLogin) {
declare CSmPlayer Player <=> GetPlayer(Login);
if (Player == Null) continue;
declare netwrite Integer Net_ClimbTheMap_AltitudeOfPB for Player;
if (Net_ClimbTheMap_AltitudeOfPB < Altitude) {
Net_ClimbTheMap_AltitudeOfPB = Altitude;
}
}
declare netwrite Integer Net_ClimbTheMap_AltitudePerName_Update for Teams[0];
Net_ClimbTheMap_AltitudePerName_Update += 1;
} else if (Event.ParamArray1 == C_Method_SetWR) {
if (Event.ParamArray2.count < 2) continue;
declare netwrite Int2 Net_ClimbTheMap_AltitudeOfWaypoints for Teams[0];
declare Integer Altitude = ML::Min(TL::ToInteger(Event.ParamArray2[1]), Net_ClimbTheMap_AltitudeOfWaypoints.Y);
declare netwrite Integer Net_ClimbTheMap_AltitudeOfWR for Teams[0];
if (Net_ClimbTheMap_AltitudeOfWR < Altitude) {
Net_ClimbTheMap_AltitudeOfWR = Altitude;
declare netwrite Text Net_ClimbTheMap_NamefWR for Teams[0];
Net_ClimbTheMap_NamefWR = Event.ParamArray2[0];
declare netwrite Integer Net_ClimbTheMap_AltitudePerName_Update for Teams[0];
Net_ClimbTheMap_AltitudePerName_Update += 1;
}
}
}
}
StateMgr::Yield(); StateMgr::Yield();
*** ***
@ -147,12 +237,15 @@ CarRank::Reset();
***Match_InitMap*** ***Match_InitMap***
*** ***
declare Integer Map_NextUpdate; declare Integer Map_NextUpdate;
declare Integer[Text] Map_XmlRpc_AltitudePerLogin_Queue;
declare Integer Map_XmlRpc_Queue_NextUpdate;
declare netwrite Integer Net_ClimbTheMap_AltitudeOfWR for Teams[0]; declare netwrite Integer Net_ClimbTheMap_AltitudeOfWR for Teams[0];
declare netwrite Text Net_ClimbTheMap_NamefWR for Teams[0]; declare netwrite Text Net_ClimbTheMap_NamefWR for Teams[0];
declare netwrite Integer[Text] Net_ClimbTheMap_AltitudePerName for Teams[0]; declare netwrite Integer[Text] Net_ClimbTheMap_AltitudePerName for Teams[0];
declare netwrite Integer Net_ClimbTheMap_AltitudePerName_Update for Teams[0]; declare netwrite Integer Net_ClimbTheMap_AltitudePerName_Update for Teams[0];
declare netwrite Integer Net_ClimbTheMap_UpdateFrequency for Teams[0] = 500; declare netwrite Integer Net_ClimbTheMap_UpdateFrequency for Teams[0] = 500;
*** ***
@ -172,7 +265,6 @@ if (Start == Null && Finishes.count == 0) {
declare netwrite Int2 Net_ClimbTheMap_AltitudeOfWaypoints for Teams[0]; declare netwrite Int2 Net_ClimbTheMap_AltitudeOfWaypoints for Teams[0];
declare netwrite Integer Net_ClimbTheMap_AltitudeOfWaypoints_Update for Teams[0]; declare netwrite Integer Net_ClimbTheMap_AltitudeOfWaypoints_Update for Teams[0];
declare Real FinishAltitude; declare Real FinishAltitude;
foreach (Finish in Finishes) { foreach (Finish in Finishes) {
@ -184,6 +276,10 @@ if (Start == Null && Finishes.count == 0) {
Net_ClimbTheMap_UpdateFrequency = S_AltitudeUpdateFrequency; Net_ClimbTheMap_UpdateFrequency = S_AltitudeUpdateFrequency;
Net_ClimbTheMap_AltitudeOfWR = 0;
Net_ClimbTheMap_NamefWR = "";
Net_ClimbTheMap_AltitudePerName = [];
// Initialize race // Initialize race
StartTime = Now + Race::C_SpawnDuration; StartTime = Now + Race::C_SpawnDuration;
EndTime = -1; EndTime = -1;
@ -191,8 +287,13 @@ if (Start == Null && Finishes.count == 0) {
// Spawn players for the race // Spawn players for the race
foreach (Player in Players) { foreach (Player in Players) {
Race::Start(Player, StartTime); Race::Start(Player, StartTime);
declare netwrite Integer Net_ClimbTheMap_AltitudeOfPB for Player;
Net_ClimbTheMap_AltitudeOfPB = 0;
} }
Net_ClimbTheMap_AltitudePerName_Update += 1;
StateMgr::ForcePlayersStates([StateMgr::C_State_Playing]); StateMgr::ForcePlayersStates([StateMgr::C_State_Playing]);
CarRank::Update(CarRank::C_SortCriteria_BestRace); CarRank::Update(CarRank::C_SortCriteria_BestRace);
Race::EnableIntroDuringMatch(True); Race::EnableIntroDuringMatch(True);
@ -231,7 +332,8 @@ if (Now > Map_NextUpdate) {
declare Integer Altitude = ML::FloorInteger(Player.Position.Y); declare Integer Altitude = ML::FloorInteger(Player.Position.Y);
if (Net_ClimbTheMap_AltitudeOfWR < Altitude) { if (Net_ClimbTheMap_AltitudeOfWR < Altitude) {
Net_ClimbTheMap_AltitudeOfWR = Altitude; declare netwrite Int2 Net_ClimbTheMap_AltitudeOfWaypoints for Teams[0];
Net_ClimbTheMap_AltitudeOfWR = ML::Min(Altitude, Net_ClimbTheMap_AltitudeOfWaypoints.Y);
Net_ClimbTheMap_NamefWR = Player.User.Name; Net_ClimbTheMap_NamefWR = Player.User.Name;
} }
@ -239,6 +341,8 @@ if (Now > Map_NextUpdate) {
if (Net_ClimbTheMap_AltitudeOfPB < Altitude) { if (Net_ClimbTheMap_AltitudeOfPB < Altitude) {
Net_ClimbTheMap_AltitudeOfPB = Altitude; Net_ClimbTheMap_AltitudeOfPB = Altitude;
Map_XmlRpc_AltitudePerLogin_Queue[Player.User.Login] = Altitude;
} }
AltitudePerName[Player.User.Name] = Altitude; AltitudePerName[Player.User.Name] = Altitude;
@ -247,6 +351,16 @@ if (Now > Map_NextUpdate) {
Net_ClimbTheMap_AltitudePerName_Update += 1; Net_ClimbTheMap_AltitudePerName_Update += 1;
} }
if (Now > Map_XmlRpc_Queue_NextUpdate) {
Map_XmlRpc_Queue_NextUpdate = Now + S_XmlRpcUpdateFrequency;
if (Map_XmlRpc_AltitudePerLogin_Queue.count > 0) {
XmlRpc::SendCallback(C_Callback_UpdatePBs, [Map_XmlRpc_AltitudePerLogin_Queue.tojson()]);
Map_XmlRpc_AltitudePerLogin_Queue = [];
}
}
// Manage mode events // Manage mode events
foreach (Event in PendingEvents) { foreach (Event in PendingEvents) {
if (Event.HasBeenPassed || Event.HasBeenDiscarded) continue; if (Event.HasBeenPassed || Event.HasBeenDiscarded) continue;
@ -488,7 +602,7 @@ main() {
if (Net_ClimbTheMap_AltitudeOfPB > 0 && Net_ClimbTheMap_AltitudeOfPB != Net_ClimbTheMap_AltitudeOfWR) { if (Net_ClimbTheMap_AltitudeOfPB > 0 && Net_ClimbTheMap_AltitudeOfPB != Net_ClimbTheMap_AltitudeOfWR) {
UpdateMarker(Frame_Marker_PB, Net_ClimbTheMap_AltitudeOfWaypoints, AnimationDuration, C_Type_PB, OwnerName, Net_ClimbTheMap_AltitudeOfPB); UpdateMarker(Frame_Marker_PB, Net_ClimbTheMap_AltitudeOfWaypoints, AnimationDuration, C_Type_PB, OwnerName, Net_ClimbTheMap_AltitudeOfPB);
} else { } else {
Frame_Marker_Owner.Visible = False; Frame_Marker_PB.Visible = False;
} }
declare Integer I; declare Integer I;