Class DatabaseUdpLink extends UdpLink; var string PendingLine; var IpAddr A; var ServerPerksMut Mut; var array ToSave; var array PendingData; var transient float NextReqTimer; var bool bConnectionReady,bHasPendingLine; var byte LoopCounter; enum ENetID { ID_None, ID_Open, ID_RequestPassword, ID_HeresPassword, ID_ConnectionClosed, ID_PasswordCorrect, ID_NewPlayer, ID_BadNewPlayer, ID_SendPlayerData, ID_UpdatePlayer, ID_KeepAlive, }; function PostBeginPlay() { Disable('Tick'); } function BeginEvent() { Mut.SaveAllStats = SaveAllStats; Mut.RequestStats = RequestStats; ReceiveMode = RMODE_Event; if( BindPort(Rand(8000)+8000,true)>0 ) Resolve(Mut.RemoteDatabaseURL); } event Resolved( IpAddr Addr ) { A = Addr; A.Port = Mut.RemotePort; SendText(A,Chr(ENetID.ID_Open)); Enable('Tick'); NextReqTimer = Level.TimeSeconds+5.f; } function Tick( float Delta ) // Every 5 seconds, try to open connection again. { if( !bConnectionReady && NextReqTimer0 ) GoToState('SaveAll'); } function RequestStats( ServerStStats Other ) { local int i; if( !bConnectionReady ) return; SendText(A,Chr(ENetID.ID_NewPlayer)$Other.MyStatsObject.Name$"*"$Mut.GetSafeName(Other.PlayerOwner.PlayerReplicationInfo.PlayerName)); for( i=0; i512 ) { SendText(A,Left(Line,512)); Line = Mid(Line,512); } SendText(A,Line); ToSave.Remove(0,1); if( ToSave.Length==0 ) GoToState(''); } Begin: while( ++LoopCounter<150 ) { if( Level.bLevelChange ) // Delay mapchange until all stats are uploaded. Level.NextSwitchCountdown = FMax(Level.NextSwitchCountdown,1.f); Sleep(0.5); } } defaultproperties { }