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

189 lines
3.8 KiB
Ucode

//====================================================================
// This page shows LAN-based online servers.
//
// Updated by Ron Prestenback
// (c) 2003, Epic Games, Inc. All Rights Reserved
// ====================================================================
class UT2K4Browser_ServerListPageLAN extends UT2K4Browser_ServerListPageBase;
var() private LANQueryClient LQC;
var() string StoredIP, StoredPort;
event Opened( GUIComponent Sender )
{
Super.Opened(Sender);
if ( !bInit && bVisible )
SetTimer(10.0,True);
}
function ShowPanel(bool bShow)
{
Super.ShowPanel(bShow);
if ( bShow )
{
SetTimer(10.0, True);
bInit = False;
}
else KillTimer();
}
function Timer()
{
Super.Timer();
RefreshList();
}
function Refresh()
{
Super.Refresh();
ResetQueryClient(GetClient());
RefreshList();
}
function RefreshList()
{
local string s;
CancelPings();
// If we had a server selected, save the ip and port so that we can reselect the server when the query for the server is received
s = li_Server.Get();
if ( s == "" || !Divide( s, ":", StoredIP, StoredPort ) )
{
StoredIP = "";
StoredPort = "";
}
li_Server.Clear();
GetClient().BroadcastPingRequest();
}
function ReceivedPingInfo( int ServerID, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s )
{
local int i;
if( ServerID < 0 )
{
for( i=0;i<li_Server.Servers.Length;i++ )
{
// dupe
if( li_Server.Servers[i].IP==s.IP && li_Server.Servers[i].Port==s.Port )
return;
}
li_Server.MyOnReceivedServer( s );
// If we have a stored IP and port, it means we had a server selected when the browser was refreshed - reselect the server now
if ( StoredIP == s.ip && StoredPort == string(s.port) )
{
li_Server.SetIndex( li_Server.FindIndex(StoredIP, StoredPort) );
StoredIP = "";
StoredPort = "";
}
}
else
{
li_Server.MyReceivedPingInfo( ServerID, PingCause, s );
if ( StoredIP == s.ip && StoredPort == string(s.port) )
{
li_Server.bNotify = False;
li_Server.SetIndex( li_Server.FindIndex(StoredIP, StoredPort) );
li_Server.bNotify = True;
StoredIP = "";
StoredPort = "";
}
}
}
function CancelPings()
{
if ( HasClient() )
LQC.CancelPings();
}
function PingServer( int listid, ServerQueryClient.EPingCause PingCause, GameInfo.ServerResponseLine s )
{
GetClient().PingServer( listid, PingCause, s.IP, s.QueryPort, QI_RulesAndPlayers, s );
}
function UpdateStatusPingCount()
{
}
function bool HasClient()
{
return LQC != None;
}
function LANQueryClient GetClient()
{
local int i;
if( LQC == None )
{
LQC = PlayerOwner().Level.Spawn( class'LANQueryClient' );
log(Name@"Spawning new LAN query client '"$LQC$"'");
if ( LQC != None && LQC.NetworkError() )
{
// Handle network error
do
{
log(Name@"- Network error in query client - retrying "$i);
LQC.Destroy();
LQC = PlayerOwner().Spawn( class'LANQueryClient' );
} until ( !LQC.NetworkError() || ++i < 10 )
if ( i >= 10 )
{
// Unresolvable network error
ShowNetworkError();
return None;
}
}
}
return LQC;
}
function OnDestroyPanel(optional bool bCancelled)
{
Super.OnDestroyPanel(bCancelled);
ClearQueryClient();
}
function LevelChanged()
{
Super.LevelChanged();
ClearQueryClient();
}
function Free()
{
Super.Free();
ClearQueryClient();
}
protected function ClearQueryClient()
{
if ( LQC != None )
{
log(Name@"Destroying LAN query client '"$LQC$"'");
LQC.CancelPings();
LQC.Destroy();
LQC = None;
}
}
function NetworkErrorClosed( bool bCancelled )
{
if ( !bCancelled )
GetClient();
}
defaultproperties
{
PanelCaption="Server Browser : LAN"
ConnectLAN=True
}