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

171 lines
2.5 KiB
Ucode

class KFBufferedTCPLink extends BufferedTCPLink;
var IpAddr ServerIpAddr;
var string ReceiveState;
var string Waiting;
var string Match;
var string Timeout;
var float RetryTime;
var int CurrentRetries;
var int MaxRetries;
var bool bSendRequest;
var bool bDone;
var bool bFailed;
var string TargetAddress;
var string TargetRequest;
function Init(string Address, string Request)
{
Close();
bDone = false;
bFailed = false;
bSendRequest = true;
ServerIpAddr.Port = 0;
CurrentRetries = 0;
TargetAddress = Address;
TargetRequest = Request;
Resolve(Address);
SetTimer(RetryTime, false);
}
event Timer()
{
if ( bDone )
{
return;
}
if ( bFailed )
{
bFailed = false;
bDone = OnServerConnectTimeout();
return;
}
if ( ServerIpAddr.Port != 0)
{
if ( IsConnected() )
{
if ( bSendRequest )
{
SendBufferedData(TargetRequest$CRLF);
bSendRequest = false;
WaitForCount(1, 20, 1); // 20 sec timeout
}
}
else if ( CurrentRetries++ > MaxRetries )
{
OnServerConnectTimeout();
return;
}
}
else if ( CurrentRetries++ > MaxRetries )
{
OnServerConnectTimeout();
return;
}
SetTimer(RetryTime, false);
}
function ResolveFailed()
{
ServerIpAddr.Port = -1; // set error flag
}
function Resolved(IpAddr Addr)
{
// Set the address
ServerIpAddr.Addr = Addr.Addr;
ServerIpAddr.Port = 80; // connect to http port
// Handle failure.
if ( ServerIpAddr.Addr == 0 )
{
return;
}
// Bind the local port.
if ( BindPort() == 0 )
{
return;
}
OpenNoSteam(ServerIpAddr);
}
function DestroyLink()
{
SetTimer(0.0, False);
if ( IsConnected() )
{
Close();
}
}
function Tick(float DeltaTime)
{
DoBufferQueueIO();
Super.Tick(DeltaTime);
}
function WaitForCount(int Count, float TimeOut, int MatchData)
{
Super.WaitForCount(Count, TimeOut, MatchData);
ReceiveState = Waiting;
}
function GotMatch(int MatchData)
{
// called when a match happens
ReceiveState = Match;
}
function GotMatchTimeout(int MatchData)
{
// when a match times out
ReceiveState = Timeout;
}
event ReceivedText(string Text)
{
local int Index;
if ( !bDone )
{
Index = InStr(Text, "Content-Location: KF:");
if ( Index > 0 )
{
bDone = true;
OnServerResponded(Mid(Text, Index + 22));
}
else
{
bFailed = true;
}
}
}
defaultproperties
{
Waiting="Waiting"
Match="Matched"
Timeout="Timed Out"
RetryTime=0.25
MaxRetries=20
}