rott/kf_sources/XInterface/Classes/Browser_ServerListPageMS.uc
2026-07-14 20:27:09 +07:00

279 lines
7.5 KiB
Ucode

class Browser_ServerListPageMS extends Browser_ServerListPageBase;
var() string GameType;
var() MasterServerClient MSC;
var() bool bStarted;
var localized string QueryFinHead;
var localized string QueryFinTail;
var localized string PingRecvString;
var localized string MustUpgradeString;
var localized string RefreshFinHead, RefreshFinMid, RefreshFinTail;
var localized string RePingServersCaption;
var localized string RefreshCaption;
function AddQueryTerm(string Key, string GameType, MasterServerClient.EQueryType QueryType)
{
local MasterServerClient.QueryData QD;
local int i;
//Log("["$Key$"] ["$GameType$"] ["$QueryType$"]");
QD.Key = Key;
QD.Value = GameType;
QD.QueryType = QueryType;
i = MSC.Query.Length;
MSC.Query.Length = i + 1;
MSC.Query[i] = QD;
}
function RefreshList()
{
local int dotPos;
local string TmpString;
MyServersList.Clear();
// Build query
MSC.Query.Length = 0;
AddQueryTerm("gametype", GameType, QT_Equals);
// Add any extra filtering to the query
if(Browser.bOnlyShowStandard)
AddQueryTerm("standard", "true", QT_Equals);
if(Browser.bOnlyShowNonPassword)
AddQueryTerm("password", "false", QT_Equals);
if(Browser.bDontShowFull)
AddQueryTerm("freespace", "0", QT_GreaterThan);
if(Browser.bDontShowEmpty)
AddQueryTerm("currentplayers", "0", QT_GreaterThan);
if(Browser.StatsServerView == SSV_OnlyStatsEnabled)
AddQueryTerm("stats", "true", QT_Equals);
else if(Browser.StatsServerView == SSV_NoStatsEnabled)
AddQueryTerm("stats", "false", QT_Equals);
// MUTATOR 1
// Send only the stuff to the right of the dot...
dotPos = InStr(Browser.DesiredMutator, ".");
if(dotPos < 0)
TmpString = Browser.DesiredMutator;
else
TmpString = Mid(Browser.DesiredMutator, dotPos + 1);
if(Browser.ViewMutatorMode == VMM_NoMutators)
AddQueryTerm("mutator", "", QT_Equals); // Empty string indicates 'no mutators please'
else if(Browser.ViewMutatorMode == VMM_ThisMutator && TmpString != "")
AddQueryTerm("mutator", TmpString, QT_Equals);
else if(Browser.ViewMutatorMode == VMM_NotThisMutator && TmpString != "")
AddQueryTerm("mutator", TmpString, QT_NotEquals);
// MUTATOR2
dotPos = InStr(Browser.DesiredMutator2, ".");
if(dotPos < 0)
TmpString = Browser.DesiredMutator2;
else
TmpString = Mid(Browser.DesiredMutator2, dotPos + 1);
if( Browser.ViewMutatorMode != VMM_AnyMutators )
{
if(Browser.ViewMutator2Mode == VMM_ThisMutator && TmpString != "")
AddQueryTerm("mutator", TmpString, QT_Equals);
else if(Browser.ViewMutator2Mode == VMM_NotThisMutator && TmpString != "")
AddQueryTerm("mutator", TmpString, QT_NotEquals);
}
if(Browser.bDontShowWithBots)
AddQueryTerm("nobots", "true", QT_Equals);
if(Browser.WeaponStayServerView == WSSV_OnlyWeaponStay)
AddQueryTerm("weaponstay", "true", QT_Equals);
else if(Browser.WeaponStayServerView == WSSV_NoWeaponStay)
AddQueryTerm("weaponstay", "false", QT_Equals);
if(Browser.TranslocServerView == TSV_OnlyTransloc)
AddQueryTerm("transloc", "true", QT_Equals);
else if(Browser.TranslocServerView == TSV_NoTransloc)
AddQueryTerm("transloc", "false", QT_Equals);
// If not entire range (and valid), add game speed query
if( (Browser.MinGamespeed != 0 || Browser.MaxGamespeed != 200) && Browser.MaxGamespeed >= Browser.MinGamespeed )
{
// Master Server stores game speed as 1 = 100% etc
AddQueryTerm("gamespeed", string(float(Browser.MinGamespeed)/100.0), QT_GreaterThanEquals);
AddQueryTerm("gamespeed", string(float(Browser.MaxGamespeed)/100.0), QT_LessThanEquals);
}
if(Browser.CustomQuery != "")
{
TmpString = Left(Browser.CustomQuery, 32); // Only send 32 chars max
AddQueryTerm("custom", TmpString, QT_Equals);
}
MSC.StartQuery(CTM_Query);
StatusBar.SetCaption(StartQueryString);
}
function ShowPanel(bool bShow)
{
Super.ShowPanel(bShow);
if( bShow )
{
if( !bStarted )
{
Log(MyButton.Caption$": Initial refresh");
RefreshList();
bStarted = True;
}
else
{
// Resume pings
Log(MyButton.Caption$": Resuming pings");
MyServersList.AutoPingServers();
}
}
else
{
// Pause pings
Log(MyButton.Caption$": Cancelling pings");
MyServersList.StopPings();
}
}
function OnCloseBrowser()
{
if( MSC != None )
{
MSC.CancelPings();
MSC.Destroy();
MSC = None;
}
}
function PingServer( int listid, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s )
{
if( PingCause == PC_Clicked )
MSC.PingServer( listid, PingCause, s.IP, s.QueryPort, QI_RulesAndPlayers, s );
else
MSC.PingServer( listid, PingCause, s.IP, s.QueryPort, QI_Ping, s );
}
function CancelPings()
{
MSC.CancelPings();
}
// Caught for status bar updating
function UpdateStatusPingCount()
{
if(MyServersList.NumReceivedPings < MyServersList.Servers.Length)
{
StatusBar.SetCaption(PingRecvString@"("$MyServersList.NumReceivedPings$"/"$MyServersList.Servers.Length$")");
}
else
{
StatusBar.SetCaption(RefreshFinHead@MyServersList.Servers.Length@RefreshFinMid@MyServersList.NumPlayers@RefreshFinTail);
}
}
function MyReceivedPingInfo( int ServerID, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s )
{
MyServersList.MyReceivedPingInfo(ServerID, PingCause, s);
if(PingCause == PC_AutoPing)
UpdateStatusPingCount();
}
function MyPingTimeout( int listid, ServerQueryClient.EPingCause PingCause )
{
MyServersList.MyPingTimeout(listid, PingCause);
if(PingCause == PC_AutoPing)
UpdateStatusPingCount();
}
// We have list of servers from master server and are going to start pinging
function MyQueryFinished( MasterServerClient.EResponseInfo ResponseInfo, int Info )
{
MyServersList.MyQueryFinished(ResponseInfo, Info);
switch( ResponseInfo )
{
case RI_Success:
StatusBar.SetCaption(QueryFinHead$MSC.ResultCount$QueryFinTail);
break;
case RI_AuthenticationFailed:
StatusBar.SetCaption(AuthFailString);
break;
case RI_ConnectionFailed:
StatusBar.SetCaption(ConnFailString);
break;
case RI_ConnectionTimeout:
StatusBar.SetCaption(ConnTimeoutString);
break;
case RI_MustUpgrade:
StatusBar.SetCaption(MustUpgradeString);
break;
}
}
function bool MyRePing(GUIComponent Sender)
{
MyServersList.RePingServers();
return true;
}
function bool MyRefreshClick(GUIComponent Sender)
{
Super.RefreshClick(Sender);
return true;
}
function InitComponent(GUIController C, GUIComponent O)
{
Super.InitComponent(C, O);
if( MSC == None )
{
MSC = PlayerOwner().Level.Spawn( class'MasterServerClient' );
MSC.OnReceivedServer = MyServersList.MyOnReceivedServer;
MSC.OnQueryFinished = MyQueryFinished;
MSC.OnReceivedPingInfo = MyReceivedPingInfo;
MSC.OnPingTimeout = MyPingTimeout;
}
StatusBar.WinWidth = 0.8;
GUIButton(GUIPanel(Controls[1]).Controls[6]).bVisible = false;
GUIButton(GUIPanel(Controls[1]).Controls[1]).Caption = RePingServersCaption;
GUIButton(GUIPanel(Controls[1]).Controls[1]).OnClick = MyRePing;
// Set up REFRESH button
GUIButton(GUIPanel(Controls[1]).Controls[7]).Caption = RefreshCaption;
GUIButton(GUIPanel(Controls[1]).Controls[7]).OnClick = MyRefreshClick;
}
defaultproperties
{
QueryFinHead="Query Complete! Received: "
QueryFinTail=" Servers"
PingRecvString="Pinging Servers"
RefreshFinHead="Pinging Complete! "
RefreshFinMid=" Servers, "
RefreshFinTail=" Players"
RePingServersCaption="RE-PING LIST"
MustUpgradeString="Upgrade available. Please refresh the News page."
RefreshCaption="REFRESH LIST"
}