*E?s2D,0pG>gZ :{:|:}???????None UBrowser UTBrowserSystemCoreUWindowReallyJoinServer GridClassServerListClassNameEngine WaitModalMessageBoxDone EnabledText ngStatsName MessageBoxUTBrowserUpdateServerWindowUTBrowserUpdateServerLinkUTBrowserServerListWindowUTBrowserServerListUTBrowserServerGridUTBrowserMainWindowUTBrowserMainClientWindowUTBrowserFavoriteServers ShowModalByName BeginPlay ClientTravelDecodeServerProperties JoinServer DrawCellWindowTitleStringUpdateServerClassCreateColumnsServerListWindowClass LinkClassFavoriteServersClass SetupURIsAskNgStatsText CloseUWindowIpDrvCopyExistingListItemCompareClose BeforePaint AddColumnAskNgStatsTitle DemoBuild UWindowBaseResultFloatPropertyEngineVersionLIP UWindowListUWindowWindow ngSecretSetMessageBoxResultGetPlayerOwner UWindowGrid CreateWindowUWindowFramedWindowUWindowGridColumntDynamicLoadObjectXUWindowMessageBoxObjectUWindowRootWindowColumnWindowConsoleRoot ItemClass SourceItem BoolPropertyData IntPropertyUBrowserFavoriteServersUBrowserServerListWindowUBrowserMainClientWindowUBrowserMainWindowUBrowserServerGridUBrowserServerListUBrowserUpdateServerLinkUBrowserUpdateServerWindowServerURIsMaxURIi URLAppend FunctionClassPropertyY ReturnValueW LevelInfoC SortByColumnbSortDescendingB ScriptText GameInfoCanvas GamePortLevel BytePropertyActor PlayerPawnListConsoleObjectPropertyClass TextBufferPackagengStats StrPropertyEnumConnectToServerbWaitingForNgStats AskNgStats ClientClass ClipText GetParentbNGWorldStatsNoneNoneNone ActiveText VersionName InactiveTextGameVerbNGWorldStatsActiveVerNoneNoneNoneNoneNoneNone#6>2ug>2u>2u>2u>2uIIIIII II4@II<IIIIII8IIIIII II IIII9IIIIIIII III 07eo' II @II?@IIII@II>@IIIII36o2g!]%$UTBrowser.UTBrowserServerListWindow#]$#UTBrowser.UTBrowserFavoriteServers]'&UTBrowser.UTBrowserUpdateServerWindowIIIIIIz class UTBrowserUpdateServerLink expands UBrowserUpdateServerLink; function SetupURIs() { if( class'GameInfo'.default.DemoBuild != 0 ) { MaxURI = 3; URIs[3] = "/UpdateServer/utdemomotd"$Level.EngineVersion$".html"; URIs[2] = "/UpdateServer/utdemomotdfallback.html"; URIs[1] = "/UpdateServer/utdemomasterserver.txt"; URIs[0] = "/UpdateServer/utdemoircserver.txt"; } else { MaxURI = 3; URIs[3] = "/UpdateServer/utmotd"$Level.EngineVersion$".html"; URIs[2] = "/UpdateServer/utmotdfallback.html"; URIs[1] = "/UpdateServer/utmasterserver.txt"; URIs[0] = "/UpdateServer/utircserver.txt"; } } :6!xa=]UTBrowser.UTBrowserServerList]UTBrowser.UTBrowserServerGridIIJclass UTBrowserUpdateServerWindow expands UBrowserUpdateServerWindow; I@ class UTBrowserServerList expands UBrowserServerList; var bool bNGWorldStatsActive; var bool bNGWorldStats; function bool DecodeServerProperties(string Data) { local int i; i=InStr(Data, "\\worldlog\\"); if(i >= 0 && Mid(Data, i+10, 4) ~= "true") bNGWorldStatsActive = True; i=InStr(Data, "\\wantworldlog\\"); if(i >= 0 && Mid(Data, i+14, 4) ~= "true") bNGWorldStats = True; return Super.DecodeServerProperties(Data); } function UWindowList CopyExistingListItem(Class ItemClass, UWindowList SourceItem) { local UTBrowserServerList L; L = UTBrowserServerList(Super.CopyExistingListItem(ItemClass, SourceItem)); L.bNGWorldStats = UTBrowserServerList(SourceItem).bNGWorldStats; L.bNGWorldStatsActive = UTBrowserServerList(SourceItem).bNGWorldStatsActive; return L; } &6$~]UTBrowser.UTBrowserServerList]UTBrowser.UTBrowserServerGridII' y r  *)::$ ::$LUTMenu.ngWorldSecretWindow BBHCHC'- '-'b  IFclass UTBrowserServerListWindow expands UBrowserServerListWindow; I()62 <A  y p-&v-& E.-;. -;.-. - 1.-(-&.EC-E&s.-;j-&p-&   I)? ?< $S= .-.-; > =.-; =  = I 4,B<,? B Iaclass UTBrowserMainWindow expands UBrowserMainWindow; function BeginPlay() { Super.BeginPlay(); ClientClass = class'UTBrowserMainClientWindow'; } I5+ @>-    - ( "2,N}ߤa"I7/2#-5F(ɓ> Ygg~ۅ.'lo /T2g> Y>2u>2uo > Y> Ygggg>2u>2u>2u>2u>2u>2uԺgg>2u>2uԺԺ>2uԺ ] ngWorldStats] Version ] Enabled-]Use ngWorldStats?%m?}This server has stat accumulation enabled. Your ngWorldStats password has not been set. If you set a new ngWorldStats password, you can record all of your gameplay stats (Kills, Suicides, etc) online! If you do not set a password you will opt out of stat accumulation.\n\nDo you want to set an ngWorldStats password?~]Active@] InactiveIIS  I+ Uppppunreal://:S. $( *& I$_ %,,pp/UpdateServer/utdemomotd.html,/UpdateServer/utdemomotdfallback.html&/UpdateServer/utdemomasterserver.txt%/UpdateServer/utdemoircserver.txt,,pp/UpdateServer/utmotd.html,/UpdateServer/utmotdfallback.html&/UpdateServer/utmasterserver.txt%/UpdateServer/utircserver.txt *.21-B܌̅]"!Unreal Tournament Server BrowserII; ~\worldlog\K%|, ,true-;'~\wantworldlog\%|,,true-' IFclass UTBrowserMainClientWindow expands UBrowserMainClientWindow; III%~ w*%-..-.-;  $$ I2(Ok.-.--;.-; It;class UTBrowserServerGrid expands UBrowserServerGrid; var UWindowGridColumn ngStats; var UWindowGridColumn Ver; var localized string ngStatsName; var localized string VersionName; var localized string EnabledText; var UBrowserServerList ConnectToServer; var bool bWaitingForNgStats; var UWindowMessageBox AskNgStats; var localized string AskNgStatsTitle; var localized string AskNgStatsText; var localized string ActiveText; var localized string InactiveText; function CreateColumns() { Super.CreateColumns(); ngStats = AddColumn(ngStatsName, 80); Ver = AddColumn(VersionName, 40); } function DrawCell(Canvas C, float X, float Y, UWindowGridColumn Column, UBrowserServerList List) { switch(Column) { case Ver: Column.ClipText( C, X, Y, string(List.GameVer) ); break; case ngStats: if( List.GameVer >= 406 && UTBrowserServerList(List).bNGWorldStats ) { if( UTBrowserServerList(List).bNGWorldStatsActive ) Column.ClipText( C, X, Y, ActiveText ); else Column.ClipText( C, X, Y, InactiveText ); } else if(UTBrowserServerList(List).bNGWorldStatsActive) Column.ClipText( C, X, Y, EnabledText ); break; default: Super.DrawCell(C, X, Y, Column, List); break; } } function int Compare(UBrowserServerList T, UBrowserServerList B) { switch(SortByColumn) { case Ver: if( T.GameVer == B.GameVer ) return ByName(T, B); if( T.GameVer >= B.GameVer ) { if(bSortDescending) return 1; else return -1; } else { if(bSortDescending) return -1; else return 1; } break; case ngStats: if( UTBrowserServerList(T).bNGWorldStatsActive == UTBrowserServerList(B).bNGWorldStatsActive ) { if( UTBrowserServerList(T).bNGWorldStats == UTBrowserServerList(B).bNGWorldStats ) return ByName(T, B); if( UTBrowserServerList(T).bNGWorldStats ) { if(bSortDescending) return 1; else return -1; } else { if(bSortDescending) return -1; else return 1; } } if(UTBrowserServerList(T).bNGWorldStatsActive) { if(bSortDescending) return 1; else return -1; } else { if(bSortDescending) return -1; else return 1; } break; default: return Super.Compare(T, B); break; } } function MessageBoxDone(UWindowMessageBox W, MessageBoxResult Result) { if(W == AskNgStats) { AskNgStats = None; if(Result == MR_Cancel) return; else if(Result == MR_Yes) { ShowModal(Root.CreateWindow(class(DynamicLoadObject("UTMenu.ngWorldSecretWindow", class'Class')), 100, 100, 200, 200, Root, True)); bWaitingForNgStats = True; } else { GetPlayerOwner().ngSecretSet = True; GetPlayerOwner().SaveConfig(); ReallyJoinServer(ConnectToServer); } } } function JoinServer(UBrowserServerList Server) { if(Server != None && Server.GamePort != 0) { if(!GetPlayerOwner().ngSecretSet && (UTBrowserServerList(Server).bNGWorldStats || UTBrowserServerList(Server).bNGWorldStatsActive) ) { ConnectToServer = Server; AskNgStats = MessageBox(AskNgStatsTitle, AskNgStatsText, MB_YesNoCancel, MR_Yes); } else ReallyJoinServer(Server); } } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); if(bWaitingForNgStats && !WaitModal()) { ReallyJoinServer(ConnectToServer); bWaitingForNgStats = False; } } function ReallyJoinServer(UBrowserServerList Server) { GetPlayerOwner().ClientTravel("unreal://"$Server.IP$":"$Server.GamePort$UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).URLAppend, TRAVEL_Absolute, false); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } IIIIIDclass UTBrowserFavoriteServers expands UBrowserFavoriteServers; IIIII@II=@II@IpppnQn6p nPnmnRnYnnnBnrnorUn=KAIanjnMn1YxnOn^Y9nIndn5mFnCnAn:nenin<nSYYYyY)KfY+Y(r2nLI7nNmgKVY nKYnhY rXmlm`ZwK.Y$nEYs8r4Y;nZn/Y?{a&z\(5Tj('>y(2JH)-qV)2We)63s)'bB*(DQ*-v`*-uo*-t}*(@L+6HZ+/Ti+%0x+(kG,([V,(_d,|s,- o.- }.6GK/--[/-%i/+[w/+@E0PS0%]c3+_r3c4F A4[G>,c4Vb@c4L xA[DO- o_Q$c4RNT-)y`U-RYZ- 9k]1c4md^-+?QaZPb] jc1$Gp-ykp$Mdr|qxXmzc4RE}2\W~-~e~(Uc-c4@