*EPWpG>gZ )*+-,/0427283:WPNoneSystemCore UBrowserParseDelimitedUWindowTick LogoNamesCreated GetNextValue AddMenuItem GetValueAddRuleQueryFinishedSendBufferedData ChopLeft SystemTextAddTextCountClose BeforePaint MultiInStr AddColumnSetText ProcessInputCreateControlChopQueryFindChannelWindowRefreshPaintRemove ParseReplyDone ShowWindowSetFont SetSizePosBegin FindNickEngineUBrowserSubsetFactDefaultStatusBarText SetParent HideWindow DisconnectWaitForResizedTimerFindIDValidateServerGetPlayerOwnerIpDrvLocalizeBoolValue ChangeOpDoBufferQueueIO CloseUWindowAddPage ChangeVoice ChangedNick ExecuteItemGetSelectedRow SetHelpText SortByColumn ShutdownOpenURLSort PingServerResolutionChanged SetValue UserNoticeUBrowserGSpyFact PeekChar FoundServerSetupSentinelCompare ChannelText FirstPage ResetBuffer JoinChannel NextPage UserQuitStart BindPortResolvePrivateAction PrivateText ClientTravelAppendFindPrivateWindowSetNumericOnlyUBrowserHTTPFact SetErrorChannelAction AddFavorite GotMatch Resolved ClosePage RMouseUpNotify PingDoneIRCChannelHistory ShowInfoAddItemRightClickMenuClass SendText IsConnected ParseOptionSetAway DeletePage ShowInfoArea SortColumn SelectRow SetMaxLength PingFinished NewIRCServerUserInChannel KickUserConsoleCommand AppendItemGetColorString ReceivedTextOpenedRePingClosed HTTPErrorDoJoin InternalTime SetEditableSaveFavorites HandleServerFindExistingServerCTCP PingNext ClientClassReadBufferedLineJoinedChannelPartedChannel DestroyListClear ChangeMode RemoveUserSendCommandTextFailureSuccessGetServerUnderRowBrowseCurrentURIGotMatchTimeout InsertItem PartChannelIsAwayConnectSetupDoBindRemoveNickPrefixGotoTabOpen CheckAwaySaveChannelComboAddFavoriteItems DestroyLink SetSizesSaveServerCombo StatusDoneLoadCurrentValuesColor JoinServer AutoInfo PingServersFavoritesNameSuspendPingingResumePinging AddedTextAddUserHTTPReceivedData BeginPlaySelectInternet SelectLAN ConsiderItem IRCClosed ServerStatusSendChannelAction TimeOutError JoinTextSendChannelTextSetSelectedIndex WindowShownOKText OKPressedRightClickRow ReadChar StartQuery WindowTitleToolTip PaintColumnCopyExistingListItemMoveItemSorted ShowModalLaunchUnrealURLResolveFailedBinding SetTextColor SetRangeCreateSubMenu LocalizeTeam LoggingIn LocalizeSkin BindFailedQueryUpdateServer MaxLines ChangeNick ResolvingBrowse GetStatusCouldNotConnectError SetupURIs ProcessData WaitForCount LoggedInSetNickGetInfoBroadcastBeacon AddSubset AddSuperSetFoundSecretState RemoveSubsetTagServersAsOldRemoveOldServers GetItemNameRefreshSubsetsCreateFactoriesShutdownFactoriesClickRemoveFavoriteRefreshServerMasterServerTimeoutKeyDownTextAreaClassResolveFailedErrorbMasked SetCaption RefreshNameMipZeroVClampUClampVBits InfoName ConnectTextUBitsDisconnectTextMasterServerTCPPort CreateItemCreatePrivChannelGetLookAndFeelTextureScrollShow IRCVisible RemoveItem WindowHiddenVSizeSetMOTDUSizeDoubleClickRowDecodeServerPropertiesGetPageUpdateServerCountInvalidatePingsConsiderForSubsets bNoKeyboardSetMasterServer SetIRCServerPostBeginPlayShowOpenWindow RegisterClientMessage OpenText OpenHelp DrawCellNewMasterServerByPingCreateColumnsByMap ClearValuePaletteCloseUpFindItemIndex ByPlayers SetMultiLine CancelPingByName ProcessText CloseText MaxColor LocalizeBuildObjectWithProperties ListClass MouseEnter StripCRLF KeyEvent DrawItem ServerNameGetAddressURL ItemHeightCopyToClipboardAllDoubleClickItem AutoWidth SaveConfigsPing MouseLeaveNotifyAfterLevelChangeNotifyQuitUnrealMessageBoxDone MessageBox GameName PingTimeout ShowUBrowserMaxSimultaneousPing bTopCentricbVariableRowHeight MapNameName PingName PlayersNameSetHTMLOverURLAutoPingIntervalVersionString ValueTextDisconnectReason SetHistory RuleTextIDText FaceText SkinText MeshText TeamText PingTextUpdateServerClassFavoriteServersClassServerListWindowClass MOTDName WarningTextDisconnectHelp WarningTitle ChannelHelp ServerHelp ConnectHelpUpdateServerAddressUpdateServerPort NumTries LinkClass FailureText QueryTextByTextKickedFromText IsAwayText QuitTextMouseLeaveColumn SetsModeTextNowKnownAsTextWasKickedByText CompleteText PingingTextQueryFailedTextQueryServerTextServerCountNamePlayerCountNamePS_DoneLookAndFeelClass PS_RePinging PS_PingingPS_QueryFailed CopyNameOpenLocationName PingAllNameRefreshServerNameBindRetryTime ClickURLTournamentTextServerModeTextDestroyListItemDedicatedTextMinNetVersionText BotSkillText PlayersText MaxTeamsText ValidateBalanceTeamsTextWindowTitleString InviteString FragsTextConnectedTextResolveFailedTextConnectingToText NameTextInvalidAddressTextIRCName LANTabNameMasterServerURIGoalTeamScoreTextMinPlayersText ServerTextServerAddressText ReceiveModeIRCServerHistoryIpAddrToString GamePortTextIPTextUpdateDescriptionTextDescriptionTextQueryPortTextServerBeaconPortBeaconProduct FalseStringNotInAChannelText SystemName GameModeText HasLeftText GameTypeTextAdminNameTextRemoveSupersetUBrowserBannerAdUBrowserBannerBarUBrowserBrowserButtonUBrowserBufferedTCPLinkUBrowserColorIRCTextAreaUBrowserConsoleUBrowserEditFavoriteCWUBrowserEditFavoriteWindowUBrowserFavoriteServersUBrowserServerListWindowUBrowserFavoritesFactUBrowserServerListFactoryUBrowserFavoritesMenuUBrowserRightClickMenu WorldLogTextUBrowserGSpyLinkUBrowserHTTPClient MutatorsTextUBrowserHTTPLinkUBrowserInfoClientWindowUBrowserInfoMenuUBrowserInfoWindowUBrowserIRCChannelMenuUBrowserIRCChannelPageUBrowserIRCPageBaseUBrowserIRCJoinMenuUBrowserIRCLinkUBrowserIRCPrivateMenuUBrowserIRCPrivPageUBrowserIRCSetupClientUBrowserIRCSystemMenuUBrowserIRCSystemPageUBrowserIRCTextAreaUBrowserIRCUserListUBrowserIRCUserListBoxUBrowserIRCWindowUBrowserLocalFactUBrowserLocalLinkUBrowserMainClientWindowUBrowserMainWindowUBrowserNewFavoriteCWUBrowserNewFavoriteWindowNoneUBrowserOpenCWUBrowserOpenWindowUBrowserPlayerGridUBrowserPlayerListUBrowserRootWindowUBrowserRulesGridUBrowserRulesListUBrowserScreenshotCWUBrowserServerGridUBrowserServerListUBrowserServerPing LogoCountUBrowserSubsetListUBrowserSupersetListUBrowserUpdateServerLinkUBrowserUpdateServerTextAreaUBrowserUpdateServerWindowMaxBindAttemptsMasterServerAddressNonDedicatedTextPS_QueryServerbShowFailedServersbSuspendPingOnClose GridClassNotFoundError SupersetTagServerListClassNameFriendlyFireTextbIncrementalPing PartTextAdminEmailText CloseNameChangeLevelsTextMultiplayerBotsTextFragLimitTextTimeLimitTextListFactoriesHasJoinedTextGameVersionTextNotReadyError PlayName TrueStringEditFavoriteNameUpdateServerTimeoutPlayersBalanceTeamsText UBrowserAllErrorBindingTextNewFavoriteNameWinTop ParentWindow WinHeight BlackTexture InternetLinkTcpLink bUnderline CreateWindowbJustThisServer bInitialServerMessageBoxResultLaunchUWindow OwnerFactoryInPingAttemptsMouseXWinLeft bFoundStartRootWindowConsolebBold CompareCount DrawUpBevel PingAttempts BindAttemptsAttemptNumberbNoSortbOK PlayerEntryUWindowRootWindowUWindowRightClickMenu InputBuffer OutputBufferCRLFLF bWaiting QueryState WaitingForWaitForCountChars LastDeltaWaitMatchDataUWindowPulldownMenuItemRequestSentTimeWhat ServerIPAddrUWindowPageWindow QueryPortUWindowPageControlPageUWindowTabControl DelimiterMouseYLastUWindowMessageBoxUWindowLookAndFeelUWindowListBoxItemUWindowListBoxMasterServerIpAddrbOpenedDrawStretchedTexture WhiteTextureUWindowHSplitterUWindowGridColumn UWindowGridUWindowEditControlFoundSecureRequest FoundSecretNextIP NextAddressUWindowDynamicTextRowUWindowFramedWindowUWindowDynamicTextAreaData WinWidth ServerPort CurrentState ErrorCodebClosedProxyServerAddressProxyServerPort ConnectingWaitingForHeaderReceivingHeaderReceivingData HadErrorUWindowDialogClientWindow InAddressRow OwnerWindow UWindowListUWindowComboListItemCodeUWindowListControl bGotDatabWindowVisible bDisabledBroadcastAddrbIgnoreLDoubleClick LookAndFeelCursorPortAddr GetFallback GetMasterGetIRCIpAddr bSizableUdpLinkUWindowCheckboxUWindowDialogControlUWindowButton bHasOpened GetLevel FoundHeaderSize_ScrollbarWidth NickNameSetSize OverTextureColumnHeadingHeight bByParent BringToFrontPagebFlashWindowToGlobalSetAcceptsFocusGlobalToWindow SourceItemCaption SplitPos SelectedTab RowHeight InUserIdent InFullNameInDefaultChannelModeCRNickHDrawClippedTextureTemp2ActionCopy bChecked ItemClass DrawColorTile ClipTextAddressValueKeyNewNick MaxPlayers AwayTextMinNetVersion OldWinHeightEngineVersionJunkOutTextIn CurrentFrame CurrentTimebSpin ScreenshotNewUser TimeSeconds TimeDilationOldNickReason PlayerIDUWindowVSplitter PlayerNamebVoice NumPlayers ElapsedTimePingAll Favorites OpenLocationbSuspendableSortLtriestemp SentinelRuleUWindowVScrollbar RulesListIP EditFavorite NewFavoriteUWindowURLTextAreaUWindowSmallCloseButton CloseItemUWindowSmallButtonPartJoinWaitTimeoutTimeN CloseChatF MeshName PlayerList BoldStateUnderlineState ColorStateGXGYFGBGbColorbNormal bReverseResultGetEntryLevel StatusURLServerListTitle WaitResult URLAppendAutoRefreshTime bNoAutoSortbFallbackFactoriesUWindowPulldownMenuServerListClass PingedList UnpingedList Factories QueryDone MatchData TimeElapsed bPingSuspend bPingResumebPingResumeIntialUWindowTabControlItem SubsetList SupersetListURL bBottomGrowbHadInitialRefreshFallbackFactory VSplitter InfoWindow InfoClient InfoItemMinHeightForSplitter EPingStateBottomClientWindowTopClientWindowFonts HandCursor MaxSplitPos OldWinWidthRightClientWindowLeftClientWindowUWindowPageControl bToEndOfLineUWindowHTMLTextArea ErrorString PingStateTeamNumIdMbShow bFloating bNoActivateLinkItem bAutoInfoNewItemSubsetNext Superset NextState GetParent SelectedItem bBySupersetbSaveExistingList bInNoSortpos FullNameP NextSubsetNum SkinDescFact bSuccess ErrorMsgbDone SkinNamePrefixbUsePingedListMapNamePercentCompleteTotalReturnedServers TotalServersPingedServers MyServers DeltaTimeDeltaFoundFC ColumnNumServerAddress ServerURITimeOutTAClassMenuXMenuYCommand EInputKey ChannelName UserList Splitter EInputActionStyleRegionOwnerbHidden TextSize KickedNickKickerTextYLXLDynamicLoadObject PrivNickEji PageParentOldPlayerName SetupClient bConnectedbAway ReplaceTextInURIInPort bStretchedtChanSPriv ReturnValueGNewPageRWYX PageControlColumn UpTexture DownTextureTopRow bGotMOTDbHadInitialQueryURIsCMOTDB ScriptTextDescriptionEdit CurrentURIUpdateDescriptionCheckMaxURIIPEdit UpdateWindow GamePortEditGetMOTDQueryPortEditUWindowComboListControlOffset CenterPos CenterWidth LevelInfo ServerCombo ChannelComboConnectButton InTimeOutMenubHasReadWarning bStatusBarStatusBarText MinWinHeight MinWinWidthUWindowComboControlUWindowClientWindowUWindowWindow ConfirmJoinPlayerReplicationInfoInfo ViewportCanvas OpenComboFontLevel OpenHistory EditWidthActor HistoryItem HSplitter PrevSplitPos EditBoxWidthServerListNamesbKeepMasterServerIRC ClientArea bShowHorizSBDefaultChannel UserIdent SystemPageLANPagePageBeforeLANFactoryWindowsMCPawn PlayerPawnBitmap NewServersbHadNewServer CloseButtonChannelPlayer BannerWindowStatusBarDefaultTextbStandaloneBrowser OwnerTabListGrid OKButton EditControlItemsVertSB Background TextArea Selected NextBlockVisibleSkipped TopMargin BottomMarginbSelectNearestTabOnRemove InNickName HighlightNonePlayersTexturebSortDescending UWindowBase InSystemPage InServerSelectedServer TimePassedLineOldPingServerMessageConsolePlayCmdUserClassPackageInputOut MainWindow BannerAdNoneBannerAdWindowbChOpUTUBTCConst Category HostName NewListEntryFavoriteCount TextBuffer GameMode GameTypeTemp3bLocalServersOnlybCompatibleServersOnly MinPlayersMaxPing bAddModifier LogoImagesSupersetWindowObject MinNetVerGameVer PlayerMesh PlayerSkin PlayerFace PlayerTeam PlayerFrags PlayerPing bDescendingPTPBEnumRTRB TotalPlayersTotalMaxPlayersbNeedUpdateCountIcons ServerPing bPinging bPingFailedbPingedbNoInitalPing bOldServerbKeepDescription bLocalServer GamePort MapTitleMapDisplayName FunctionStateStruct StrPropertyStructProperty OldSentinelClassProperty NamePropertyObjectPropertyFloatProperty TotalPinging BoolPropertyFindIPFindQueryPort IntProperty BytePropertySubsetFactory bOldElementbOpNoneNoneServerCountLeader bUseMapNamePlayerCountLeaderNoneWorldLogWorkingTrueWorldLogWorkingFalseWorldLogWorkingTextPlayerListSortColumn EnabledTextBotText DisabledText ngSecretText PlayerStatsNextWindowDescNonengSecretColumnngSecretWidthNextWindowClassNoneGetNextIntDescNoneNoneNoneNoneNoneNoneMaxSimBroadbandPingNoneNoneCurrentNetSpeedNone Palette169 Palette167NoneNone PasswordTextNone ChangeHalfOpTextAreaClipTextTextAreaTextSize DrawTextLine IndentSize CheckMaxRows bHCenterChannelPrefixes Palette1DefaultTextHeight UserPrefixes UPhalfopUPop WrapParent RowClassbDirtybHalfOpindent bRowDirtyUPvoice Palette3TQXsgK4ggggggg~(ggggggggggggggggggggggggggggggggggg~ۊK4ggK4~ۤ+R@Ggggg~ggggggggggggggg~ 5c 5c 5cF)e 5cMTUgg~g~g~ggg~gg~~~gMTUMTU (r+PMTUMTU+PMTUMTUMTUMTUMTU~MTU|" p"]"zVhR@rK4rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrn"zz @zP}m6j~ -W -W~ -W~g -W~g -W~gg -W~gggg܌̅܌̅܌̅܌̅g܌̅ggggg""""""g"gg"gg 5c 5c 5c 5c 5c 5c 5c 5cF)eg~ggg((ggggg g(gggggg+g?{~ -W -W -W -W -W 5c 5c 5c 5c 5c -W -W -W -W -W -W 5c 5c 5c 5c 5c 5cc1Q`c1Q`c1Q`c1Q`c1Q`c1Q`c1Q`(ɗo !+ o  !+ ggo !+ c1Q`c1Q`c1Q` ((!+ !+ !+ !+ c1Q`c1Q`( c1Q`c1Q`!+ c1Q`c1Q`c1Q` ((( 5c -Wc1Q`c1Q`c1Q`+g!+ o g -W -W -W~ -Wc1Q` c1Q` c1Q`  !+ g!+  -W -W -W~ -Wi]UBrowser.UBrowserServerListf]UBrowser.UBrowserServerGrideg*u]Infom] Playersl] Serversk]43Querying master server (hit F5 if nothing happens)j]Master Server Failed: i]Pinging Serversh] Completez0niC6|I?E0fwP1Cto 1Ct1Ct1CtBs+{#U+{#U1CtN2fN2fN2fN2f7`?{?{N2fJ%λN2f?{BsBs?{7`?{?{N2fJ%λN2f?{BsBs?{1Ct7`?{?{N2fJ%λN2f?{Bs?{Bs?{7`7`N2fN2f7`7`N2f7`?{N2fJ%λ1CtN2fJ%λ1CtN2fJ%λ1CtN2fN2fN2f7`N2fBsN2f7`?{BsBsBsBsN2fzZ1Ct1Ct1Ct1Ct7`?{?{7`1Ct1Ct7`N2f+{#U+{#U+P1Ct7`?{?{Bs?{7`?{?{N2f?{1Ctc1Q`tc1Q`zZc1Q`c1Q`c1Q`c1Q`c1Q`c1Q`c1Q`]]Not in a channel!a]You were kicked from`-byb] is awaygT zzzz0jR{6%N2f0fwJ%λJ%λJ%λzZzZJ%λzZJ%λJ%λzZJ%λzZJ%λzZJ%λI?EI?E1CtI?EI?EI?E1CtzZzZzZ`tI?E`zZ`````g|zzxzp~\ -WK4ztg[ 5cK4zz@zjaE tRFy&. tRF tRF tRF tRF tRF tRF tRF tRF tRF tRF tRF tRF tRF tRFzz@zAJK2܌̅M+g+g+++o /T2o o o o o o o o o /T2o o C]Unreal Server BrowserzzE@zzIzQrU (K4 ( ( (n"zzy@zzzz@zzLz0F~@6Bs0fwzZI?EzZzZ.'lI?E+zZ.'lI?E+zZzZI?EI?E1CtI?EI?EI?E1CtI?E7`gbzz@zSWw A4yc1Q`c1Q```c1Q`c1Q`c1Q`c1Q```c1Q`c1Q`c1Q`c1Q`c1Q`c1Q`c1Q````c1Q`c1Q`c1Q`c1Q`c1Q`````zza @zz@zNCW2_(ɘ{~~~gggggggggggggggggggggggggggggg˰g+gg~ۃ.'lo /T2~gg~gg*Q*Q*Q*Q*Q~~~gg~~ggg~gxo ~gԌԌ˰g˝ԺԺgԺgԺgԺgԺgg*Q*Qo ~*Qk]Server@]Ping] Map NameA] PlayersD"zzn@zzzzzzGzp`y2!+ Mo o o OQR7OQR7EzT{o"K4gggggggggggggggzzO zzm@zz<zz=zz}zz?z1z3z^F q2*QJ!;aGg;aGg;aGg;aG;aG(ɛ;aG((~((((܌̅+ggw]&Play on This Serverp]&Refresh All Serversu]&Server and Player Infoh]Add to &Favoritesv]P&ing This Serveru]Ping &All ServerstMOpen &Locations]&Copy This Server LocationzNKJ6)+gA4y7`?{f«*I?E@S~~~~~~ۡ7`7`7`7`o !+ 7`7`7`7`7`?{~ۡ7`~ە?{~ە?{+7`?{~ۡ7`~ە?{~ە?{+L] UBrowserLANh] FavoritesK]ChatS]NewsR]#"UBrowser.UBrowserServerListWindowQ]"!UBrowser.UBrowserFavoriteServersP]%$UBrowser.UBrowserUpdateServerWindowzz/@zzy zz`@zzhzoG|60fw˓ttzZˣzZ˓tttttzZt?{?{?{նmնmնmնmնmo նmttttl]UBrowser.UBrowserIRCTextArea`] has leftt= has joinedg]was kicked byf]is now known asc]Quite] sets modezT@s~:01CtTxI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EPI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?EI?E3'J]#"Invalid server address, aborting.}]%$Error binding local port, aborting.G]-,Failed to resolve server address, aborting.F= Connected.H]Connecting tou]Timeout connecting to server.D]invites you to joinG] DisconnectedE]UBrowser IRC Client version zzS@zz]zzTzMzD@zzUzzzzYzz_@zzzzEzzy zzF@zz@zzh zzzzzzr z"zBzzr@zzzzPzzqz!zw@@zzBzsVF J%λN2fI?E tRF tRFʊK4 tRFʊK4 tRFʊK4螚xxxxxxxo  tRF tRF tRF tRFʊK4 tRF tRF tRF tRF tRFʊK4 tRFʊK4m$PAf zzszzzqY>lMTU6ggggggggggggggPPgggggggggggggggggggggggggggggggggPggrgrrrgrrgrrgrrgrrgrrgrrgrrggggrggrgg (gg (gggg ( ( ( (g ( ( (gg3'm] Admin Emailb= Admin Nameo]Change Levelsp]Bots in Multiplayerq= Frag Limitr= Time Limit_] Game Modea] Game Typeu] Game Versionr] ngWorldStatsu] Mutatorsx] Enabled\] DisabledQMServer AddressN]Required Team ScoreO]Bots Enter Game for Min. of] Players@] Max TeamsB]Bots Balance Teams{]Force Team Balancej]Friendly Fire Damage}]Min. Compatible Version~] Bot Skilly]Tournament Modez] Server Mode|] Dedicatedb]Non-Dedicated\]ngWorldStats StatusZ]Processing Stats Correctly[] Not Processing Stats Correctlyy]Requires Password`"w" z"zz]zzFx2OQR7J!!+  g!+ p]&Refresh Infon]&Closezz:zzLzfzzzN zzSzzKzz5@zzEzJzq zzNzzAzmzZzzAzzzfbl6 ^=~g^h{ggggg^h{s] UBrowser.UBrowserFavoritesFactgzdzz^zzg@zzz@zzizszkzz] zzjzTzgs:f١TxAv"Av"Av"Av"Av"Av"3'm]+*The master server could not be resolved: u]&%Timeout talking to the master serverU]-,Connecting to the master server timed out: zzzzzP zpzzgzzCzz_@zz nZ]meoz 釅mXaXaXaXaXaP3'Z]unreal.epicgames.com["Pz"zzU z z@zz~zzEzzHzTZv:sTxq_q_q_q_q_3'm]+*The master server could not be resolved: u]&%Timeout talking to the master serverU]-,Connecting to the master server timed out: zz`zzqzzpz*zzzbzzq@zzK@zzgly zJ@zz[zezzzO@zzu @zzCzzhzzizz6zzzzvzzCzz^zzzzD2zzWzzC zzzXzXzzR@zzK@zzl@zz@zN[gTx2!PPP3'Rzzg@zz@zzzg^_2Xabomeomeomeomeo܌̅+g܌̅+gbobo܌̅bo܌̅meomeoPmeomeo_]Querying Server...^]The server did not respond.]mlb\"zzE z z{o?-*g*t* zYz zjzzUzzzzzzzzzkE^boHma.'lo /T2zzzz@zSSIe6x9x9x93'zzzztzzozzzzezzZT 5- -TS z{zzizzhzz[zzz zCz zrzzZzzY@zzdzzFzzqzzzz}zzz z[zzDzzBzzKzzzFkA6K@S~_4_4_4_4_4_4jbK4螐_4jbK4螊K4螐_4jbK4螸e?;e?;_4_4_4_4_4_4jbK4螐_4jbK4螊K4螐_4jbK4螸e?;e?;_4jbK4螐_4_4_4_4I?EI?EI?E_4I?E_4I?E_4I?EI?E7Xë7Xë7Xë7Xë7XÐ_4_4_4_4_4_4_4_4_4_4_4_4_4_4_4_47XS]irc.gameslink.netd] #utgamesd #utchatd #utmodsd  #utlevelsd #uthelpP= IRC ServerK]Default ChannelX]XVChoose an IRC server from the list or type in your own IRC server name or IP address.W]dbChoose a default channel to join once the server has connected, or type in your own channel name.v] Connectx]LogoffY]! Connect to the IRC chat server.U]&%Disconnect from the IRC chat server.T]lThe Chat facility will connect you to the Internet Relay Chat (IRC) network.\n\nEpic Games is not responsible for the content of any channels in IRC. You enter these channels at your own risk.\n\nAre you sure you still want to connect?V] Warningz"JWF Av""f١f١ˤ+Pf١f١f١f١f١f١f١y"pj" y]unrealzzzzg zz}zzbzzJ @zzVzzt@zzi @zzd@@zz_zAzmzzX@zzc@zzP@zz]@zzWzzqzzzzF@zzYz zzzxzzWzzz zzzQzzkzzhz"UIn^h{"gggggggggggggggzzN@zz@zzyzz\zzDzzzzz zzzU @@zzqzzzzzzl@@zzi@@zzV@zzzzKzzuz@"mdZ q_"ss+Pssssssa]master.telefragged.comM] /servers.txty"Pj" zzzzzz2zzzzzzB zz_@zz`@zz{zzRzz}zzlzzozzJ zzR zz[ @zzu@zzM zP zOzzrzzC @@zz~@zzI zzz zE@zzz zv@zzPzqzt2@zzazzzzPzzHzzzzzoXP2U~-M.'l.'l.'l.'l7XÃ.'l.'l7XÃ.'l.'lВ.'l.'lВ.'l.'l.'l.'l.'lo o 7Xë7Xz-OKE\ ]Open Locationzzzz`zzxzzzzI zzwzzlzzzzt@zzK zzAzz@zzBzzNzzXzzo@zzzz] zFzzzTzzezz@zz>zzzOzOzz^zzwzzlzzzgCk2s\gM.'l.'l.'l.'l7XÃ.'l.'l7XÃ.'l.'lВ.'l.'lВ.'l.'l.'l.'l.'lo o o 7Xë7Xz-OKEr]Edit Favoritezzu@zzv@zz&zzT@zzEzzG@zzz zz zz zzzO@zzT @zzyzbzGzz]zzu @zzz"zR(6)F)e"ggg~ۤ+Pg~ۤ+Pgggggggggggggg~g~+g+g+g~~g~g~gggs$<Fhog]Could not find the window: v]Window is not ready: zz@zzzzZ zzO @zzzzJzz @@zzJ zzCzzzzTzzzzn@zzzz_zzLzz@zzY zOzN zOzJ@zz\ @zzzzzzRzzQzztzzP@zzazzJzzh@zzzz@ zzozzn@zzezz zzdzzdzzzzzzQz+pj2;r*~.'l*Qgtg|.Xgtgtgt.'l*Q(^=^h{g.'ls\gtt.'l*Qtg|.Xgtgtgtgttttt|.X|.XړttttttttttttttttX] DescriptionW]Auto-Update DescriptionV]Server IP AddressU]Server Port NumberY]Query Port NumberzzG @zzzzzz| zzE @z"wwHx9"eeg~gggg~g~ۤ+Peeee[]unrealZ"I"kzzzzB zzyzz%}#}y 7r}*} C %.}<. ?,A<#%<Y(< p<H' zzz@zzWzzzz`zzGzzzzRzzDzzwzxzoP VXP Q R <A<<<<% < zj zzXzz{zzOzzzzzzzczzzzc @zzWzzN zzzzF @@zzz zzzjzzf zzzzfc6! `2-r4r-r(RSt%S}$t22$t$$t-r(^S/c~$Hc zH5c~$D,c2$c}H$$c}H-r(^S/2^ichmmmc zj@zzXzze@zzz zzFSdaA .'lo /T2+o zzszzzzzzzzIzz@zzyzzzzXzzAzzzzzz\@zzfzz@zz@zzAzzmzz-zzAzz|zzf@zzx@zzzznzzvzzs@Dzzzzz^zEzz_zzWzzc@zzazzz!z@zz}zzf @zz@zzo@zzzzFzzzzYzzzzNzzd @zzzzzzdzzzzTzzG @zzzzWzzpz"zOzzzzezz\@zzzzw@zzzz@zzp @zzzz@zPT}eWoîJ!I?E@SI?E@SI?E;aGzzzzzz~zzzzzzn@zzWzzc@zz@zzzzbzzmzzHzznzz|zz@zzbzzk@@zz~ @zz` @zzszzN zzXzzj@zz@zzLzzzzY zzIzzD zzzz|@zzJ@(zl{  z@zzA zzKzzz zzzPzzz zVzz@zzAzzz z`zz} zzFzzzzB@zzNzzuzzC zz@zzI zzlzz z0z_zz`zzX@zz@zzzzzFMG2 f«*I?EI?E܌̅I?E7`7`7`7`?{I?E^]Systemzzc z"zyzzjzzd zzU zz_ zzkzzhzzmzzS @zzzzS zzTzzxzzH zz~@zzQ zz{zzm z0zb zzA zzz!zzzI@zz}zzLzzizz@zzs E ;(EdE &iP e:W YfVf-P e:W I.P   ]:W d PW _ PzW lPiW Z .P  OW Tj7npppunreal://:9:S:FW E  zezzzzC "Jf-r:*:F%i-r:*:F%j-r:*:F%I-r:*l-r:** zX @zzt zze @zzCzzFzzB @zzzz}zz@zzL @zz~ zzG @zzk zzU DR:' zZI^5 zzzo @zz@zzzzD zzI @zmLO6'\ .;~_4_4_4_4_4jbK4螐_4jbK4螊K4螐_4jbK4螸e?;e?;_4.'l.'l܌̅U~-xo _4_4_4_4_4_4_4_4_4_4_4_4_4_4R]Open:S]VTEnter a standard URL, or select one from the URL history. Press Enter to activate.zz^ zzL zzfzw~Q24` р%{ grԺ!+ OQR7OQR7OQR7ԌԌ grgԺԺԺԺԺԺԺxo ˰r˝ԺԺrԺrԺrԺrԺrԺrԺrԺrrԺrԺԺrI]NameE]FragsO]PingN]TeamM]MeshL]SkinK]FaceJ-IDa]ngWorldStats Status^= Registered`] Unregistered_]BotKzzzzu zzzzlzz_@zz@zzUh i64zh ,PING ppPONG h ,V z@zz[zz~@zz@zzdzzb zzK@zzj @ze[T2p e0{ g (Ժ!+ OQR7OQR7OQR7ԌԌ g (xo ˰ (˝ԺԺ (Ժ ( (I]RuleF]ValueKzzz@zz@@zz@zzY@zzv @zzw zzx zzzzz@zze@zzR@zzS zzzzH @zz@ zzzzLzzA zzazzZ@zzzxNVF ܉A4y gZ!Z!zzazzk@zzp zz| zzGzz`zzP zz\zzSzzYzz@zzuzzzzY@zzdzz@zzzzzzX zzw @zzqzz@@zzzz@zz[ zz@zzH@(za @(z{@@(zGzzc @@(z@zzzzk @zzBzzzzH@zzy@zzn zzzzg@@zz}zzv zzS @zz@zzf@zzM @zzdzzzzkbH$+L-Bbp rL*L.-z-L9bL_p L&<F{l L=l L=bL^}L[|L-v(- vLL-r(L zzTkWtz 釅mTx3'zzw @zzW@zze`DY zzazszz\zzZzzzzBzzB zzb@zzzzE @zzzzlzzpzzizzF zzc@zzK zzhzzLcrqpnzp@zzO zz~ @zzLzzz z @zz^zzU@zzW zz\ @zz\zzO@zz[ zzzz\` ~ bcM ` N S.` S[ [IY YI .   pB +G.+ +Dq.G`?m'( zzzozzV @zz{@zzL@zzzUzz @zz@zzy zzh @zzl zzzzzzAzzzzFzyzzp zzpzzzzbzzkzzx zz\zXzzz@zzNzzw z^zf @zz@zz`zz@zzzz}@zzX @zzIzzz@zzzzzzzzzzt@zz@zzP@zzyzz@zz]zWQB2 T gVJ!;aGI?E;aGI?E;aGI?EI?E@SI?E;aGv] &Connectx] &Disconnectv]&JoinzzW @zzszzzQ ]9..+ +q  ]Q  zIzzZ zz[ zzfzzVzz_ @zzQzzP @zzKzFzzzzzh zze zzf zzhzz\ @zzm@zz~zz_zzi zzj @zzzzh@zzm zzo zz@zzR@zzt^#I W * zq @zz@ @zzzzf@zzr @zzz @@zz{ @zz| @zzb @zzw @zz} @zzF @zz|@zz^zzN@ziRDC J`˛˰˭`˛`˛`˛0fw0fw.'lo /T2`˛`˛`˛`˛`˛0fw"P"zzV @zzA z*zG zzL zz@zz[zzzzzzO @zzc@zzW @zzu @zzQ zzR zzzzO @zzBzzr @@zzN @zzY @zz@zz@zzzz@zzZ zzzz] zzzz^ zz`zzR@zzd zze zzzzzzh @zz@zz@zzk @zz@zzb @zzn @zz@zz] @zzzzzzq zzJzzr zyZeu .'laA x+x+zzs zzx @zz@zz@zz@zzxzzL zz| zzzzzz@zz zzC@zz@zzAzzF@zzzzMzzI@zzzz~ zzD zzzz@zz{@zzU@zz^ @zz{ @zzV@zzT@zz@zzQ@zzW@zzY@zzrzzZ@zza@zz4@zz]@zz@zz[@zz`@zz@zzc@zyx2bbJ!Bs;aGBsb] &Close v]&Joinzzj@zzv@zzd@zzBzzfzzgzzGz"zz @zz@zzv@zzn@zzo@zz@ @zzR zzr@zzx@zztzzuzzzzl@zzx@zz|@zz[@zz}@zz@zzy @zz`@zz@@zzm zzt @zzzz|zz@zzEzzIzzE@zz~@zzG@zzb @(zzrncL2Khw4r*.'l*Q(^="g"ggtgtggtg|.Xgt^=g.'lttzz@zzzzLzzq@zzO@zzR@zzS@zzc@zzPzzT@zzzz@zzVzz@zzzzY@@zz@zz^@zz_@zz`@zz\zzzzazz@zz@Zzd@Zze@@Zz@zzg@zzf@@Zzzz@zz@zzlzzzzk@zznzz@@Fzs@zzR@zsEM2tK's\gz]NewEK] New Favoritezzx@Fzu@FzJzzq@Fz@zzi@zzY,MT/|,,MSG ,pPRIVMSG ,,]|,,LEAVE ,pPART ,,/~, /y,/,py,/y PRIVMSG NOTICE CKILL`,/&/~` @/,ppy`/ :`/& CTCP`,/&/~` /,pppppPRIVMSG `/ :&`/&& KICK`,/&/~` /g`/&h~g h,ppy`/gh :gh& QUIT,ppy :,/& ,,p,V zl @zz|@zzdzz~zzzzzz]_|m  zzzzzV@zzQzzB@@zzPzzUzzL@zzD zzk@zzN@zzO@zz}@zz[zzUzzS@zzT@zz[zzzzUzzX@zzY@zzyzzZ@zzzzzz_zzZ@zzKzz^@zzc@zzo@zzJ@zzfzz`@zzh@zz^zza@zz8@zzi@zzj@zz@zzk@zz@zzh@zzqzzrzzI zzzzX@zz[zzzzN@Dzzv@zzz@zz{@zz|zmz}zbzDzzzzE{l 6 z@zzzzm@zzvzzzzFzzGzzmzz@@zzCzzpzzZzzm@zzKzz@zzzzH@zze@zzP@zzdzzQ@zzT@zz`zzzzc@zzX@zzb@zzR@zzH@zz[@zzt@zz]@zzx@zzzz@zze@zzzzU@zzzz[uc@u.*:[Du=b-u-BHDu9tDSuFxDSu_ zdzzfzzkzzlzzzzJ@zzzznzz\B{]o *B.*:B=[ B-Bb-B9H BFJt B_Jx .^%.^.*P  ^(B@B B('' zzz~zzr@zzzz;zzq@zzU zzw@zzCz*YVp2 zX "$Text); } function ChannelAction(string Nick, string Text) { TextArea.AddText("* "$Nick$" "$Text); } function UserNotice(string Nick, string Text) { TextArea.AddText("-"$Nick$"- "$Text); } function ProcessInput(string Text) { if(Left(Text, 4) ~= "/me ") { ChannelAction(SystemPage.NickName, Mid(Text, 4)); SystemPage.Link.SendChannelAction(ChannelName, Mid(Text, 4)); } else if(Left(Text, 1) == "/") SystemPage.ProcessInput(Text); else { if(Text != "") { ChannelText(SystemPage.NickName, Text); SystemPage.Link.SendChannelText(ChannelName, Text); } } } function PartedChannel(string Nick) { TextArea.AddText("*** "$Nick@HasLeftText@ChannelName$"."); UserList.RemoveUser(Nick); } function JoinedChannel(string Nick) { TextArea.AddText("*** "$Nick@HasJoinedText@ChannelName$"."); UserList.AddUser(Nick); } function KickUser(string KickedNick, string Kicker, string Reason) { TextArea.AddText("*** "$KickedNick@WasKickedByText@Kicker$" ("$Reason$")"); UserList.RemoveUser(KickedNick); } function UserInChannel(string Nick) { UserList.AddUser(Nick); } function ChangedNick(string OldNick, string NewNick) { TextArea.AddText("*** "$OldNick@NowKnownAsText@NewNick$"."); UserList.ChangeNick(OldNick, NewNick); } function UserQuit(string Nick, string Reason) { TextArea.AddText("*** "$Nick@QuitText@"("$Reason$")."); UserList.RemoveUser(Nick); } function ChangeMode(string Nick, string Mode) { TextArea.AddText("*** "$Nick@SetsModeText$": "$Mode); } function ChangeOp(string Nick, bool bOp) { UserList.ChangeOp(Nick, bOp); } //utpg: halfop support function ChangeHalfOp(string Nick, bool bHalfOp) { UserList.ChangeHalfOp(Nick, bHalfOp); } //utpg: halfop support -- end function ChangeVoice(string Nick, bool bVoice) { UserList.ChangeVoice(Nick, bVoice); } zjzzfndf"n. [Qwn*n-] 'n. nn. [wn*n-] U . nng-#'nU j zn 1zT 2z|(H|i. p.@i  @% *iipi%i4Bi4Bii-'i-'W zA //============================================================================= // UBrowserInfoWindow //============================================================================= class UBrowserInfoWindow extends UWindowFramedWindow; var UBrowserInfoMenu Menu; function Created() { bSizable = True; bStatusBar = True; Menu = UBrowserInfoMenu(Root.CreateWindow(class'UBrowserInfoMenu', 0, 0, 100, 100)); Menu.Info = Self; Menu.HideWindow(); Super.Created(); SetSizes(); } function ResolutionChanged(float W, float H) { Super.ResolutionChanged(W, H); SetSizes(); } function SetSizes() { local UBrowserInfoClientWindow C; MinWinHeight = 100; SetSize(Min(Root.WinWidth - 20, 500), Min(Root.WinHeight - 30, 230)); } zzzNM-'-'0{}M%MN M{.jN M=j% zv\ Pe K%,ppp*** \ V (@).W L\  zif N *j P *i D *Z  _ * -*^ -*l o *_  ] *d  V * zU Xt^~{ St &u!>zG5zGD}~z2&5z2&D22}2&>{2-5 A&-5 A,Q K,u!zG5zGD}+z2&5z2&D22}2&A2-5 A,Q Q z}} :_wJ%&pp*** } b f .WQ} f  z\j \*(%ppp* j  k  zgca,t D7777x D7778 zsyki?% ?,$ zj class UBrowserInfoMenu extends UWindowRightClickMenu; var UWindowPulldownMenuItem Refresh, CloseItem; var localized string RefreshName; var localized string CloseName; var UBrowserInfoWindow Info; function Created() { Super.Created(); Refresh = AddMenuItem(RefreshName, None); AddMenuItem("-", None); CloseItem = AddMenuItem(CloseName, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case Refresh: UBrowserInfoClientWindow(Info.ClientArea).Server.ServerStatus(); break; case CloseItem: Info.Close(); break; } Super.ExecuteItem(I); } zT uMR M  (fq!! zDZ tTR%3pppp*** Z | w  (x )W LZ  zwm E/e(%ppp-m - n  zzzr_  *v-L_ s =j{jhjN j%%{ zfs , s F-\H-\(r %ts t?r t '-S  zIoC>*$on zD -6. U.6 6.` 6 ` 6UU.p U p U.F U F  zgjK Ijkl[?,[?, zA$DzQ??lD?, ?, ?lD?, ?,2?D?,?D?,?,D?, zDe OTBe .U! UCBBB'De  zYa f];9?G-ea ' zEk@Z:|k,http://upstart kn|k, unreal://Vk$(Vpunreal://k$(7 zK 1zGoh .+o zIpmY .+p z\ 0zzzzz E. ?,l?,@BA. ?,8?,@BAEP.\ E r$ zNiCMif$ zlclass UBrowserIRCJoinMenu expands UWindowRightClickMenu; function ExecuteItem(UWindowPulldownMenuItem I) { UBrowserIRCSystemPage(OwnerWindow).JoinChannel(I.Caption); Super.ExecuteItem(I); } function ShowWindow() { local UBrowserIRCSystemPage S; local int i; S = UBrowserIRCSystemPage(OwnerWindow); Super.ShowWindow(); Clear(); for (i=0; i<10; i++) if (S.SetupClient.IRCChannelHistory[i] != "") AddMenuItem(S.SetupClient.IRCChannelHistory[i], None); } zLzzO$VCB?D?,?D?, zR."28'?, zSt(thdE?,hE?,?,4?, zQzzzzcI2ICv~6KK6UU66 zTa 4/r^ |a A^ a on z_ p mH-p -o  + * *q *GS*SG-G"-m GEG+ " S * q *  S qG+ + * *q *GS*S z{! v! %z z[Uz[.  A A\C?[ Z[#%[Y([ p,[Bb.  AAC?b \b#%H.  AHB\C?H ^H#%HY(Hp,(HBt.  AB C?t `t#%tY'tp,t Bx.  AB C?x bx#%xY'xp,x B[c znjo I-^('-x(G-{-{(ID-A -Z zhqMKFhqD{q.+.  rq zaVkm)V $,tAJ'  zzz_zzbOc?4DZN*ZaZ*k% z]NSwUZN*ZaZ*kAkA Dzk% zYS(S 6KK6UU66 zVzzp@AppBYAXAcAeBUBTpBQAZeB_,d zeGA2@!-gD(g%jz. Dhrz* nzCrn* [ nzCZ?&Z"Z?_??Z?&_DZZZ+G%(] D?jgI?[ &?] D\%e&d.n?e?jg wd*?\C }%C+G@?ejd. &C,G@?ejSd] ,C,G@?ejSdh 2,C+G@?ejdP n,C+G@?ejd` ,C+G@?ejd ,C+G@?ejdO #,C,G@?ejSdo ,n|d[botC"G@?ejd|d[trueC"G@?ejaC"G@?ejc eD?e\d.d zl!Wv! %z zapLDLp, J{p.+.  Up zjzzzzzW D8WBiz2\final\K 'q!! zqk_Xu!pp\list\\gamename\e\final\-ip\A, %zHzgclass UBrowserHTTPFact extends UBrowserServerListFactory; var UBrowserHTTPLink Link; var() config string MasterServerAddress; // Address of the master server var() config string MasterServerURI; var() config int MasterServerTCPPort; // Optional port that the master server is listening on var() config int MasterServerTimeout; function Query(optional bool bBySuperset, optional bool bInitial) { Super.Query(bBySuperset, bInitial); Link = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserHTTPLink'); Link.MasterServerAddress = MasterServerAddress; Link.MasterServerURI = MasterServerURI; Link.MasterServerTCPPort = MasterServerTCPPort; Link.MasterServerTimeout = MasterServerTimeout; Link.OwnerFactory = Self; Link.Start(); } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Link.Destroy(); Link = None; Super.QueryFinished(bSuccess, ErrorMsg); } function Shutdown(optional bool bBySuperset) { if(Link != None) Link.Destroy(); Link = None; Super.Shutdown(bBySuperset); } zoii -I -x' zy{A` fi{. Ydw{*{~i{. {% zrzzT saR qpppTimed out in master server protocol. Waiting for H in state SaK  (hq!! zzzU xO^] O $&u!X,@, ,u!pppppp\gamename\e\location\SC\validate\A2e\final\q!_ ,u!z2final\K 'q!!-\ A, ,u!A2-\@,  zfu|?^ !r^* Z.!^mMKY W ZY ZW Z" zMzzwE+-u EFGAm. zDm)Acm )D zAs{-u 'Dy:wZ*ZN*ZaZa{ZNZO-}( zP Au XL P :&B P :,\&KHL JB e zP zyG]1p -\w.q* .qq * qDEwE*Gppb - E=Gbjz. Y/wz*z~jz. z zs u^8I W *u t *H  q * zzztDnQ<. DC>D z@d  f/_d e f h. q. YFwq* :h:$Cq~hhC:C:$q~I`q~Bq~I`AWq~fCht:C:$I`BI`AWfB%M D?`B?BC W$@%h1)ppppppS  (WS p)Th )S ] z$h)p~ W] $ $hp)pppppppppppppp}  SM % w . WSA p, XSS Q ] Z$hI)ppppppppWSA p, XSS Q ]  z|o zzzjclass UBrowserIRCLink expands UBrowserBufferedTCPLink; var IpAddr ServerIpAddr; var string ServerAddress; var int ServerPort; var string NickName; var string UserIdent; var string FullName; var string DefaultChannel; var localized string InvalidAddressText; var localized string ErrorBindingText; var localized string ResolveFailedText; var localized string ConnectedText; var localized string ConnectingToText; var localized string TimeOutError; var localized string InviteString; var UBrowserIRCSystemPage SystemPage; var string DisconnectReason; var string VersionString; //utpg: user/channel prefix var string UPop; var string UPhalfop; var string UPvoice; var string UserPrefixes; var string ChannelPrefixes; // &# //utpg: user/channel prefix -- end function PostBeginPlay() { Super.PostBeginPlay(); Disable('Tick'); } function Connect(UBrowserIRCSystemPage InSystemPage, string InServer, string InNickName, string InUserIdent, string InFullName, string InDefaultChannel) { local int i; UPop = "@"; UPhalfop = "%"; UPvoice = "+"; UserPrefixes = UPop$UPhalfop$UPvoice; ChannelPrefixes = "&#"; SystemPage = InSystemPage; NickName = InNickName; FullName = InFullName; UserIdent = InUserIdent; DefaultChannel = InDefaultChannel; i = InStr(InServer, ":"); if(i == -1) { ServerAddress = InServer; ServerPort = 6667; } else { ServerAddress = Left(InServer, i); ServerPort = Int(Mid(InServer, i+1)); } ResetBuffer(); ServerIpAddr.Port = ServerPort; SetTimer(20, False); SystemPage.SystemText( ConnectingToText@ServerAddress ); Resolve( ServerAddress ); } function string ChopLeft(string Text) { while(Text != "" && InStr(": !", Left(Text, 1)) != -1) Text = Mid(Text, 1); return Text; } function string RemoveNickPrefix(string Nick) { while(Nick != "" && InStr(":"$UserPrefixes, Left(Nick, 1)) != -1) //utpg: FIXME: use prefixes Nick = Mid(Nick, 1); return Nick; } function string Chop(string Text) { while(Text != "" && InStr(": !", Left(Text, 1)) != -1) Text = Mid(Text, 1); while(Text != "" && InStr(": !", Right(Text, 1)) != -1) Text = Left(Text, Len(Text)-1); return Text; } function Resolved( IpAddr Addr ) { // Set the address ServerIpAddr.Addr = Addr.Addr; // Handle failure. if( ServerIpAddr.Addr == 0 ) { if(SystemPage != None) { SystemPage.SystemText( InvalidAddressText ); SystemPage.Disconnect(); } return; } // Display success message. Log( "UBrowserIRCLink: Server is "$ServerAddress$":"$ServerIpAddr.Port ); // Bind the local port. if( BindPort() == 0 ) { if(SystemPage != None) { SystemPage.SystemText( ErrorBindingText ); SystemPage.Disconnect(); } return; } Open( ServerIpAddr ); } event Closed() { if(SystemPage != None) SystemPage.Disconnect(); } // Host resolution failue. function ResolveFailed() { if(SystemPage != None) { SystemPage.SystemText(ResolveFailedText); SystemPage.Disconnect(); } } event Timer() { if(SystemPage != None) { SystemPage.SystemText( TimeOutError ); SystemPage.Disconnect(); } return; } event Opened() { SetTimer(0, False); if(SystemPage != None) SystemPage.SystemText(ConnectedText); Enable('Tick'); GotoState('LoggingIn'); } function Tick(float DeltaTime) { local string Line; DoBufferQueueIO(); if(ReadBufferedLine(Line)) ProcessInput(Line); } function SendCommandText(string Text) { local int i, j; local string Cmd, Temp, Temp2; // Process fake commands like /MSG if(Left(Text, 4) ~= "MSG ") Text = "PRIVMSG "$Mid(Text, 4); if(Left(Text, 6) ~= "LEAVE ") Text = "PART "$Mid(Text, 6); // Add colons for commands: PRIVMSG, QUIT, KILL, KICK, NOTICE i = InStr(Text, " "); if(i != -1) { Cmd = Caps(Left(Text, i)); Text = Cmd$Mid(Text, i); switch(Cmd) { // CMD nick :message case "PRIVMSG": case "NOTICE": case "KILL": Temp = ChopLeft(Mid(Text, i+1)); i = InStr(Temp, " "); if(i != -1) Text = Cmd@Left(Temp, i)$" :"$ChopLeft(Mid(Temp, i+1)); break; // hack for CTCP case "CTCP": Temp = ChopLeft(Mid(Text, i+1)); i = InStr(Temp, " "); if(i != -1) Text = "PRIVMSG "$Left(Temp, i)$" :"$Chr(1)$ChopLeft(Mid(Temp, i+1))$Chr(1); break; // CMD #channel nick :message case "KICK": Temp = ChopLeft(Mid(Text, i+1)); i = InStr(Temp, " "); if(i != -1) { Temp2 = ChopLeft(Mid(Temp, i+1)); j = InStr(Temp2, " "); if(j != -1) Text = Cmd@Left(Temp, i)@Left(Temp2, j)$" :"$ChopLeft(Mid(Temp2, j+1)); } break; // CMD :message case "QUIT": Text = Cmd$" :"$ChopLeft(Mid(Text, i+1)); break; } } else Text = Caps(Text); SendBufferedData(Text$CRLF); } function SendChannelText(string Channel, string Text) { SendBufferedData("PRIVMSG "$Channel$" :"$Text$CRLF); } function SendChannelAction(string Channel, string Text) { SendBufferedData("PRIVMSG "$Channel$" :"$Chr(1)$"ACTION "$Text$Chr(1)$CRLF); } function ProcessInput(string Line) { // Respond to PING if(Left(Line, 5) == "PING ") SendBufferedData("PONG "$Mid(Line, 5)$CRLF); } state LoggingIn { function ProcessInput(string Line) { local string Temp, Temp2; local int i; Temp = ParseDelimited(Line, " ", 2); if(ParseDelimited(Line, " ", 1)== "ERROR") SystemPage.SystemText(ChopLeft(ParseDelimited(Line, ":", 2, True))); // Handle nick already in use on connect... if(Temp == "433") { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); } //utpg: figure out CHANTYPES= and PREFIX= else if(Temp == "005") { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); i = 3; Temp = ParseDelimited(Line, " ", i); while (Temp != "") { if (Left(Temp, 10) ~= "CHANTYPES=") { ChannelPrefixes = Mid(Temp, 10); SystemPage.SystemText("Supported CHANTYPES: "$ChannelPrefixes); // FIXME: DEBUG: remove before release } else if (Left(Temp, 7) ~= "PREFIX=") { //PREFIX=(ov)@+ or PREFIX=(ohv)@%+ Temp = Mid(Temp, 7); if (Left(Temp, 1) == "(") { Temp2 = Mid(Temp, (InStr(Temp, ")")+1)); // temp = ohv; temp2 = @%+ Temp = Mid(Temp, 1); while (Temp2 != "") { switch (Caps(Left(Temp, 1))) { case "O": UPop = Left(Temp2, 1); break; case "H": UPhalfop = Left(Temp2, 1); break; case "V": UPvoice = Left(Temp2, 1); break; } Temp = Mid(Temp, 1); Temp2 = Mid(Temp2, 1); } UserPrefixes = UPop$UPhalfop$UPvoice; SystemPage.SystemText("Used user PREFIX: "$UserPrefixes); // FIXME: DEBUG: remove before release } } i++; Temp = ParseDelimited(Line, " ", i); } } //utpg: figure out CHANTYPES= and PREFIX= -- end else if(Int(Temp) > 5) // on 005 we are really logged in { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); GotoState('LoggedIn'); } else { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); } Global.ProcessInput(Line); } function SendCommandText(string Text) { Global.SendCommandText(Text); if(ParseDelimited(Text, " ", 1) ~= "NICK") { SystemPage.ChangedNick(NickName, Chop(ParseDelimited(Text, " ", 2))); } } Begin: SendBufferedData("USER "$UserIdent$" localhost "$ServerAddress$" :"$FullName$CRLF); SendBufferedData("NICK "$NickName$CRLF); } state LoggedIn { function ProcessInput(string Line) { local string Temp, Temp2, Temp3; local bool bAddModifier; local int i; local string Command; Global.ProcessInput(Line); Command = ParseDelimited(Line, " ", 2); if(ParseDelimited(Line, " ", 1) == "ERROR") { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, ":", 2, True))); } else if(Command == "JOIN") { Temp = ParseDelimited(Line, ":!", 2); if(Temp ~= NickName) Temp = ""; SystemPage.JoinedChannel(Chop(ParseDelimited(Line, " ", 3)), Temp); } else if(Command == "PART") { Temp = ParseDelimited(Line, ":!", 2); if(Temp ~= NickName) Temp = ""; SystemPage.PartedChannel(Chop(ParseDelimited(Line, " ", 3)), Temp); } else if(Command == "NICK") { SystemPage.ChangedNick(ParseDelimited(Line, ":!", 2), Chop(ParseDelimited(Line, " ", 3))); } else if(Command == "QUIT") { SystemPage.UserQuit(ParseDelimited(Line, ":!", 2), ChopLeft(ParseDelimited(Line, " ", 3, True))); } else if(Command == "353") // NAMES { Temp2 = ParseDelimited(Line, "#", 2); Temp2 = ParseDelimited(Temp2, " :", 1); Temp = ParseDelimited(Line, ":", 3, True); while(Temp != "") { // Nickname Temp3 = ParseDelimited(Temp, " ", 1); SystemPage.UserInChannel("#"$Temp2, RemoveNickPrefix(Temp3)); if(Left(Temp3, 1) == UPop) SystemPage.ChangeOp("#"$Temp2, RemoveNickPrefix(Temp3), True); else if(Left(Temp3, 1) == UPvoice) SystemPage.ChangeVoice("#"$Temp2, RemoveNickPrefix(Temp3), True); //utpg: halfop support else if(Left(Temp3, 1) == UPhalfop) SystemPage.ChangeHalfop("#"$Temp2, RemoveNickPrefix(Temp3), True); //utpg: halfop support -- end //utpg: FIXME: use prefix + add halfop support Temp = ParseDelimited(Temp, " ", 2, True); } } else if(Command == "333") // Channel formed info { } else if(Command == "366") // End of NAMES { } else if(Command == "331") // RPL_NOTOPIC { } else if(Command == "332") // RPL_TOPIC { } else if(Command == "341") // RPL_INVITING { } else if(Command == "301") // RPL_AWAY { SystemPage.IsAway(Chop(ParseDelimited(Line, " ", 4)), ChopLeft(ParseDelimited(Line, ":", 3, True))); } else if(Command == "NOTICE") { Temp = ParseDelimited(Line, ": ", 2); Temp2 = ParseDelimited(Line, ":! ", 2); if(InStr(Temp, "!") != -1 && InStr(Temp2, ".") == -1) { // it's a Nick. Temp = ChopLeft(ParseDelimited(Line, " ", 4, True)); if(Asc(Left(Temp, 1)) == 1 && Asc(Right(Temp, 1)) == 1) SystemPage.CTCP("", Temp2, Mid(Temp, 1, Len(Temp) - 2)); else SystemPage.UserNotice(Temp2, Temp); } else SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 4, True))); } else if(Int(Command)!= 0) { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 4, True))); } else if(Command == "MODE") { // channel mode Temp = Chop(ParseDelimited(Line, " ", 4)); // channel Temp3 = Chop(ParseDelimited(Line, " ", 3)); i = 5; bAddModifier = True; while(Temp != "") { Temp2 = Left(Temp, 1); if(Temp2 == "+") bAddModifier = True; if(Temp2 == "-") bAddModifier = False; if(Temp2 == UPop) { SystemPage.ChangeOp(Temp3, Chop(ParseDelimited(Line, " ", i)), bAddModifier); i++; } if(Temp2 == UPvoice) { SystemPage.ChangeVoice(Temp3, Chop(ParseDelimited(Line, " ", i)), bAddModifier); i++; } //utpg: halfop support if(Temp2 == UPhalfop) { SystemPage.ChangeHalfOp(Temp3, Chop(ParseDelimited(Line, " ", i)), bAddModifier); i++; } //utpg: halfop support -- end Temp = Mid(Temp, 1); } SystemPage.ChangeMode(Temp3, ParseDelimited(Line, ":!", 2), ChopLeft(ParseDelimited(Line, " ", 4, True))); } else if(Command == "KICK") { // FIXME: handle multiple kicks in a single message SystemPage.KickUser(Chop(ParseDelimited(Line, " ", 3)), Chop(ParseDelimited(Line, " ", 4)), ParseDelimited(Line, ":!", 2), ChopLeft(ParseDelimited(Line, ":", 3, True))); } else if(Command == "INVITE") { SystemPage.SystemText(ParseDelimited(Line, ":!", 2)@InviteString@ParseDelimited(Line, ":", 3)); } else if(Command == "PRIVMSG") { Temp = Chop(ParseDelimited(Line, " ", 3)); Temp2 = ChopLeft(ParseDelimited(Line, " ", 4, True)); if(Mid(Temp2, 1, 7) == "ACTION " && Asc(Left(Temp2, 1))==1 && Asc(Right(Temp2, 1))==1) { Temp2 = Mid(Temp2, 8); Temp2 = Left(Temp2, Len(Temp2) - 1); if(Temp != "" && InStr("&#@", Left(Temp, 1)) != -1) //utpg: FIXME: use prefix SystemPage.ChannelAction(Temp, ParseDelimited(Line, ":!", 2), Temp2); else SystemPage.PrivateAction(ParseDelimited(Line, ":!", 2), Temp2); } else if(Asc(Left(Temp2, 1))==1 && Asc(Right(Temp2, 1))==1) { Temp2 = Mid(Temp2, 1, Len(Temp2) - 2); switch(Temp2) { case "VERSION": SendBufferedData("NOTICE "$ParseDelimited(Line, ":!", 2)$" :"$Chr(1)$"VERSION "$VersionString$Level.EngineVersion$Chr(1)$CRLF); SystemPage.CTCP(Temp, ParseDelimited(Line, ":!", 2), Temp2); break; default: SystemPage.CTCP(Temp, ParseDelimited(Line, ":!", 2), Temp2); break; } } else { if(Temp != "" && InStr("&#@", Left(Temp, 1)) != -1) SystemPage.ChannelText(Temp, ParseDelimited(Line, ":!", 2), Temp2); else SystemPage.PrivateText(ParseDelimited(Line, ":!", 2), Temp2); } } } Begin: JoinChannel(DefaultChannel); } function JoinChannel(string Channel) { if(Left(Channel, 1) == "#") SendBufferedData("JOIN "$Channel$CRLF); } function PartChannel(string Channel) { if(Left(Channel, 1) == "#") SendBufferedData("PART "$Channel$CRLF); } function SetNick(string NewNick) { SendBufferedData("NICK "$NewNick$CRLF); } function SetAway(string AwayText) { SendBufferedData("AWAY :"$AwayText$CRLF); } function DestroyLink() { SystemPage = None; if(IsConnected()) { SendText("QUIT :"$DisconnectReason$CRLF); Close(); } else Destroy(); } zZ9A.b| zL D3@ALCmC zBJAS!-^D(^%oM. DhrM* YMArY* O YJ%(R D?o^I?O &?R Dh%~&@.YQ?~?o^ w@*.?hK %K+J@?~o@@ &K+J@?~o@T  ~D?~h@.@> zbg 5[\HV&g FwV*V-X-\  CV zHyc.-K 'u!-\basic\\secure\@& zGzzMzzIF\mUBrowserGSpyLink: Failed to resolve master server address, aborting.K (poFq!! zJ{W zN/Mhf-K UBrowserGSpyLink: Couldn't connect to master server.K (pgFq!! zC ze;e ZuP  0D! sCBBB' H P  0D! tCBBB' I.^P   h:e  C e zo  384zZL *&-L $-L }r zO~_46_6~e6_%UBrowserGSpyLink: Invalid master server address, aborting. pppUBrowserGSpyLink: Master Server is F:S6_R%UBrowserGSpyLink: Error binding local port, aborting. [_a?D ( z[P6.+[ zUQ"CUM6_J HzFFppmasterSC.gamespy.comSF zCR|R]i !ri* [.!imluN K [N [K [" zlzzJ//============================================================================= // UBrowserInfoClientWindow - extra info on a specific server //============================================================================= class UBrowserInfoClientWindow extends UWindowClientWindow; var UBrowserServerList Server; var UWindowVSplitter VSplitter; var UWindowHSplitter HSplitter; var float PrevSplitPos; function Created() { Super.Created(); VSplitter = UWindowVSplitter(CreateWindow(class'UWindowVSplitter', 0, 0, WinWidth, WinHeight)); HSplitter = UWindowHSplitter(VSplitter.CreateWindow(class'UWindowHSplitter', 0, 0, WinWidth, WinHeight)); VSplitter.TopClientWindow = UBrowserPlayerGrid(VSplitter.CreateWindow(class'UBrowserPlayerGrid', 0, 0, WinWidth, WinHeight)); VSplitter.BottomClientWindow = HSplitter; HSplitter.LeftClientWindow = UBrowserRulesGrid(HSplitter.CreateWindow(class'UBrowserRulesGrid', 0, 0, WinWidth, WinHeight)); HSplitter.RightClientWindow = UBrowserScreenshotCW(HSplitter.CreateWindow(class'UBrowserScreenshotCW', 0, 0, WinWidth, WinHeight)); } function Resized() { VSplitter.SetSize(WinWidth, WinHeight); VSplitter.OldWinHeight = VSplitter.WinHeight; VSplitter.SplitPos = WinHeight / 2; PrevSplitPos = VSplitter.SplitPos; HSplitter.WinWidth = WinWidth; HSplitter.OldWinWidth = WinWidth; HSplitter.SplitPos = WinWidth - VSplitter.SplitPos; } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); if(VSplitter.SplitPos != PrevSplitPos) { PrevSplitPos = VSplitter.SplitPos; HSplitter.SplitPos = HSplitter.WinWidth - (VSplitter.WinHeight - VSplitter.SplitPos); } } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); if(VSplitter.SplitPos != PrevSplitPos) { PrevSplitPos = VSplitter.SplitPos; HSplitter.SplitPos = HSplitter.WinWidth - (VSplitter.WinHeight - VSplitter.SplitPos); } } zxhaJ Sh.Qwh*h-r'h.h zXnv! zF K"" u-r:*F  zuclass UBrowserIRCSystemMenu expands UWindowRightClickMenu; var UWindowPulldownMenuItem Connect; var UWindowPulldownMenuItem Disconnect; var UWindowPulldownMenuItem Join; var localized string ConnectText; var localized string DisconnectText; var localized string JoinText; function Created() { Super.Created(); Connect = AddMenuItem(ConnectText, None); Disconnect = AddMenuItem(DisconnectText, None); AddMenuItem("-", None); Join = AddMenuItem(JoinText, None); Join.CreateSubMenu(class'UBrowserIRCJoinMenu', OwnerWindow); } function ExecuteItem(UWindowPulldownMenuItem I) { local UBrowserIRCSystemPage S; S = UBrowserIRCSystemPage(OwnerWindow); switch(I) { case Connect: S.SetupClient.DoJoin(); break; case Disconnect: S.Disconnect(); break; } Super.ExecuteItem(I); } function ShowWindow() { local UBrowserIRCSystemPage S; S = UBrowserIRCSystemPage(OwnerWindow); Super.ShowWindow(); Connect.bDisabled = S.bConnected; Disconnect.bDisabled = !S.bConnected; Join.bDisabled = !S.bConnected; } z] 4zQ@n`o<. DA>@ zjA${}r zY\oe  zzz^ 3z_ 2zK 1nZTwtD"B"s"r"q*dc*d~"a>~z]@zjFj;yrv6F$6F$6F$F| S k i ?& 6F=,6F=,6F=,F%(. v-X~DT'. v-W~FTL. v-x~ET~F| S p~. vM zd.=| z| |. |^'|-'}.|8l }?| zbN$Kv! zmnx $p$n zegV,+v@t%u+|ppvtu&#gAeI ^[ `e ZZ~^:ZB^u B^ZuJ^Z&M6buaA(PBSB zez zlGC'qBzG zGHpppp[f : z ]opppppp[f :G z ] zOn &0be. ^we*BzeMn ee. e* zx5class UBrowserHTTPClient extends UBrowserBufferedTcpLink; var IpAddr ServerIpAddr; var string ServerAddress; var string ServerURI; var int ServerPort; var int CurrentState; var int ErrorCode; var bool bClosed; var globalconfig string ProxyServerAddress; var globalconfig int ProxyServerPort; const Connecting = 0; const WaitingForHeader = 1; const ReceivingHeader = 2; const ReceivingData = 3; const HadError = 4; function PostBeginPlay() { Super.PostBeginPlay(); ServerIpAddr.Addr = 0; Disable('Tick'); } function Browse(string InAddress, string InURI, optional int InPort, optional int InTimeout) { CurrentState = Connecting; ServerAddress = InAddress; ServerURI = InURI; if(InPort == 0) ServerPort = 80; else ServerPort = InPort; if(InTimeout > 0 ) SetTimer(InTimeout, False); ResetBuffer(); if(ProxyServerAddress != "") { ServerIpAddr.Port = ProxyServerPort; if(ServerIpAddr.Addr == 0) Resolve( ProxyServerAddress ); else DoBind(); } else { ServerIpAddr.Port = ServerPort; if(ServerIpAddr.Addr == 0) Resolve( ServerAddress ); else DoBind(); } } function Resolved( IpAddr Addr ) { // Set the address ServerIpAddr.Addr = Addr.Addr; if( ServerIpAddr.Addr == 0 ) { Log( "UBrowserHTTPClient: Invalid server address" ); SetError(-1); return; } DoBind(); } function DoBind() { if( BindPort() == 0 ) { Log( "UBrowserHTTPLink: Error binding local port." ); SetError(-2); return; } Open( ServerIpAddr ); bClosed = False; } event Timer() { SetError(-3); } event Opened() { Enable('Tick'); if(ProxyServerAddress != "") SendBufferedData("GET http://"$ServerAddress$":"$string(ServerPort)$ServerURI$" HTTP/1.1"$CR$LF); else SendBufferedData("GET "$ServerURI$" HTTP/1.1"$CR$LF); SendBufferedData("User-Agent: Unreal"$CR$LF); SendBufferedData("Connection: close"$CR$LF); SendBufferedData("Host: "$ServerAddress$":"$ServerPort$CR$LF$CR$LF); CurrentState = WaitingForHeader; } function SetError(int Code) { Disable('Tick'); SetTimer(0, False); ResetBuffer(); CurrentState = HadError; ErrorCode = Code; if(!IsConnected() || !Close()) HTTPError(ErrorCode); } event Closed() { bClosed = True; } function HTTPReceivedData(string Data) { } function HTTPError(int Code) { } event Tick(float DeltaTime) { local string Line; local bool bGotData; local int NextState; local int i; local int Result; Super.Tick(DeltaTime); DoBufferQueueIO(); do { NextState = CurrentState; switch(CurrentState) { case WaitingForHeader: bGotData = ReadBufferedLine(Line); if(bGotData) { i = InStr(Line, " "); Result = Int(Mid(Line, i+1)); if(Result != 200) { SetError(Result); return; } NextState = ReceivingHeader; } break; case ReceivingHeader: bGotData = ReadBufferedLine(Line); if(bGotData) { if(Line == "") NextState = ReceivingData; } break; case ReceivingData: bGotData = False; break; default: bGotData = False; break; } CurrentState = NextState; } until(!bGotData); if(bClosed) { Disable('Tick'); if(CurrentState == ReceivingData) HTTPReceivedData(InputBuffer); if(CurrentState == HadError) HTTPError(ErrorCode); } } zqr%\ zvkD mpmk zhclass UBrowserIRCSystemPage expands UBrowserIRCPageBase; var UBrowserIRCLink Link; var UWindowPageControl PageParent; var string Server; var string DefaultChannel; var config string NickName; var config string FullName; var config string OldPlayerName; var config string UserIdent; var UWindowVSplitter Splitter; var UBrowserIRCSetupClient SetupClient; var bool bConnected; var bool bAway; var localized string NotInAChannelText; var localized string KickedFromText; var localized string ByText; var localized string IsAwayText; function Created() { Super.Created(); Splitter = UWindowVSplitter(CreateWindow(class'UWindowVSplitter', 0, 0, WinWidth, WinHeight)); SetupClient = UBrowserIRCSetupClient(Splitter.CreateWindow(class'UBrowserIRCSetupClient', 0, 0, WinWidth, WinHeight, Self)); TextArea.SetParent(Splitter); Splitter.TopClientWindow = SetupClient; Splitter.BottomClientWindow = TextArea; Splitter.SplitPos = 45; Splitter.MaxSplitPos = 45; Splitter.MinWinHeight = 0; Splitter.bSizable = True; Splitter.bBottomGrow = True; Setup(); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); Splitter.SetSize(WinWidth, WinHeight - EditControl.WinHeight); } function ProcessInput(string Text) { if(Left(Text, 1) != "/") SystemText("*** "$NotInAChannelText); else Link.SendCommandText(Mid(Text, 1)); } function UBrowserIRCChannelPage FindChannelWindow(string Channel) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && (Chan.ChannelName ~= Channel)) return Chan; } return None; } function UBrowserIRCPrivPage FindPrivateWindow(string Nick) { local UWindowPageControlPage P; local UBrowserIRCPrivPage Priv; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && (Priv.PrivNick ~= Nick)) return Priv; } return CreatePrivChannel(Nick); } function Connect() { local int i; if(Link != None) Disconnect(); if(GetPlayerOwner().PlayerReplicationInfo.PlayerName != OldPlayerName) { NickName = GetPlayerOwner().PlayerReplicationInfo.PlayerName; OldPlayerName = NickName; if(FullName == "") FullName = NickName; SaveConfig(); } if(UserIdent == "") { UserIdent = "u"; for(i=0;i<7;i++) UserIdent = UserIdent $ Chr((Rand(10)+48)); Log("Created new UserIdent: "$UserIdent); SaveConfig(); } Link = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserIRCLink'); Link.Connect(Self, Server, NickName, UserIdent, FullName, DefaultChannel); bConnected = True; } function JoinChannel(string ChannelName) { local UBrowserIRCChannelPage P; P = FindChannelWindow(ChannelName); if(P == None) Link.JoinChannel(ChannelName); else PageParent.GotoTab(P.OwnerTab, True); } function PartChannel(string ChannelName) { local UBrowserIRCChannelPage P; P = FindChannelWindow(ChannelName); if(P != None) Link.PartChannel(ChannelName); } function Disconnect() { local UWindowPageControlPage P, Next; if(Link != None) { // don't localize - sent to other clients Link.DisconnectReason = "Disconnected"; Link.DestroyLink(); } Link = None; P = PageParent.FirstPage(); while( P != None ) { Next = P.NextPage(); if(P.Page != Self) PageParent.DeletePage(P); P = Next; } SystemText( "Server disconnected" ); bConnected = False; } function NotifyQuitUnreal() { Super.NotifyQuitUnreal(); if(Link != None) { // don't localize - sent to other clients Link.DisconnectReason = "Exit Game"; Link.DestroyLink(); } } function SystemText(string Text) { // FIXME!! should do something better with this if(Text != "You have been marked as being away" && Text != "You are no longer marked as being away") TextArea.AddText(Text); } function ChannelText(string Channel, string Nick, string Text) { local UBrowserIRCChannelPage P; P = FindChannelWindow(Channel); if(P != None) P.ChannelText(Nick, Text); } function PrivateText(string Nick, string Text) { FindPrivateWindow(Nick).PrivateText(Nick, Text); } function UBrowserIRCPrivPage CreatePrivChannel(string Nick) { local UBrowserIRCPrivPage P; P = UBrowserIRCPrivPage(PageParent.AddPage(Nick, class'UBrowserIRCPrivPage').Page); P.SystemPage = Self; P.PrivNick = Nick; P.Setup(); return P; } function ChannelAction(string Channel, string Nick, string Text) { local UBrowserIRCChannelPage P; P = FindChannelWindow(Channel); if(P != None) P.ChannelAction(Nick, Text); } function PrivateAction(string Nick, string Text) { FindPrivateWindow(Nick).PrivateAction(Nick, Text); } function JoinedChannel(string Channel, optional string Nick) { local UBrowserIRCChannelPage P; local UBrowserIRCChannelPage W; local UWindowPageControlPage NewPage; if(Nick == "") { NewPage = PageParent.AddPage(Channel, class'UBrowserIRCChannelPage'); P = UBrowserIRCChannelPage(NewPage.Page); //utpg: user/channel prefix P.UserList.UPop = Link.UPop; P.UserList.UPvoice = Link.UPvoice; P.UserList.UPhalfop = Link.UPhalfop; //utpg: user/channel prefix -- end P.SystemPage = Self; P.ChannelName = Channel; P.Setup(); PageParent.GotoTab(NewPage, True); } if(Nick == "") Nick = NickName; W = FindChannelWindow(Channel); if(W != None) W.JoinedChannel(Nick); } function KickUser(string Channel, string KickedNick, string Kicker, string Reason) { local UWindowPageControlPage P; local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(KickedNick == NickName) { P = PageParent.GetPage(Channel); if(P != None) PageParent.DeletePage(P); SystemText("*** "$KickedFromText@Channel@ByText@Kicker$" ("$Reason$")"); } else { if(W != None) W.KickUser(KickedNick, Kicker, Reason); } } function UserInChannel(string Channel, string Nick) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.UserInChannel(Nick); } function PartedChannel(string Channel, optional string Nick) { local UWindowPageControlPage P; local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(Nick == "") { P = PageParent.GetPage(Channel); if(P != None) PageParent.DeletePage(P); } else { if(W != None) W.PartedChannel(Nick); } } function ChangedNick(string OldNick, string NewNick) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; local UBrowserIRCPrivPage Priv; if(OldNick == NickName) { NickName = NewNick; Link.NickName = NewNick; SaveConfig(); } for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && Chan.UserList.FindNick(OldNick) != None) Chan.ChangedNick(OldNick, NewNick); Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && Priv.PrivNick == OldNick) { P.Caption = NewNick; Priv.ChangedNick(OldNick, NewNick); } } } function UserQuit(string Nick, string Reason) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; local UBrowserIRCPrivPage Priv; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && Chan.UserList.FindNick(Nick) != None) Chan.UserQuit(Nick, Reason); Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && Priv.PrivNick == Nick) Priv.UserQuit(Nick, Reason); } } function UserNotice(string Nick, string Text) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; local UBrowserIRCPrivPage Priv; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && Chan.UserList.FindNick(Nick) != None) Chan.UserNotice(Nick, Text); Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && Priv.PrivNick == Nick) Priv.UserNotice(Nick, Text); } } function ChangeMode(string Channel, string Nick, string Mode) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeMode(Nick, Mode); } function ChangeOp(string Channel, string Nick, bool bOp) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeOp(Nick, bOp); } //utpg: halfop support function ChangeHalfOp(string Channel, string Nick, bool bHalfOp) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeOp(Nick, bHalfOp); } //utpg: halfop support -- end function ChangeVoice(string Channel, string Nick, bool bVoice) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeVoice(Nick, bVoice); } function Tick(float Delta) { if(bConnected && GetPlayerOwner().PlayerReplicationInfo.PlayerName != OldPlayerName) { OldPlayerName = GetPlayerOwner().PlayerReplicationInfo.PlayerName; Link.SetNick(OldPlayerName); SystemText("SetNick: "$OldPlayerName); } Super.Tick(Delta); } function IsAway(string Nick, string Message) { local UBrowserIRCPrivPage W; W = FindPrivateWindow(Nick); if(W != None) W.IsAway(Nick, Message); else SystemText(Nick@IsAwayText$": "$Message); } function IRCVisible() { if(bAway) { if(bConnected) Link.SetAway(""); bAway = False; } } function IRCClosed() { CheckAway(); } function NotifyAfterLevelChange() { Super.NotifyAfterLevelChange(); CheckAway(); } function CheckAway() { local string URL; if( bConnected ) { bAway = True; URL = GetLevel().GetAddressURL(); if(InStr(URL, ":") > 0) Link.SetAway("unreal://"$URL); else if(!Root.bWindowVisible) Link.SetAway("local game"); else Link.SetAway("in menus"); } } function CTCP(string Channel, string Nick, string Message) { if(Channel == "" || Channel == NickName) SystemText("["$Nick$": "$Message$"]"); else SystemText("["$Nick$":"$Channel$" "$Message$"]"); } zvzzvp@AWv.*4. E BBv+ zps" <-s:wv*v-v[ zlu.&\ zqW)epmCbkAtjB|iHBXb zsmT3Q >pQ#mdaP= wbQ%mdaSDP& tQ#mdaPl |Q:mdappSPc/SPk  z_ [_  zybFxF mv~$, "v(b$vTz$v&&, v$$v&' zzzwzz|xGoz$%$& ztUAM9U%(r. Srr*Y%hYr-`D`%WI D?W`I?Y&?I Dl%r.r7wr*H?7H?W` wr*?lrr8F=UH?&?WF?& `TU@H?WFrHHlr.r4 zM zzC{}c4z$%M $&$$&M  z~zzrzzJ@zzgM@8{~: !&& zm  6m  u * -*b  @ * zQW9#8yW6wy*y9X-Y zT BBJE&R%R}BHBR&~cHEG -apJBRJEEG JpJHRJ zzzzH n{ Y!rXH -L-L)-L(XH . A zA} ;b} 8m .|DsU Rb |U }  zE_ Qd. :dh:$ r8*8.dr8*8-T8*.  f8O:dh:$=?J  w8pwp*p_p8=w8*8-T8 B(''_ zB\#w-u {kk( ZkpSetNick: k\ zzzG^omfP^Uw8fJwf*.  ffkwf*8f z@zz`{B w*, zJ]|Q}_KD B vD vB v:P]vPv" znR5|k!8[R6w[*[5S-T z@zzW uQ] Ur"BQ9Q_*H .BcQA.^%B@H  zw SQ  H *Q J e.Kw ~ * zQV ;6V &w.`) V  zMQPgf. wf*o%f.fwf*joQff.foJ* z@zzozzmz[8{z~: !z&zz&y{z~: !z&zz}z&8z zBI 7I6hll &-nFU-n@ ~U LJU@ &L,[L h, ,-nFU-nzUh, ,-n( -n(lh-n5-vv!l,m$5l,|{ zSY<_. w_*@%_._w_*jr_8@_._@J z@zzhHX*K-r'HtHrPS[2 zQQEe {?Lw{*R.{wR*!wRW &Q*REQc W.{wW*zWUQWEQc {{O zXteawt*tF%UVppppunreal://t9:StF. U $( 7 zwjfD.! ! A BC*CD+X. X^'w XL dX8aw v X8h f| ^J q X8f| J c j%oj,2[jN!zoDX8J jN|WjNwkDO.DO-O X lD{Oo DoOo TD4odServerListTitlesWjNUBrowserjJOj7j,2]%c]\^{\ j,2J \ wJ *jN!zDX 8J O.DRO-O X lD{Oo DoOo D o^jJOj]c]\^ z\FE/QPF"w8Q eQ zzzVD_f 6b6DU6b%Sw* _, pppUBrowserIRCLink: Server is B:S6bR%w* ], [b z^bd  @ zzza@ k@ ,t M,&o<&%Y& ~?< ,(o<&%Y& ~?< , E< @ \C zR"s1w~ .Q z]zz]pff 64wk*eXX Zk' zc]J(rX p`]X 9bV]X RtX]X k|]]X % ziE- J-r'HEt%rVSU2 z$ME>$m-r(Vp, , 5, D,  zzzg V;rs*@ &s&nrk &s&n&rn%-Lnnn zY ;r/.NY Y  zr"class UBrowserOpenCW expands UWindowDialogClientWindow; var UWindowComboControl OpenCombo; var localized string OpenText; var localized string OpenHelp; var config string OpenHistory[10]; function Created() { local float EditWidth; local int i; local Color TC; Super.Created(); EditWidth = WinWidth - 140; OpenCombo = UWindowComboControl(CreateControl(class'UWindowComboControl', 20, 20, EditWidth, 1)); OpenCombo.SetText(OpenText); OpenCombo.SetHelpText(OpenHelp); OpenCombo.SetFont(F_Normal); OpenCombo.SetEditable(True); for (i=0; i<10; i++) if (OpenHistory[i] != "") OpenCombo.AddItem(OpenHistory[i]); } function BeforePaint(Canvas C, float X, float Y) { local float EditWidth; local float XL, YL; C.Font = Root.Fonts[OpenCombo.Font]; TextSize(C, OpenCombo.Text, XL, YL); EditWidth = WinWidth - 50; OpenCombo.WinLeft = (WinWidth - EditWidth) / 2; OpenCombo.WinTop = (WinHeight-OpenCombo.WinHeight) / 2; OpenCombo.SetSize(EditWidth, OpenCombo.WinHeight); OpenCombo.EditBoxWidth = OpenCombo.WinWidth - XL - 20; Super.BeforePaint(C, X, Y); } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); if((C == OpenCombo && E == DE_EnterPressed) || (C == UBrowserOpenWindow(ParentWindow).OKButton && E == DE_Click)) OpenURL(); } function OpenURL() { local int i; local bool HistoryItem; local UWindowComboListItem Item; local string URL; URL = OpenCombo.GetValue(); if(URL == "") { OpenCombo.BringToFront(); return; } for (i=0; i<10; i++) { if (OpenHistory[i] ~= URL) OpenCombo.RemoveItem(i); // HistoryItem = True; } if (!HistoryItem) { OpenCombo.InsertItem(URL); while(OpenCombo.List.Items.Count() > 10) OpenCombo.List.Items.Last.Remove(); Item = UWindowComboListItem(OpenCombo.List.Items.Next); for (i=0; i<10; i++) { if(Item != None) { OpenHistory[i] = Item.Value; Item = UWindowComboListItem(Item.Next); } else OpenHistory[i] = ""; } } SaveConfig(); OpenCombo.ClearValue(); GetParent(class'UWindowFramedWindow').Close(); UBrowserMainWindow(ParentWindow.OwnerWindow).OpenURL(URL); } znzzZclass UBrowserOpenWindow expands UWindowFramedWindow; var UWindowSmallCloseButton CloseButton; var UWindowSmallButton OKButton; var localized string OKText; function Created() { Super.Created(); OKButton = UWindowSmallButton(CreateWindow(class'UWindowSmallButton', WinWidth-108, WinHeight-24, 48, 16)); CloseButton = UWindowSmallCloseButton(CreateWindow(class'UWindowSmallCloseButton', WinWidth-56, WinHeight-24, 48, 16)); OKButton.Register(UBrowserOpenCW(ClientArea)); OKButton.SetText(OKText); SetSizePos(); } function ResolutionChanged(float W, float H) { Super.ResolutionChanged(W, H); SetSizePos(); } function SetSizePos() { SetSize(300, 90); WinLeft = Int((Root.WinWidth - WinWidth) / 2); WinTop = Int((Root.WinHeight - WinHeight) / 2); } function Resized() { Super.Resized(); ClientArea.SetSize(ClientArea.WinWidth, ClientArea.WinHeight-24); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); OKButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-104; OKButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; CloseButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-52; CloseButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; } function Paint(Canvas C, float X, float Y) { local Texture T; T = GetLookAndFeelTexture(); DrawUpBevel( C, ClientArea.WinLeft, ClientArea.WinTop + ClientArea.WinHeight, ClientArea.WinWidth, 24, T); Super.Paint(C, X, Y); } zkv`\rb*,v&?'&Kb&?'zsv=b=itv=b=i&i%-Liii z|R\9(S9 %zzv/86[1cszpppPing Timeout from 9. Attempt SssqLYppPing Timeout from 9 Giving Up&<FF%PlR_Nc%k%v!c-O-c(-N zizzB@[nGNv!a(Ml,{@Li |{ zpJXxXrX*,J&?'&KX&?'zsJlXldtJlXld&dDJ&X&-Lddd z{y35 A y zu?//============================================================================= // UBrowserPlayerGrid //============================================================================= class UBrowserPlayerGrid extends UWindowGrid; var localized string NameText; var localized string FragsText; var localized string PingText; var localized string TeamText; var localized string MeshText; var localized string SkinText; var localized string FaceText; var localized string IDText; var localized string ngSecretText; var localized string EnabledText; var localized string DisabledText; var localized string BotText; var int ngSecretWidth; var UWindowGridColumn ngSecretColumn; function Created() { Super.Created(); RowHeight = 12; AddColumn(NameText, 60); AddColumn(FragsText, 30); AddColumn(PingText, 30); AddColumn(TeamText, 30); AddColumn(MeshText, 80); AddColumn(SkinText, 80); AddColumn(FaceText, 60); AddColumn(IDText, 30); ngSecretColumn = AddColumn(ngSecretText, 100); ngSecretWidth = 100; } function PaintColumn(Canvas C, UWindowGridColumn Column, float MouseX, float MouseY) { local UBrowserServerList Server; local UBrowserPlayerList PlayerList, l; local int Visible; local int Count; local int Skipped; local int Y; local int TopMargin; local int BottomMargin; if(bShowHorizSB) BottomMargin = LookAndFeel.Size_ScrollbarWidth; else BottomMargin = 0; TopMargin = LookAndFeel.ColumnHeadingHeight; Server = UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server; if(Server == None) return; PlayerList = Server.PlayerList; if(PlayerList == None) return; Count = PlayerList.Count(); if( Server.GameVer >= 406 ) { if( ngSecretColumn.WinWidth <= 1 ) { ngSecretColumn.ShowWindow(); ngSecretColumn.WinWidth = ngSecretWidth; } } else { if( ngSecretColumn.WinWidth > 1 ) { ngSecretWidth = ngSecretColumn.WinWidth; ngSecretColumn.WinWidth = 0; ngSecretColumn.HideWindow(); } } C.Font = Root.Fonts[F_Normal]; Visible = int((WinHeight - (TopMargin + BottomMargin))/RowHeight); VertSB.SetRange(0, Count+1, Visible); TopRow = VertSB.Pos; Skipped = 0; Y = 1; l = UBrowserPlayerList(PlayerList.Next); while((Y < RowHeight + WinHeight - RowHeight - (TopMargin + BottomMargin)) && (l != None)) { if(Skipped >= VertSB.Pos) { switch(Column.ColumnNum) { case 0: Column.ClipText( C, 2, Y + TopMargin, l.PlayerName ); break; case 1: Column.ClipText( C, 2, Y + TopMargin, l.PlayerFrags ); break; case 2: Column.ClipText( C, 2, Y + TopMargin, l.PlayerPing); break; case 3: Column.ClipText( C, 2, Y + TopMargin, l.PlayerTeam ); break; case 4: Column.ClipText( C, 2, Y + TopMargin, l.PlayerMesh ); break; case 5: Column.ClipText( C, 2, Y + TopMargin, l.PlayerSkin ); break; case 6: Column.ClipText( C, 2, Y + TopMargin, l.PlayerFace ); break; case 7: Column.ClipText( C, 2, Y + TopMargin, l.PlayerID ); break; case 8: if( l.PlayerStats ~= "bot" ) Column.ClipText( C, 2, Y + TopMargin, BotText ); else if( l.PlayerStats ~= "true" ) Column.ClipText( C, 2, Y + TopMargin, EnabledText ); else Column.ClipText( C, 2, Y + TopMargin, DisabledText ); break; } Y = Y + RowHeight; } Skipped ++; l = UBrowserPlayerList(l.Next); } } function RightClickRow(int Row, float X, float Y) { local UBrowserInfoMenu Menu; local float MenuX, MenuY; local UWindowWindow W; W = GetParent(class'UBrowserInfoWindow'); if(W == None) return; Menu = UBrowserInfoWindow(W).Menu; WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.ShowWindow(); } function SortColumn(UWindowGridColumn Column) { UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server.PlayerList.SortByColumn(Column.ColumnNum); } function SelectRow(int Row) { } zdzzozzuc]!BrD*,c&?'&KD&?'zccDcW$ccDcW&$ckDkW$ckDkW&$WDc&D&:-LWWW zyxE.Ty7{9~: 1a B &?D?a ?A ?, ,-B=9F%PRl_Nc%k%C%]% ohostname{-B= ohostport{FJ omapname:{P omaptitle{RlRzR|RUntitled-YlP ogametype){_ onumplayersg{cJ omaxplayers{kJ ogamemode{N ogamever{CJ ominnetverX{]J Foc-O-c'-Nv! zDr[SU8Pu!hz\info\B a?t ( %z@zWzzi @zzzAe##!.  eA zDX&X  z#.  zAi $?J  zBzF$. z zko *-Oi ~o pp\j \[o i }j ,[~[\ z^ Yh^. HBACC^-h '^Unreal Browser. zE.L^#?D?, ?,^?D^?,^?D^?, zh/)WszpTimed out getting player replies. Attempt SssqLb(Timed out getting player replies. Giving Up zn p3nhttp://www.unreal.com nZVwtD"B"@s"r"@q*dF<9~"X~zDt@101U51111111111111111111111111111111111111111111111111111111111111111111111111134688888888888888888888888888888888888888888888885R30fCY]RX]IvjmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrvG]XR]YAAf}urX "^vu}fCC^}**x$ {^CF^}"}^DF^""mYG@6126@FYu'^FGc"ⰐV4320GVCT"cG\j|̥G17FbpvfVGA954313AL0D"zj\ۭuVx̬v^IF'f<{kDD[鯹" {jk15$66S⽡6f 㭯çvq%@/5lA50BXf ^=0;$*j^2pJ2.1`Xf }AF5GF=K8c " 'xk)ok^F;COj&zG=9?Xf KDWAwʸ66xo KFG %OGlxx"sK=42p$_Yhc_WD54FqjGG9/: (Xf {CDOG5A27"2A_KGRM$WAIm'W30QW41m@@u W93I')fDG;.7I=tXf qQ=AG]=0DոGDZGb \30UjA9I1=%"G2~Y1OY@JA.3V1@"Xf |J2IA=D=f=0DUVFp %VGQ06 jFK@Z kV16@DG^]mf;A80k"@@GO;1jXf "FIcjFKʖj;DZCc5WyGf3WGju;^uW]Aþuch@C5G}U=CVc3G÷Xf 5IKh׵mF6^@45G89Q%.7I1017O$52pcG9fh"ٸrb}|Z5IA6C"X^ "K=V{Djv=1XmA O6FJpʸ56bD4cY65IlhYQk^mʸ014]^ʤQhjC@rOǔؼr]h,ծc4Ajb1X1^ %__$%6XfhDp=5WrfC{C=Yh8AlvFG"rR=bjøjRW{ʹ^AA#{PbW@R{K\hGGw8I;β1X1^ (V603RjhDpR6YkbD)hFA{{GYfVbbYY=F5Al=Ajû GFЊK3}j]Ac ء]=j*M6466.G7rj{1X1^ j@5D8=VcjDlؓZ6]c]DpF4jIsδ]lpA@IAA(մc68ll$Y8ηыA5]Z^I̤ͱ#ٳFI6G]Wc@=7@fWYr{1X1^ }W;YR^cDj~c6Y^]Dx62^lpЫV^YC;v%ҬY5;j{*bD)V;^XԌDj3V^GZOVʻphC=YYRbΛ1X1^ ظ{hFDRY]Fj~c6Z]ZD%D7ZbùlDYU@PwD7f{ fm* l;bWή%Ef5hW@c]ݨsV@XYR1Z1b \G7JWZFj~b6ZYXDQ7W]㼋FAYG@ôC=]pfr;^U"<AFʴj1IruЖV6F^R}ʤ1Z1b "o\IQK4kDDRQFjf6ZYXD W7YXҬh5QV@F@Zj׶fp9^QT#؛k5Fm85b}耿;Y=]Ohw1Z1b xYF50G;GOPFj؁8ZWUD Y7ZVךl@CZAͶG@WjҼ p9^K{;33/ضjG4AjlpؽfçD0l8XJV 1Z1b xf=DWOPGcήl=WWWD Y7WUrR7YF{G=Vj׽p;^Ipν,MDMrY6AKsD;fD4FA7YGm 1Y1b rDGWKPGUX8ZWUD Y7WR}Y4PD{G@Vjp;YI{^AIߐc7OZ0@jC6WOGbu1Y1b &]8QOOKDi=YORD \7WRًDJGG@Rhp9YGͳҫvC6jCFQIDA,խVAYKGbu1Y1b $G1KOORChvb1VPMKD Y7VRݿC2pG@Rhp;YGw84WY٭fA7jF=OG6Gs@FKD"O=h1Y1b j6OOORG@}C2C=VYPCY7VRf6fͯG@Qfp;WGF8]]G4^m÷,^;9hZh@z1Y1b h7PMOOP@CJFF3=b{]DWAb8VO׭;F̴૽G@Rf{;WJpjl{ܸ\7WZ^5}񮽽A8 xA;j1Y1b ^3WJMMPV=Cc8=uj3PpAu=VKث7QФV=Kf;VGίc23Q{)u9RJ׆@;m#I;f%K42O&1Z1b dDWfWOG]u==;I׬{5I{jCl̯l=~4pKA]juAhXh;3K$٫f@ZJn^15vr.AlI'jFF1X1^ 'x& $mY^uJc͸{KJjcGQ@5؆;؉AFóf={M8DQ=l\C60=~6DQk)%bG4DX^  c{̻"lbQA }IRhW8IG5;fb]vF=j йA1ACWR46bk=Kͫγu5;GIKKFA;61J1X1^ "'㱐pY {Y{ ufKIjuWDAb""ͭѫuC=fï1X1^ ʳ"׬÷fl 񲹽ηlι]503=338C]ͤX^ ̳ⱳwb;ʤ夰ޮVGc]3X3^ Y Ьb93X3^ jW4X4^ նì4X4^ 4X4^  4Z4b(>cmh5^pkGO}CVphGAl'C5@h,ԨQ@@h{D5AhhW@@j)F.AG7Kձ3r FF=G!w;3cmhf^=F1=ջD4HK^OF}mK4Z4bz@AhäfV3ܯO=Kc3A}ʫ85 ױO@F_}߲ճADYG7Fk;Fؖ6Ip߷OAW\k }k3Iи 4Z4b)IͫpI;Q^m趜ׂWhIJ*ʾÐ_䫋Қrp}{}r^k ákIw ԯwV4Z4bFcvW"WIYYWpDߧ}͖cVj{͇^]$ ^]-Y}pbͧYKVI4Z4bGWb6^hCYrOٶ׃DpYkI\r{㶓ٟjV{ ,cKw~q^mk\Ы}OW^ Gw4Z4b\I{W}*Kr׌Ir᰼Fjͫ73΃pI^{㧛hGf" قGb}chbQ§^ wKWkGh4Z3bjG}סv*VFjᴾػI^vQ{ñ㤊 hKb]K^^W\-KVh#\]VIj fKYÙF^3Z3_kG}kk؈FrKwټGWVj̐ӱbKkͮͲ\Okjh[WVKӵ \KcrG\3Z5l*pFwW%DëקmïٻݳGV{Wj׫VjK^ؾw iIbG V^}KV4ZU]c*F{ݸfv^hѽ*}]jۇqhwbp|!)*kմ_kçç@Z]j pav̷k6hʯ}{"W}sj)phf"h״ױgbõec8+ea$p@{ ]FDGh0]m$qx x"''" $|$r%s'u"q u$"u)%% 'x$$$xxzqk"u (s((hAOc]r k8RcXu s;UfR{fAF]]FC=Vm]lF;6As10000000000@6;FZ2^hfchjIOPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOPPPPPPPPOOOPPPPPPPPPPPPPPPPOOPRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPORPPPNPPPPPPPPPPPPPPPPRPOPOOOOPPPPPPPPPPPPPPPPPPPPPPPPPOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPjhcff@zHYY I zq zzNzzzzKPg=<upstart n zQzzzzOt@ zRg"@n zls"s.JT%T, w{TspF TspF*T# z~ A PHA$A A$ zj7//============================================================================= // UBrowserPlayerList - The player list returned by the server. //============================================================================= class UBrowserPlayerList extends UWindowList; var string PlayerName; var string PlayerMesh; var string PlayerSkin; var string PlayerFace; var string PlayerTeam; var int PlayerFrags; var int PlayerPing; var int PlayerID; var string PlayerStats; // Sentinel Only var int SortColumn; var bool bDescending; function SortByColumn(int Column) { if(SortColumn == Column) { bDescending = !bDescending; } else { SortColumn = Column; bDescending = False; } Sort(); } function int Compare(UWindowList T, UWindowList B) { local int Result; local UBrowserPlayerList PT, PB; if(B == None) return -1; PT = UBrowserPlayerList(T); PB = UBrowserPlayerList(B); switch(UBrowserPlayerList(Sentinel).SortColumn) { case 0: if(Caps(PT.PlayerName) < Caps(PB.PlayerName)) Result = -1; else if(PT.PlayerName > PB.PlayerName) Result = 1; else Result = (PT.PlayerPing - PB.PlayerPing); break; case 1: if(PT.PlayerFrags > PB.PlayerFrags) Result = -1; else if(PT.PlayerFrags < PB.PlayerFrags) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 2: if(PT.PlayerPing < PB.PlayerPing) Result = -1; else if(PT.PlayerPing > PB.PlayerPing) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 3: if(PT.PlayerTeam > PB.PlayerTeam) Result = -1; else if(PT.PlayerTeam < PB.PlayerTeam) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 4: if(PT.PlayerMesh < PB.PlayerMesh) Result = -1; else if(PT.PlayerMesh > PB.PlayerMesh) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 5: if(PT.PlayerSkin < PB.PlayerSkin) Result = -1; else if(PT.PlayerSkin > PB.PlayerSkin) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 6: if(PT.PlayerFace < PB.PlayerFace) Result = -1; else if(PT.PlayerFace > PB.PlayerFace) Result = 1; else { if(PT.PlayerSkin < PB.PlayerSkin) Result = -1; else if(PT.PlayerSkin > PB.PlayerSkin) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } } break; case 7: if(PT.PlayerID < PB.PlayerID) Result = -1; else if(PT.PlayerID > PB.PlayerID) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 8: if(PT.PlayerStats < PB.PlayerStats) Result = -1; else if(PT.PlayerStats > PB.PlayerStats) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; } if(UBrowserPlayerList(Sentinel).bDescending) Result = -Result; return Result; } function UBrowserPlayerList FindID(int ID) { local UBrowserPlayerList l; l = UBrowserPlayerList(Next); while(l != None) { if(l.PlayerID == ID) return l; l = UBrowserPlayerList(l.Next); } return None; } zXzzzzU2~ .a a@CB zY[#~ ??, z\zz]zzzz_ class UBrowserRightClickMenu extends UWindowRightClickMenu; var UWindowPulldownMenuItem Play, Copy, Refresh, RefreshServer, PingAll, Info, Favorites, OpenLocation; var localized string PlayName; var localized string RefreshName; var localized string InfoName; var localized string FavoritesName; var localized string RefreshServerName; var localized string PingAllName; var localized string OpenLocationName; var localized string CopyName; var UBrowserServerGrid Grid; var UBrowserServerList List; function Created() { Super.Created(); Info = AddMenuItem(InfoName, None); Copy = AddMenuItem(CopyName, None); Play = AddMenuItem(PlayName, None); OpenLocation = AddMenuItem(OpenLocationName, None); AddMenuItem("-", None); AddFavoriteItems(); AddMenuItem("-", None); RefreshServer = AddMenuItem(RefreshServerName, None); PingAll = AddMenuItem(PingAllName, None); Refresh = AddMenuItem(RefreshName, None); } function AddFavoriteItems() { Favorites = AddMenuItem(FavoritesName, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case Play: Grid.JoinServer(List); break; case Info: if(!Info.bDisabled) Grid.ShowInfo(List); break; case Favorites: UBrowserServerListWindow(Grid.GetParent(class'UBrowserServerListWindow')).AddFavorite(List); break; case Refresh: Grid.Refresh(); break; case PingAll: Grid.RePing(); break; case RefreshServer: Grid.RefreshServer(); break; case OpenLocation: UBrowserMainWindow(Grid.GetParent(class'UBrowserMainWindow')).ShowOpenWindow(); break; case Copy: GetPlayerOwner().CopyToClipboard("unreal://"$List.IP$":"$string(List.GamePort)); break; } Super.ExecuteItem(I); } function ShowWindow() { Info.bDisabled = List == None || List.GamePort == 0; Play.bDisabled = List == None || List.GamePort == 0; Copy.bDisabled = List == None || List.GamePort == 0; Favorites.bDisabled = List == None; RefreshServer.bDisabled = List == None; Selected = None; Super.ShowWindow(); } `FS _JҾo ܌̅܌̅܌̅܌̅܌̅܌̅܌̅o]! UWindow.UWindowWin95LookAndFeelzzk //============================================================================= // UBrowserRootWindow - root window subclass for UnrealBrowser //============================================================================= class UBrowserRootWindow extends UWindowRootWindow; var UBrowserMainWindow MainWindow; function Created() { Super.Created(); MainWindow = UBrowserMainWindow(CreateWindow(class'UBrowserMainWindow', 50, 30, 500, 300)); MainWindow.bStandaloneBrowser = True; MainWindow.WindowTitle = "Unreal Browser"; Resized(); } function Resized() { Super.Resized(); MainWindow.SetSize(Min(500, WinWidth - 10), WinHeight-30); MainWindow.WinLeft = Int((WinWidth - MainWindow.WinWidth) / 2); MainWindow.WinTop = Int((WinHeight - MainWindow.WinHeight) / 2); } zMJ WU. Y. ~NU-XY-XxU-XY-X&U-xY-xU-xY-x&U-WY-W(U-WY-W&SsUMYM& zLzzHr ^p. YZwp*>rp~r  p. pp. Y W p~r  zUzzQ$//============================================================================= // UBrowserRulesGrid //============================================================================= class UBrowserRulesGrid extends UWindowGrid; var localized string RuleText; var localized string ValueText; function Created() { Super.Created(); RowHeight = 12; AddColumn(RuleText, 150); AddColumn(ValueText, 150); } function PaintColumn(Canvas C, UWindowGridColumn Column, float MouseX, float MouseY) { local UBrowserServerList Server; local UBrowserRulesList RulesList, l; local int Visible; local int Count; local int Skipped; local int Y; local int TopMargin; local int BottomMargin; if(bShowHorizSB) BottomMargin = LookAndFeel.Size_ScrollbarWidth; else BottomMargin = 0; TopMargin = LookAndFeel.ColumnHeadingHeight; Server = UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server; if(Server == None) return; RulesList = Server.RulesList; if(RulesList == None) return; Count = RulesList.Count(); C.Font = Root.Fonts[F_Normal]; Visible = int((WinHeight - (TopMargin + BottomMargin))/RowHeight); VertSB.SetRange(0, Count+1, Visible); TopRow = VertSB.Pos; Skipped = 0; Y = 1; l = UBrowserRulesList(RulesList.Next); while((Y < RowHeight + WinHeight - RowHeight - (TopMargin + BottomMargin)) && (l != None)) { if(Skipped >= VertSB.Pos) { switch(Column.ColumnNum) { case 0: Column.ClipText( C, 2, Y + TopMargin, l.Rule ); break; case 1: Column.ClipText( C, 2, Y + TopMargin, l.Value ); break; } Y = Y + RowHeight; } Skipped ++; l = UBrowserRulesList(l.Next); } } function RightClickRow(int Row, float X, float Y) { local UBrowserInfoMenu Menu; local float MenuX, MenuY; local UWindowWindow W; W = GetParent(class'UBrowserInfoWindow'); if(W == None) return; Menu = UBrowserInfoWindow(W).Menu; WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.ShowWindow(); } function SortColumn(UWindowGridColumn Column) { UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server.RulesList.SortByColumn(Column.ColumnNum); } function SelectRow(int Row) { } zqUSl%jUnu3%\,P>\S}%a?}(M{|6\s6\%S|X6\\6\%SjX zwzzgxZ 1 w-  z,player_E=J},@C 0:Er@*@.C W @o:E-  @.M z,frags_E=J},-  @C 0:E@]JM Dz,ping_E=J},-  @C 0:E@hJ}&M z,team_E=J},-  @C 0:E@PKM rz,skin_E=J},-  @C 0:E@MM  z,face_E=J},-  @C 0:E@OcM z,mesh_E=J},-  @C 0:E@`M /z, ngsecret_E=J}, -  @C 0:E@[M Uzfinalb' M |gamever-  ZM |minnetver-  wM |gametype-  YM b|timelimit-  VM |fraglimit-  RM |MultiplayerBots-  { 4M :|AdminName-  UM |AdminEMail-  OM |WantWorldLog-  a4M c|WorldLog- JC7|True `bG `f` a4M |mutators-  cM |goalteamscore-  dM Z |minplayers- @ z0 { z W  vlM  |changelevels-  Q4M  |botskill-  xM - |maxteams-  vM z |balanceteams-  q4M  |playersbalanceteams-  r4M  |friendlyfire-  xM Y |gamestyle-  WM  |tournament-  |4M  |listenserver-  K y }  y zM M |password-  s4- ze!class UBrowserIRCTextArea expands UWindowURLTextArea; var globalconfig int IndentSize; function UWindowDynamicTextRow AddText(string Text) { local UWindowDynamicTextRow R; local int i, j; ReplaceText(Text, Chr(2), ""); ReplaceText(Text, Chr(15), ""); ReplaceText(Text, Chr(22), ""); ReplaceText(Text, Chr(31), ""); i = InStr(Text, Chr(3)); while(i != -1) { j = 1; While(i+j < Len(Text) && InStr("0123456789,", Mid(Text, i+j, 1)) != -1) j++; Text = Left(Text, i) $ Mid(Text, i+j); i = InStr(Text, Chr(3)); } //utpg: \n bug fix, "\n" in a string should not be replaced by an actual newline //R = Super.AddText(Text); // reuse a row if possible R = CheckMaxRows(); if(R != None) List.AppendItem(R); else R = UWindowDynamicTextRow(List.Append(RowClass)); R.WrapParent = None; R.bRowDirty = True; R.Text = Text; bDirty = True; // or else it won't wrap //utpg: \n bug fix -- end UBrowserIRCPageBase(OwnerWindow).AddedText(); return R; } function LaunchUnrealURL(string URL) { Super.LaunchUnrealURL(URL); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } function RMouseUp(float X, float Y) { local UBrowserIRCPageBase P; local float GX, GY; P = UBrowserIRCPageBase(GetParent(class'UBrowserIRCPageBase')); WindowToGlobal(X, Y, GX, GY); P.GlobalToWindow(GX, GY, X, Y); P.RMouseUp(X, Y); } //utpg: improved wrapping, add IndentSize spaces in front of the wrapped line to improve readability function float DrawTextLine(Canvas C, UWindowDynamicTextRow L, float Y) { local float X, W, H; local int i; local string indent; if(bHCenter) { TextAreaTextSize(C, L.Text, W, H); if(VertSB.bWindowVisible) X = int(((WinWidth - VertSB.WinWidth) - W) / 2); else X = int((WinWidth - W) / 2); } else X = 2; if (L.WrapParent == none) TextAreaClipText(C, X, Y, L.Text); else { for (i = 0; i < IndentSize; i++) indent = indent$" "; TextAreaClipText(C, X, Y, indent$L.Text); } return DefaultTextHeight; } //utpg: improved wrapping zT class UBrowserIRCUserList expands UWindowListBoxItem; var string NickName; var bool bChOp; var bool bVoice; var bool bHalfOp; //utpg: halfop support function int Compare(UWindowList T, UWindowList B) { local UBrowserIRCUserList UT, UB; UT = UBrowserIRCUserList(T); UB = UBrowserIRCUserList(B); if(UT.bChOp && !UB.bChOp) return -1; if(!UT.bChOp && UB.bChOp) return 1; //utpg: halfop support if(UT.bHalfOp && !UB.bHalfOp) return -1; if(!UT.bHalfOp && UB.bHalfOp) return 1; //utpg: halfop support -- end if(UT.bVoice && !UB.bVoice) return -1; if(!UT.bVoice && UB.bVoice) return 1; if(Caps(UT.NickName) < Caps(UB.NickName)) return -1; return 1; } zpGT*012wC*CIC* CIwA*AIA* AI epppunreal://9:SFhz\status\a?t ( %z zmzzzz/ q!G zzztnNa?@( %z zvN6\%v! z\ 3zq(class UBrowserIRCUserListBox expands UWindowListBox; //utpg: user/channel prefix var string UPop; var string UPhalfop; var string UPvoice; //utpg: user/channel prefix -- end function Created() { Super.Created(); } function AddUser(string NickName) { local UBrowserIRCUserList NewUser; if(FindNick(NickName) == None) { NewUser = UBrowserIRCUserList(Items.Append(ListClass)); NewUser.NickName = NickName; Items.MoveItemSorted(NewUser); } } function RemoveUser(string NickName) { local UBrowserIRCUserList User; User = FindNick(NickName); if(User != None) User.Remove(); } function ChangeNick(string OldNick, string NewNick) { local UBrowserIRCUserList User; User = FindNick(OldNick); if(User != None) User.NickName = NewNick; Sort(); } function UBrowserIRCUserList FindNick(string NickName) { local UBrowserIRCUserList User; for(User=UBrowserIRCUserList(Items.Next);User != None; User=UBrowserIRCUserList(User.Next)) if(User.NickName == NickName) return User; return None; } function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H) { local string Prefix; if(SelectedItem == Item) { C.DrawColor.r = 0; C.DrawColor.g = 0; C.DrawColor.b = 128; DrawStretchedTexture(C, X, Y, W, H-1, Texture'WhiteTexture'); } C.DrawColor.r = 255; C.DrawColor.g = 255; C.DrawColor.b = 255; C.Font = Root.Fonts[F_Normal]; if(UBrowserIRCUserList(Item).bChOp) Prefix = UPop; else if(UBrowserIRCUserList(Item).bVoice) Prefix = UPvoice; //utpg: halfop support else if(UBrowserIRCUserList(Item).bHalfOp) Prefix = UPhalfop; //utpg: halfop support -- end else Prefix = ""; ClipText(C, X, Y, Prefix$UBrowserIRCUserList(Item).NickName); } function ChangeOp(string Nick, bool bOp) { local UBrowserIRCUserList User; User = FindNick(Nick); if(User != None) { User.bChOp = bOp; Items.MoveItemSorted(User); } } //utpg: halfop support function ChangeHalfOp(string Nick, bool bHalfOp) { local UBrowserIRCUserList User; User = FindNick(Nick); if(User != None) { User.bHalfOp = bHalfOp; Items.MoveItemSorted(User); } } //utpg: halfop support -- end function ChangeVoice(string Nick, bool bVoice) { local UBrowserIRCUserList User; User = FindNick(Nick); if(User != None) { User.bVoice = bVoice; Items.MoveItemSorted(User); } } function DoubleClickItem(UWindowListBoxItem I) { UBrowserIRCChannelPage(OwnerWindow).SystemPage.FindPrivateWindow(UBrowserIRCUserList(I).NickName); } z~GfR'%pUBrowserServerPing: Port failed to bind. Attempt SZZ1Z~c-O-c(-Nq!NqL %zz]  S^  O *^ J e.g]  L * zr 4zC a. ?,l?,@BAC. ?,8?,@BAaP.ra y$ zuc ;6c &] .`) c  zLzzx=class UBrowserGSpyLink extends UBrowserBufferedTcpLink; // Misc var UBrowserGSpyFact OwnerFactory; var IpAddr MasterServerIpAddr; var bool bOpened; // Params var string MasterServerAddress; // Address of the master server var int MasterServerTCPPort; // Optional port that the master server is listening on var int Region; // Region of the game server var int MasterServerTimeout; var string GameName; // Error messages var localized string ResolveFailedError; var localized string TimeOutError; var localized string CouldNotConnectError; // for WaitFor const FoundSecureRequest = 1; const FoundSecret = 2; const NextIP = 3; const NextAddress = 4; function BeginPlay() { Disable('Tick'); Super.BeginPlay(); } function Start() { ResetBuffer(); MasterServerIpAddr.Port = MasterServerTCPPort; if( MasterServerAddress=="" ) MasterServerAddress = "master"$Region$".gamespy.com"; Resolve( MasterServerAddress ); } function DoBufferQueueIO() { Super.DoBufferQueueIO(); } function Resolved( IpAddr Addr ) { // Set the address MasterServerIpAddr.Addr = Addr.Addr; // Handle failure. if( MasterServerIpAddr.Addr == 0 ) { Log( "UBrowserGSpyLink: Invalid master server address, aborting." ); return; } // Display success message. Log( "UBrowserGSpyLink: Master Server is "$MasterServerAddress$":"$MasterServerIpAddr.Port ); // Bind the local port. if( BindPort() == 0 ) { Log( "UBrowserGSpyLink: Error binding local port, aborting." ); return; } Open( MasterServerIpAddr ); SetTimer(MasterServerTimeout, False); } event Timer() { if(!bOpened) { Log("UBrowserGSpyLink: Couldn't connect to master server."); OwnerFactory.QueryFinished(False, CouldNotConnectError$MasterServerAddress); GotoState('Done'); } } event Closed() { } // Host resolution failue. function ResolveFailed() { Log("UBrowserGSpyLink: Failed to resolve master server address, aborting."); OwnerFactory.QueryFinished(False, ResolveFailedError$MasterServerAddress); GotoState('Done'); } event Opened() { bOpened = True; Enable('Tick'); WaitFor("\\basic\\\\secure\\", 5, FoundSecureRequest); } function Tick(float DeltaTime) { DoBufferQueueIO(); } function HandleServer(string Text) { local string Address; local string Port; Address = ParseDelimited(Text, ":", 1); Port = ParseDelimited(ParseDelimited(Text, ":", 2), "\\", 1); OwnerFactory.FoundServer(Address, int(Port), "", GameName); } function GotMatch(int MatchData) { switch(MatchData) { case FoundSecureRequest: Enable('Tick'); WaitForCount(6, 5, FoundSecret); break; case FoundSecret: Enable('Tick'); SendBufferedData("\\gamename\\"$GameName$"\\location\\"$Region$"\\validate\\"$Validate(WaitResult, GameName)$"\\final\\"); GotoState('FoundSecretState'); break; case NextIP: Enable('Tick'); if(WaitResult == "final\\") { OwnerFactory.QueryFinished(True); GotoState('Done'); } else WaitFor("\\", 10, NextAddress); break; case NextAddress: Enable('Tick'); HandleServer(WaitResult); WaitFor("\\", 5, NextIP); break; default: break; } } function GotMatchTimeout(int MatchData) { Log("Timed out in master server protocol. Waiting for "$WaitingFor$" in state "$MatchData); OwnerFactory.QueryFinished(False, TimeOutError); GotoState('Done'); } // States state FoundSecretState { function Tick(float Delta) { Global.Tick(Delta); // Hack for 0 servers in server list if(!IsConnected() && WaitResult == "\\final\\") { OwnerFactory.QueryFinished(True); GotoState('Done'); } } Begin: Enable('Tick'); SendBufferedData("\\list\\\\gamename\\"$GameName$"\\final\\"); WaitFor("ip\\", 30, NextIP); } state Done { Begin: Disable('Tick'); } zx |2B-2 zzzCq 1i.Aiwi*Mzi@q  i.i(i.A W i@q iT z z|Ij 'Fi %S~I\@SIISIS~I\hSIIS&i  z@zzHna= ny.0 0nhm n ym n nhyanh zS@zzKr KI zr 255r  z{M%o{-M-RC%C|g HjCJ&JjCJ,UnrealjCJ%g -B|jCJ,T'C ' zHclass UBrowserNewFavoriteWindow expands UBrowserEditFavoriteWindow; ziIclass UBrowserIRCSetupClient expands UWindowDialogClientWindow; var UWindowComboControl ServerCombo; var UWindowComboControl ChannelCombo; var UWindowSmallButton ConnectButton; var config string IRCServerHistory[10]; var config string IRCChannelHistory[10]; var config bool bHasReadWarning; var localized string ServerText; var localized string ChannelText; var localized string ServerHelp; var localized string ChannelHelp; var localized string ConnectText; var localized string DisconnectText; var localized string ConnectHelp; var localized string DisconnectHelp; var localized string WarningText; var localized string WarningTitle; var UWindowMessageBox ConfirmJoin; var UBrowserIRCSystemPage SystemPage; function Created() { local Color TC; local int i; Super.Created(); SystemPage = UBrowserIRCSystemPage(OwnerWindow); ServerCombo = UWindowComboControl(CreateControl(class'UWindowComboControl', 10, 5, 250, 1)); ServerCombo.EditBoxWidth = 160; ServerCombo.SetText(ServerText); ServerCombo.SetHelpText(ServerHelp); ServerCombo.SetFont(F_Normal); ServerCombo.SetEditable(True); for (i=0; i<10; i++) if (IRCServerHistory[i] != "") ServerCombo.AddItem(IRCServerHistory[i]); TC.R = 255; TC.G = 255; TC.B = 255; ServerCombo.SetTextColor(TC); ServerCombo.SetSelectedIndex(0); ChannelCombo = UWindowComboControl(CreateControl(class'UWindowComboControl', 10, 25, 180, 1)); ChannelCombo.EditBoxWidth = 90; ChannelCombo.SetText(ChannelText); ChannelCombo.SetHelpText(ChannelHelp); ChannelCombo.SetFont(F_Normal); ChannelCombo.SetEditable(True); for (i=0; i<10; i++) if (IRCChannelHistory[i] != "") ChannelCombo.AddItem(IRCChannelHistory[i]); ChannelCombo.SetSelectedIndex(0); ChannelCombo.SetTextColor(TC); ConnectButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', 196, 26, 64, 16)); ConnectButton.bIgnoreLDoubleclick = True; } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); if(SystemPage.bConnected) { ConnectButton.SetText(DisconnectText); ConnectButton.SetHelpText(DisconnectHelp); } else { ConnectButton.SetText(ConnectText); ConnectButton.SetHelpText(ConnectHelp); } ConnectButton.AutoWidth(C); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function DoJoin() { SystemPage.Server = ServerCombo.GetValue(); SystemPage.DefaultChannel = ChannelCombo.GetValue(); SystemPage.Connect(); SaveServerCombo(); SaveChannelCombo(); SaveConfig(); } function MessageBoxDone(UWindowMessageBox W, MessageBoxResult Result) { if(W == ConfirmJoin && Result == MR_Yes) { bHasReadWarning = True; DoJoin(); } } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); if(C == ConnectButton && E == DE_Click) { if(SystemPage.bConnected) SystemPage.Disconnect(); else { if(bHasReadWarning) DoJoin(); else ConfirmJoin = MessageBox(WarningTitle, WarningText, MB_YesNo, MR_No); } } if(C == ChannelCombo && E == DE_EnterPressed) { SystemPage.JoinChannel(ChannelCombo.GetValue()); SaveChannelCombo(); SaveConfig(); } } function NewIRCServer(string S) { if(ServerCombo.List.Items.Count() == 1 && ServerCombo.GetValue() != S) { Log("Received new IRC server from UpdateServer: "$S); ServerCombo.Clear(); ServerCombo.AddItem(S); ServerCombo.SetSelectedIndex(0); SaveServerCombo(); SaveConfig(); } } function SaveServerCombo() { local UWindowComboListItem Item; local int i; ServerCombo.RemoveItem(ServerCombo.FindItemIndex(ServerCombo.GetValue())); ServerCombo.InsertItem(ServerCombo.GetValue()); while(ServerCombo.List.Items.Count() > 10) ServerCombo.List.Items.Last.Remove(); Item = UWindowComboListItem(ServerCombo.List.Items.Next); for (i=0; i<10; i++) { if(Item != None) { IRCServerHistory[i] = Item.Value; Item = UWindowComboListItem(Item.Next); } else IRCServerHistory[i] = ""; } } function SaveChannelCombo() { local UWindowComboListItem Item; local int i; ChannelCombo.RemoveItem(ChannelCombo.FindItemIndex(ChannelCombo.GetValue())); ChannelCombo.InsertItem(ChannelCombo.GetValue()); while(ChannelCombo.List.Items.Count() > 10) ChannelCombo.List.Items.Last.Remove(); Item = UWindowComboListItem(ChannelCombo.List.Items.Next); for (i=0; i<10; i++) { if(Item != None) { IRCChannelHistory[i] = Item.Value; Item = UWindowComboListItem(Item.Next); } else IRCChannelHistory[i] = ""; } } zm@zz@X E29:X  7 zDA@4|%A.gwA*:|,d|JppppppA=\A9\SA_\TA-B|A.A A.tkwA*|,dk|JppppppA=\A9\SA_\TA-B|A.A|,d|Jb zeclass UBrowserGSpyFact extends UBrowserServerListFactory; var UBrowserGSpyLink Link; var() config string MasterServerAddress; // Address of the master server var() config int MasterServerTCPPort; // Optional port that the master server is listening on var() config int Region; // Region of the game server var() config int MasterServerTimeout; var() config string GameName; function Query(optional bool bBySuperset, optional bool bInitial) { Super.Query(bBySuperset, bInitial); Link = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserGSpyLink'); Link.MasterServerAddress = MasterServerAddress; Link.MasterServerTCPPort = MasterServerTCPPort; Link.Region = Region; Link.MasterServerTimeout = MasterServerTimeout; Link.GameName = GameName; Link.OwnerFactory = Self; Link.Start(); } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Link.Destroy(); Link = None; Super.QueryFinished(bSuccess, ErrorMsg); } function Shutdown(optional bool bBySuperset) { if(Link != None) Link.Destroy(); Link = None; Super.Shutdown(bBySuperset); } zsyM xmy~y.b!mpy1%cPXzcb!my%cPpzccyP z`Z H"(zNZ Yz\ O? GZ VwO*? lOxxwN*N H\  z{owa-ppppPRIVMSG o :kV zvD(DEIa?,ha?,C?,4C?, zPx Q%8R&x 0wR*RMr A zxB L+-N&B +wN*N z{Qp {-p-nQ2a fQFLQJ vQCuQD xQeqQKQQ z|W&@PNwF *I. F BBI+ z[VtTVzG HU? GVYwU*? lUpppp*** nVoE  (X )wT*TtG E X  zkQm &QaQ*k-ml zMhtBpppppppPRIVMSG h :&ACTION g&V z{ZaMEQ8MaO|a &NICK!:Aa , zZTj?$ ,wQ*QaQ*Z-j zg VLL3lppppppUSER [  localhost B :I VppNICK AV %z\zGclass UBrowserFavoritesMenu expands UBrowserRightClickMenu; var UWindowPulldownMenuItem EditFavorite, NewFavorite; var localized string EditFavoriteName, NewFavoriteName; function AddFavoriteItems() { Favorites = AddMenuItem(FavoritesName, None); EditFavorite = AddMenuItem(EditFavoriteName, None); NewFavorite = AddMenuItem(NewFavoriteName, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case EditFavorite: Grid.GetParent(class'UWindowFramedWindow').ShowModal(Root.CreateWindow(class'UBrowserEditFavoriteWindow', 300, 80, 100, 100, Self, True)); break; case NewFavorite: Grid.GetParent(class'UWindowFramedWindow').ShowModal(Root.CreateWindow(class'UBrowserNewFavoriteWindow', 300, 80, 100, 100, Self, True)); break; case Favorites: UBrowserFavoriteServers(Grid.GetParent(class'UBrowserServerListWindow')).RemoveFavorite(List); Super(UWindowRightClickMenu).ExecuteItem(I); return; break; } Super.ExecuteItem(I); } function ShowWindow() { EditFavorite.bDisabled = List == None; Super.ShowWindow(); } zg x._x ,Wzx &ERRORx:,'z_433x ,'z_005x ,'},_x }{_J|_, CHANTYPES=_, $pSupported CHANTYPES: jj|_,PREFIX=__,jz_&(w_~_)&__&'{w_& Ovw& Htw& Vuw& __&ww&|ppvtu!pUsed user PREFIX: |}_x }J_,x ,'q!Yx ,'8x z]]GGz\W?8] j.WjWD(vjWF(ujWE(tjKjQ]jW? ZW'z\\HX]EwX*X G\ zRF a1)^\wI*F G L F IL IF I" z_M T!XM TM c z{bb {-b-ab2a sbGib~fbIebA dbMbQ zg]\y7`]5w`*`\^_ zg Zj_ 8 >  ,ez  &ERROR :,'] z>JOIN :!,|A!G  ,] ;z>PART :!,|A!H  ,] z>NICK-: :!,  ,] z>QUIT.P :!,  ,'] -z>353 #, :& :,'*{y &sp#Yyzy&v5p#Yy'zy&u9p#Yy'zy&t{p#Yy' ,' ] ?z>333] Qz>366] cz>331] uz>332] z>341] z>3013U  , :,'] z>NOTICE : , :! ,~!~.  ,'&&&& C&},E  ,'] %J>%  ,'] z>MODE  ,y  ,l,-q'{&z+-q'z--q( zv*5y  l-qlSzu*9y  l-qlzt*{y  l-ql&}3Ky :!,  ,'] bz>KICKZt  ,  , :!, :,'] z>INVITE0 :!,@ :,] ] z>PRIVMSG  ,  ,'z&,ACTION &&&&,}&{~&#@&!\ :!,T :!,]  &&&&&}, VERSIONppppppppNOTICE  :!, :&VERSION x&V!C :!, !C :!, ] 8 {~&#@&!K :!,] U :!, zk^` I&bab*k-`\ zrzzX`Y5 Ne  %zzZaZ?#,wb*bab*Z-Z z\K <<-K :wI*I-I[ z@zzjE {nhr.?8E rgrUE rWr z} yHz-( z{}X {-X-V-g-#q}2a e}w[}E Y}G}Q zk| U!X| U| W zmQKM7cQ5wc*cKRS zx iUHvHx UTPOH-v'nH-TH B''-#-ZH zpdVxv{dYou have been marked as being away0{dYou are no longer marked as being away% d zg class UBrowserNewFavoriteCW expands UBrowserEditFavoriteCW; function LoadCurrentValues() { GamePortEdit.SetValue("7777"); QueryPortEdit.SetValue("7778"); } function OKPressed() { local UBrowserServerListFactory F; local UBrowserServerList L; local UBrowserFavoriteServers W; W = UBrowserFavoriteServers(UBrowserRightClickMenu(ParentWindow.OwnerWindow).Grid.GetParent(class'UBrowserFavoriteServers')); F = W.Factories[0]; L = UBrowserServerList(F.PingedList.CreateItem(F.PingedList.Class)); L.HostName = DescriptionEdit.GetValue(); L.IP = IPEdit.GetValue(); L.Ping = 9999; L.QueryPort = Int(QueryPortEdit.GetValue()); L.bKeepDescription = !UpdateDescriptionCheck.bChecked; L.GamePort = Int(GamePortEdit.GetValue()); L = W.AddFavorite(L); if(L != None) L.PingServer(False, True, True); ParentWindow.Close(); } zhkN2--'0-( zdvS<:w(*(xExit Game(_ zr@zzHzzGw4wC 5|wTruej-|wFalsez w zklN *>}a}*k-NL-#q z]$k?,C C?D?,?D?, zu."[8'?, zZtM?5,w}*}a}*Z-M zkn l5ZXr&n *K.  WKMn  CK zo 3ao U *m W * -*k Y *kJ e zd zzF@(z|zzHT b&T   zL{ T 2w { 0ww *( T{  zyl ;dd.l :odp}W Tmd,W l  zKa a,a,a,a,G~a,GV&GV}a+~0123456789,aGV&VkapaGaGVG~a,Ud @%wd * vd Dd . Wd *d -'d a-'.0kd  zR&//============================================================================= // UBrowserMainWindow - The main window //============================================================================= class UBrowserMainWindow extends UWindowFramedWindow; var UBrowserBannerBar BannerWindow; var string StatusBarDefaultText; var bool bStandaloneBrowser; var localized string WindowTitleString; function DefaultStatusBarText(string Text) { StatusBarDefaultText = Text; StatusBarText = Text; } function BeginPlay() { Super.BeginPlay(); WindowTitle = WindowTitleString; ClientClass = class'UBrowserMainClientWindow'; } function WindowShown() { Super.WindowShown(); if(WinLeft < 0 || WinTop < 16 || WinLeft + WinWidth > Root.WinWidth || WinTop + WinHeight > Root.WinHeight) SetSizePos(); } function Created() { bSizable = True; bStatusBar = True; Super.Created(); MinWinWidth = 300; SetSizePos(); } function BeforePaint(Canvas C, float X, float Y) { if(StatusBarText == "") StatusBarText = StatusBarDefaultText; Super.BeforePaint(C, X, Y); } function Close(optional bool bByParent) { if(bStandaloneBrowser) Root.Console.CloseUWindow(); else Super.Close(bByParent); } function ResolutionChanged(float W, float H) { SetSizePos(); Super.ResolutionChanged(W, H); } function SetSizePos() { if(Root.WinHeight < 400) SetSize(Min(620, Root.WinWidth - 10), Root.WinHeight-32); else SetSize(Min(620, Root.WinWidth - 10), Root.WinHeight-50); WinLeft = Int((Root.WinWidth - WinWidth) / 2); WinTop = Int((Root.WinHeight - WinHeight) / 2); MinWinHeight = Min(300, WinHeight - 20); } // External entry points function ShowOpenWindow() { local UBrowserOpenWindow W; W = UBrowserOpenWindow(Root.CreateWindow(class'UBrowserOpenWindow', 300, 80, 100, 100, Self, True)); ShowModal(W); } function OpenURL(string URL) { if( Left(URL, 7) ~= "http://" ) GetPlayerOwner().ConsoleCommand("start "$URL); else if( Left(URL, 9) ~= "unreal://" ) GetPlayerOwner().ClientTravel(URL, TRAVEL_Absolute, false); else GetPlayerOwner().ClientTravel("unreal://"$URL, TRAVEL_Absolute, false); Close(); Root.Console.CloseUWindow(); } function SelectInternet() { UBrowserMainClientWindow(ClientArea).SelectInternet(); } function SelectLAN() { UBrowserMainClientWindow(ClientArea).SelectLAN(); } zqzzNn 4Xrm |n Am n A z{e _ {-_ -[ q.+-#  +Q%Q,QqNF~QqJ_QqJQAw~*~]-# ^~ (pHWF&r_* (pGWFX-_  -[ _# W._wW*qWW.Wq ' zFR C cR  zP` 0c` ^ ]  zIT X E-D(|%|}T-DfzT|&\FT}T|'EpET|&zT|&\-D'|( z]o ]}z. [Zwz*>rzgo  z. zz. [ W zgo  zVP_N6z6Pq!G zXjV\l9w(*,v{kHkHszwwHbzlluj%j,lpl쒧, ,0jpCreated new UserIdent: lb(a 1( Vh Hlwk -u' zZD{?FZ-{~` zJt N{< Sft 3rf*( Nt Q?Zf' zK\qP \-d 7-J\-v Y J-#X J-#-I0\]X Y \C {e {e \N ({c {c \_ Ob %\cb  wa %\&?a  wg"B\9\_* A.-B\\Ag vA--\' zqK//============================================================================= // UBrowserMainClientWindow - The main client area //============================================================================= class UBrowserMainClientWindow extends UWindowClientWindow; var globalconfig string LANTabName; var globalconfig name ServerListNames[50]; var globalconfig bool bKeepMasterServer; var UWindowPageControl PageControl; var UWindowPageControlPage Favorites, IRC, MOTD; var localized string FavoritesName, IRCName, MOTDName; var string ServerListWindowClass; var string FavoriteServersClass; var string UpdateServerClass; var UWindowPageControlPage LANPage; var UWindowTabControlItem PageBeforeLAN; var UBrowserServerListWindow FactoryWindows[50]; var UBrowserInfoWindow InfoWindow; function Created() { local int i, f, j; local UWindowPageControlPage P; local UBrowserServerListWindow W; local class C; local class FC; local class MC; local string NextWindowClass, NextWindowDesc; Super.Created(); InfoWindow = UBrowserInfoWindow(Root.CreateWindow(class'UBrowserInfoWindow', 10, 40, 310, 170)); InfoWindow.HideWindow(); PageControl = UWindowPageControl(CreateWindow(class'UWindowPageControl', 0, 0, WinWidth, WinHeight)); PageControl.SetMultiLine(True); // Add MOTD MC = class(DynamicLoadObject(UpdateServerClass, class'Class')); MOTD = PageControl.AddPage(MOTDName, MC); IRC = PageControl.AddPage(IRCName, class'UBrowserIRCWindow'); // Add favorites FC = class(DynamicLoadObject(FavoriteServersClass, class'Class')); Favorites = PageControl.AddPage(FavoritesName, FC); C = class(DynamicLoadObject(ServerListWindowClass, class'Class')); for(i=0; i<50; i++) { if(ServerListNames[i] == '') break; P = PageControl.AddPage("", C, ServerListNames[i]); if(string(ServerListNames[i]) ~= LANTabName) LANPage = P; W = UBrowserServerListWindow(P.Page); if(W.bHidden) PageControl.DeletePage(P); if(W.ServerListTitle != "") P.SetCaption(W.ServerListTitle); else P.SetCaption(Localize("ServerListTitles", string(ServerListNames[i]), "UBrowser")); FactoryWindows[i] = W; } // Load custom UBrowser pages if(i < 50) { j = 0; GetPlayerOwner().GetNextIntDesc(ServerListWindowClass, j, NextWindowClass, NextWindowDesc); while( NextWindowClass != "" && i < 50 ) { C = class(DynamicLoadObject(NextWindowClass, class'Class')); if( C != None ) { ServerListNames[i] = ''; P = PageControl.AddPage("", C); W = UBrowserServerListWindow(P.Page); if(W.bHidden) PageControl.DeletePage(P); if(W.ServerListTitle != "") P.SetCaption(W.ServerListTitle); else P.SetCaption(NextWindowDesc); FactoryWindows[i] = W; i++; } j++; GetPlayerOwner().GetNextIntDesc(ServerListWindowClass, j, NextWindowClass, NextWindowDesc); } } } function SelectLAN() { if(LANPage != None) { PageBeforeLAN = PageControl.SelectedTab; PageControl.GotoTab(LANPage, True); } } function SelectInternet() { if(PageBeforeLAN != None && PageControl.SelectedTab == LANPage) PageControl.GotoTab(PageBeforeLAN, True); PageBeforeLAN = None; } function NewMasterServer(string M) { local int i, j; local string NewServers[10]; local string T; local bool bHadNewServer; i = 0; while(M != "") { j = InStr(M, Chr(13)); if(j != -1) { T = Left(M, j); M = Mid(M, j+1); } else { T = M; M = ""; } if(T != "") NewServers[i++] = T; } if(!bKeepMasterServer) { for(i=0; i<20; i++) { if(ServerListNames[i] == 'UBrowserAll') { bHadNewServer = False; for(j=0; j<9; j++) { if(FactoryWindows[i].ListFactories[j] != NewServers[j]) { Log("Received new master server ["$j$"] from UpdateServer: "$NewServers[j]); FactoryWindows[i].ListFactories[j] = NewServers[j]; FactoryWindows[i].ListFactories[j+1] = ""; bHadNewServer = True; } } if(bHadNewServer) { if(FactoryWindows[i].bHadInitialRefresh) FactoryWindows[i].Refresh(False, True); FactoryWindows[i].SaveConfig(); } } } } } function NewIRCServer(string S) { UBrowserIRCWindow(IRC.Page).SystemPage.SetupClient.NewIRCServer(S); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function Resized() { Super.Resized(); PageControl.SetSize(WinWidth, WinHeight); } function SaveConfigs() { SaveConfig(); } zck N[5-+zk &#ppJOIN k V zc[ E:[  7 zl"+yl.o-l-um-l-uk-l-u zkMy s k-yC zOO T"5-+zO &#ppPART O V zP//============================================================================= // UBrowserServerList // Stores a server entry in an Unreal Server List //============================================================================= class UBrowserServerList extends UWindowList; // Valid for sentinel only var UBrowserServerListWindow Owner; var int TotalServers; var int TotalPlayers; var int TotalMaxPlayers; var bool bNeedUpdateCount; // Config var config int MaxSimultaneousPing; var config int MaxSimBroadbandPing; // Master server variables var string IP; var int QueryPort; var string Category; // Master server categorization var string GameName; // Unreal, Unreal Tournament // State of the ping var UBrowserServerPing ServerPing; var bool bPinging; var bool bPingFailed; var bool bPinged; var bool bNoInitalPing; var bool bOldServer; // Rules and Lists var UBrowserRulesList RulesList; var UBrowserPlayerList PlayerList; var bool bKeepDescription; // don't overwrite HostName var int PlayerListSortColumn; // Unreal server variables var bool bLocalServer; var float Ping; var string HostName; var int GamePort; var string MapName; var string MapTitle; var string MapDisplayName; var string GameType; var string GameMode; var int NumPlayers; var int MaxPlayers; var int GameVer; var int MinNetVer; function DestroyListItem() { Owner = None; if(ServerPing != None) { ServerPing.Destroy(); ServerPing = None; } Super.DestroyListItem(); } function QueryFinished(UBrowserServerListFactory Fact, bool bSuccess, optional string ErrorMsg) { Owner.QueryFinished(Fact, bSuccess, ErrorMsg); } // Functions for server list entries only. function PingServer(bool bInitial, bool bJustThisServer, bool bNoSort) { // Create the UdpLink to ping the server ServerPing = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserServerPing'); ServerPing.Server = Self; ServerPing.StartQuery('GetInfo', 2); ServerPing.bInitial = bInitial; ServerPing.bJustThisServer = bJustThisServer; ServerPing.bNoSort = bNoSort; bPinging = True; } function ServerStatus() { // Create the UdpLink to ping the server ServerPing = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserServerPing'); ServerPing.Server = Self; ServerPing.StartQuery('GetStatus', 2); bPinging = True; } function StatusDone(bool bSuccess) { // Destroy the UdpLink ServerPing.Destroy(); ServerPing = None; bPinging = False; RulesList.Sort(); PlayerList.Sort(); } function CancelPing() { if(bPinging && ServerPing != None && ServerPing.bJustThisServer) PingDone(False, True, False, True); } function PingDone(bool bInitial, bool bJustThisServer, bool bSuccess, bool bNoSort) { local UBrowserServerListWindow W; local UBrowserServerList OldSentinel; // Destroy the UdpLink if(ServerPing != None) ServerPing.Destroy(); ServerPing = None; bPinging = False; bPingFailed = !bSuccess; bPinged = True; OldSentinel = UBrowserServerList(Sentinel); if(!bNoSort) { Remove(); // Move to the ping list if(!bPingFailed || (OldSentinel != None && OldSentinel.Owner != None && OldSentinel.Owner.bShowFailedServers)) { if(OldSentinel.Owner.PingedList != None) OldSentinel.Owner.PingedList.AppendItem(Self); } } else { if(OldSentinel != None && OldSentinel.Owner != None && OldSentinel != OldSentinel.Owner.PingedList) Log("Unsorted PingDone lost as it's not in ping list!"); } if(Sentinel != None) { UBrowserServerList(Sentinel).bNeedUpdateCount = True; if(bInitial) ConsiderForSubsets(); } if(!bJustThisServer) if(OldSentinel != None) { W = OldSentinel.Owner; if(W.bPingSuspend) { W.bPingResume = True; W.bPingResumeIntial = bInitial; } else OldSentinel.PingNext(bInitial, bNoSort); } } function ConsiderForSubsets() { local UBrowserSubsetList l; for(l = UBrowserSubsetList(UBrowserServerList(Sentinel).Owner.SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) { l.SubsetFactory.ConsiderItem(Self); } } // Functions for sentinel only function InvalidatePings() { local UBrowserServerList l; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) l.Ping = 9999; } function PingServers(bool bInitial, bool bNoSort) { local UBrowserServerList l; bPinging = False; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { l.bPinging = False; l.bPingFailed = False; l.bPinged = False; } PingNext(bInitial, bNoSort); } function PingNext(bool bInitial, bool bNoSort) { local int TotalPinging; local UBrowserServerList l; local bool bDone; local int MaxPing; MaxPing = MaxSimultaneousPing; if( Owner != None && Owner.GetPlayerOwner().Player.CurrentNetSpeed > 5000 ) MaxPing = MaxSimBroadbandPing; TotalPinging = 0; bDone = True; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { if(!l.bPinged) bDone = False; if(l.bPinging) TotalPinging ++; } if(bDone && Owner != None) { bPinging = False; Owner.PingFinished(); } else if(TotalPinging < MaxPing) { for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { if( !l.bPinging && !l.bPinged && (!bInitial || !l.bNoInitalPing) && TotalPinging < MaxPing ) { TotalPinging ++; l.PingServer(bInitial, False, bNoSort); } if(TotalPinging >= MaxPing) break; } } } function UBrowserServerList FindExistingServer(string FindIP, int FindQueryPort) { local UWindowList l; for(l = Next;l != None;l = l.Next) { if(UBrowserServerList(l).IP == FindIP && UBrowserServerList(l).QueryPort == FindQueryPort) return UBrowserServerList(l); } return None; } function PlayerPawn GetPlayerOwner() { return UBrowserServerList(Sentinel).Owner.GetPlayerOwner(); } function UWindowList CopyExistingListItem(Class ItemClass, UWindowList SourceItem) { local UBrowserServerList L; L = UBrowserServerList(Super.CopyExistingListItem(ItemClass, SourceItem)); L.bLocalServer = UBrowserServerList(SourceItem).bLocalServer; L.IP = UBrowserServerList(SourceItem).IP; L.QueryPort = UBrowserServerList(SourceItem).QueryPort; L.Ping = UBrowserServerList(SourceItem).Ping; L.HostName = UBrowserServerList(SourceItem).HostName; L.GamePort = UBrowserServerList(SourceItem).GamePort; L.MapName = UBrowserServerList(SourceItem).MapName; L.MapTitle = UBrowserServerList(SourceItem).MapTitle; L.MapDisplayName= UBrowserServerList(SourceItem).MapDisplayName; L.MapName = UBrowserServerList(SourceItem).MapName; L.GameType = UBrowserServerList(SourceItem).GameType; L.GameMode = UBrowserServerList(SourceItem).GameMode; L.NumPlayers = UBrowserServerList(SourceItem).NumPlayers; L.MaxPlayers = UBrowserServerList(SourceItem).MaxPlayers; L.GameVer = UBrowserServerList(SourceItem).GameVer; L.MinNetVer = UBrowserServerList(SourceItem).MinNetVer; L.bKeepDescription = UBrowserServerList(SourceItem).bKeepDescription; return L; } function int Compare(UWindowList T, UWindowList B) { CompareCount++; return UBrowserServerList(Sentinel).Owner.Grid.Compare(UBrowserServerList(T), UBrowserServerList(B)); } function AppendItem(UWindowList L) { Super.AppendItem(L); UBrowserServerList(Sentinel).bNeedUpdateCount = True; } function Remove() { local UBrowserServerList S; S = UBrowserServerList(Sentinel); Super.Remove(); if(S != None) S.bNeedUpdateCount = True; } // Sentinel only // FIXME: slow when lots of servers!! function UpdateServerCount() { local UBrowserServerList l; TotalServers = 0; TotalPlayers = 0; TotalMaxPlayers = 0; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { TotalServers++; TotalPlayers += l.NumPlayers; TotalMaxPlayers += l.MaxPlayers; } } function bool DecodeServerProperties(string Data) { return True; } zbclass UBrowserFavoritesFact extends UBrowserServerListFactory; var config int FavoriteCount; var config string Favorites[100]; /* eg Favorites[0]=Host Name\10.0.0.1\7778\True */ function string ParseOption(string Input, int Pos) { local int i; while(True) { if(Pos == 0) { i = InStr(Input, "\\"); if(i != -1) Input = Left(Input, i); return Input; } i = InStr(Input, "\\"); if(i == -1) return ""; Input = Mid(Input, i+1); Pos--; } } function Query(optional bool bBySuperset, optional bool bInitial) { local int i; local UBrowserServerList L; Super.Query(bBySuperset, bInitial); for(i=0;ih<!iW -o-o4iW -o(A z@zz_wJ)jrU *.w.U .i %}s..t..&hh f&]]c-]]&c\s..c& ,hhhh&s..& ,2tPP]sPP&s..& .,s``+t``&+$s..+& ,bst&s..& ,sOO%tOO&Tst&s..& P,ooMoo&MFs..M& ,s[[t[[&s..& .-o zHos.@Hstui < zza w a %#ffffff #&#000000 2,#0000ff A,#00ff00 P,#ff0000 _,#7f0000 n,#7f007f },#ff7f00 ,#ffff00 , #00ff00 , #00ffff , #00ffff , #0000ff , #ff00ff , #ff00ff ,#7f7f7f ,#c0c0c0  zzzGbs 5?&{s &/p*** m=(Ms & z| class UBrowserFavoriteServers extends UBrowserServerListWindow; function Created() { Super.Created(); Refresh(); } function UBrowserServerList AddFavorite(UBrowserServerList Server) { local UBrowserServerList NewItem; if(PingedList.FindExistingServer(Server.IP, Server.QueryPort) == None) NewItem = UBrowserServerList(PingedList.CopyExistingListItem(ServerListClass, Server)); PingedList.Sort(); UBrowserFavoritesFact(Factories[0]).SaveFavorites(); return NewItem; } function RemoveFavorite(UBrowserServerList Item) { Item.Remove(); UBrowserFavoritesFact(Factories[0]).SaveFavorites(); } zCclass UBrowserEditFavoriteWindow expands UWindowFramedWindow; var UWindowSmallCloseButton CloseButton; var UWindowSmallButton OKButton; var localized string OKText; function Created() { Super.Created(); OKButton = UWindowSmallButton(CreateWindow(class'UWindowSmallButton', WinWidth-108, WinHeight-24, 48, 16)); CloseButton = UWindowSmallCloseButton(CreateWindow(class'UWindowSmallCloseButton', WinWidth-56, WinHeight-24, 48, 16)); OKButton.Register(UBrowserEditFavoriteCW(ClientArea)); OKButton.SetText(OKText); SetSizePos(); } function ResolutionChanged(float W, float H) { Super.ResolutionChanged(W, H); SetSizePos(); } function SetSizePos() { SetSize(FMin(Root.WinWidth-20, 400), 160); WinLeft = Int((Root.WinWidth - WinWidth) / 2); WinTop = Int((Root.WinHeight - WinHeight) / 2); } function Resized() { Super.Resized(); ClientArea.SetSize(ClientArea.WinWidth, ClientArea.WinHeight-24); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); OKButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-104; OKButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; CloseButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-52; CloseButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; } function Paint(Canvas C, float X, float Y) { local Texture T; T = GetLookAndFeelTexture(); DrawUpBevel( C, ClientArea.WinLeft, ClientArea.WinTop + ClientArea.WinHeight, ClientArea.WinWidth, 24, T); Super.Paint(C, X, Y); } zax0V YZ.UwZ*9ZoxZZ.Z* zYkk-6ppAWAY :kV zZzzD  z}Ibg Ij j X$I R<< <JU  $I <% }  $I <% }?   z^ B^&&^>>^<<@{^a^u v w x @p@u E:v %@p@:w %@p@:x %@p@s @.0ks  z^JC+J~ ` zA,class UBrowserIRCPageBase expands UWindowPageWindow; var UWindowDynamicTextArea TextArea; var UWindowEditControl EditControl; var config string TextAreaClass; var localized string HasLeftText; var localized string HasJoinedText; var localized string WasKickedByText; var localized string NowKnownAsText; var localized string QuitText; var localized string SetsModeText; var class RightClickMenuClass; var UWindowPulldownMenu Menu; function Created() { local class TAClass; Super.Created(); TAClass = class(DynamicLoadObject(TextAreaClass, class'Class')); if(TAClass == None) TAClass = class'UBrowserIRCTextArea'; TextArea = UWindowDynamicTextArea(CreateControl(TAClass, 0, 0, WinWidth, WinHeight, Self)); EditControl = UWindowEditControl(CreateControl(class'UWindowEditControl', 0, WinHeight-16, WinWidth, 16)); EditControl.SetFont(F_Normal); EditControl.SetNumericOnly(False); EditControl.SetMaxLength(400); EditControl.SetHistory(True); } function Setup() { if(RightClickMenuClass != None) { Menu = UWindowPulldownMenu(Root.CreateWindow(RightClickMenuClass, 0, 0, 100, 100, Self)); Menu.HideWindow(); } } function RMouseUp(float X, float Y) { local float MenuX, MenuY; if(Menu != None) { WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.ShowWindow(); } } function Close(optional bool bByParent) { Super.Close(bByParent); if(Menu != None && Menu.bWindowVisible) Menu.CloseUp(); } function ClosePage() { } function WindowShown() { Super.WindowShown(); OwnerTab.bFlash = False; } function AddedText() { if(!bWindowVisible) OwnerTab.bFlash = True; else OwnerTab.bFlash = False; } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); EditControl.SetSize(WinWidth, 17); EditControl.WinLeft = 0; EditControl.WinTop = WinHeight - EditControl.WinHeight; EditControl.EditBoxWidth = WinWidth; TextArea.SetSize(WinWidth, WinHeight - EditControl.WinHeight); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); switch(E) { case DE_EnterPressed: switch(C) { case EditControl: ProcessInput(EditControl.GetValue()); EditControl.Clear(); break; } break; case DE_WheelUpPressed: switch(C) { case EditControl: TextArea.VertSB.Scroll(-1); break; } break; case DE_WheelDownPressed: switch(C) { case EditControl: TextArea.VertSB.Scroll(1); break; } break; } } function ProcessInput(string Text); z@S ><!YS -u-u4YS -u(A zVzzppJ!}rR *Js.p@.R @[Q[&u.-u[[[ zi_26:*5ihppQUIT :xV8a zs zz[zzhi|hgf zxzzzzd class UBrowserIRCPrivateMenu expands UWindowRightClickMenu; var UWindowPulldownMenuItem CloseChat; var UWindowPulldownMenuItem Join; var localized string CloseText; var localized string JoinText; function Created() { Super.Created(); Join = AddMenuItem(JoinText, None); Join.CreateSubMenu(class'UBrowserIRCJoinMenu', UBrowserIRCPrivPage(OwnerWindow).SystemPage); CloseChat = AddMenuItem(CloseText, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case CloseChat: UBrowserIRCPrivPage(OwnerWindow).ClosePage(); break; } Super.ExecuteItem(I); } zvl yV~l b GR VRRVYRRVV RV z@zzmi E%s:i  7 zE\E:(%ppp-\- ] z}_U?3%(pp_g@ : ` z1class UBrowserEditFavoriteCW expands UWindowDialogClientWindow; var UWindowEditControl DescriptionEdit; var localized string DescriptionText; var UWindowCheckbox UpdateDescriptionCheck; var localized string UpdateDescriptionText; var UWindowEditControl IPEdit; var localized string IPText; var UWindowEditControl GamePortEdit; var localized string GamePortText; var UWindowEditControl QueryPortEdit; var localized string QueryPortText; function Created() { local float ControlOffset, CenterPos, CenterWidth; Super.Created(); DescriptionEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 10, 220, 1)); DescriptionEdit.SetText(DescriptionText); DescriptionEdit.SetFont(F_Normal); DescriptionEdit.SetNumericOnly(False); DescriptionEdit.SetMaxLength(300); DescriptionEdit.EditBoxWidth = 100; UpdateDescriptionCheck = UWindowCheckbox(CreateControl(class'UWindowCheckbox', 10, 30, 136, 1)); UpdateDescriptionCheck.SetText(UpdateDescriptionText); UpdateDescriptionCheck.SetFont(F_Normal); IPEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 50, 220, 1)); IPEdit.SetText(IPText); IPEdit.SetFont(F_Normal); IPEdit.SetNumericOnly(False); IPEdit.SetMaxLength(40); IPEdit.EditBoxWidth = 100; GamePortEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 70, 160, 1)); GamePortEdit.SetText(GamePortText); GamePortEdit.SetFont(F_Normal); GamePortEdit.SetNumericOnly(True); GamePortEdit.SetMaxLength(5); GamePortEdit.EditBoxWidth = 40; QueryPortEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 90, 160, 1)); QueryPortEdit.SetText(QueryPortText); QueryPortEdit.SetFont(F_Normal); QueryPortEdit.SetNumericOnly(True); QueryPortEdit.SetMaxLength(5); QueryPortEdit.EditBoxWidth = 40; DescriptionEdit.BringToFront(); LoadCurrentValues(); } function LoadCurrentValues() { local UBrowserServerList L; L = UBrowserRightClickMenu(ParentWindow.OwnerWindow).List; DescriptionEdit.SetValue(L.HostName); UpdateDescriptionCheck.bChecked = !L.bKeepDescription; IPEdit.SetValue(L.IP); GamePortEdit.SetValue(string(L.GamePort)); QueryPortEdit.SetValue(string(L.QueryPort)); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); DescriptionEdit.WinWidth = WinWidth - 20; DescriptionEdit.EditBoxWidth = WinWidth - 140; } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); if((C == UBrowserEditFavoriteWindow(ParentWindow).OKButton && E == DE_Click)) OKPressed(); } function OKPressed() { local UBrowserServerList L; L = UBrowserRightClickMenu(ParentWindow.OwnerWindow).List; L.HostName = DescriptionEdit.GetValue(); L.bKeepDescription = !UpdateDescriptionCheck.bChecked; L.IP = IPEdit.GetValue(); L.GamePort = Int(GamePortEdit.GetValue()); L.QueryPort = Int(QueryPortEdit.GetValue()); UBrowserFavoritesFact(UBrowserFavoriteServers(UBrowserRightClickMenu(ParentWindow.OwnerWindow).Grid.GetParent(class'UBrowserFavoriteServers')).Factories[0]).SaveFavorites(); L.PingServer(False, True, True); ParentWindow.Close(); } z\ g:>,{}upstart }\ Z  zLSP' 7%,ppp*** SV (T). zzzvclass UBrowserConsole expands WindowConsole; event bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { return Super(Console).KeyEvent( Key, Action, Delta ); } exec function ShowUBrowser() { Super.LaunchUWindow(); } CGi>Dʯd/T2'zzHxT3%ppp* x ~  -{xgH"QpppIRC: * x ~  zaclass UBrowserIRCPrivPage expands UBrowserIRCPageBase; var string PrivNick; var UBrowserIRCSystemPage SystemPage; function ClosePage() { SystemPage.PageParent.DeletePage(OwnerTab); } function ProcessInput(string Text) { if(Left(Text, 4) ~= "/me ") { PrivateAction(SystemPage.NickName, Mid(Text, 4)); SystemPage.Link.SendChannelAction(PrivNick, Mid(Text, 4)); } else if(Left(Text, 1) == "/") SystemPage.ProcessInput(Text); else { if(Text != "") { PrivateText(SystemPage.NickName, Text); SystemPage.Link.SendChannelText(PrivNick, Text); } } } function ChangedNick(string OldNick, string NewNick) { TextArea.AddText("*** "$OldNick@NowKnownAsText@NewNick$"."); PrivNick = NewNick; } function UserQuit(string Nick, string Reason) { TextArea.AddText("*** "$Nick@QuitText@"("$Reason$")."); } function PrivateText(string Nick, string Text) { TextArea.AddText("<"$Nick$"> "$Text); if(!GetParent(class'UWindowFramedWindow').bWindowVisible && Nick != SystemPage.NickName) GetPlayerOwner().ClientMessage("IRC: <"$Nick$"> "$Text); } function PrivateAction(string Nick, string Text) { TextArea.AddText("* "$Nick$" "$Text); if(!GetParent(class'UWindowFramedWindow').bWindowVisible && Nick != SystemPage.NickName) GetPlayerOwner().ClientMessage("IRC: * "$Nick$" "$Text); } function UserNotice(string Nick, string Text) { TextArea.AddText("-"$Nick$"- "$Text); } function IsAway(string Nick, string Message) { TextArea.AddText(Nick@SystemPage.IsAwayText$": "$Message); } zv{  zAyU,%ppp<y> `  -{ygH"QpppIRC: <y> `  z|Q |E. W.JE  JB% *EE%EWEE?,dEB zROclass UBrowserColorIRCTextArea expands UWindowHTMLTextArea; // Converts to IRC codes to HTML and uses the HTML renderer. // ***SLOW*** function UWindowDynamicTextRow AddText(string Text) { local UWindowDynamicTextRow R; local string OutText, NextBlock; local byte BoldState, UnderlineState, ColorState; ReplaceText(Text, "&", "&"); ReplaceText(Text, ">", ">"); ReplaceText(Text, "<", "<"); OutText = ""; while(Text != "") { ProcessText(Text, NextBlock, BoldState, UnderlineState, ColorState); OutText = OutText $ NextBlock; } if(BoldState != 0) OutText = OutText $ ""; if(UnderlineState != 0) OutText = OutText $ ""; if(ColorState != 0) OutText = OutText $ ""; R = Super.AddText(OutText); UBrowserIRCPageBase(OwnerWindow).AddedText(); return R; } function LaunchUnrealURL(string URL) { Super.LaunchUnrealURL(URL); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } function RMouseUp(float X, float Y) { local UBrowserIRCPageBase P; local float GX, GY; P = UBrowserIRCPageBase(GetParent(class'UBrowserIRCPageBase')); WindowToGlobal(X, Y, GX, GY); P.GlobalToWindow(GX, GY, X, Y); P.RMouseUp(X, Y); } function ProcessText(out string Text, out string NextBlock, out byte BoldState, out byte UnderlineState, out byte ColorState) { local int i; local string FG, BG; local bool bColor, bUnderline, bBold, bNormal, bReverse; i = InStr(Text, "http://"); MultiInStr(Text, "www.", i); MultiInStr(Text, "unreal://", i); MultiInStr(Text, "ftp://", i); MultiInStr(Text, "ftp.", i); MultiInStr(Text, "telnet://", i); bBold = MultiInStr(Text, Chr(2), i); bColor = MultiInStr(Text, Chr(3), i); if(bColor) bBold = False; bNormal = MultiInStr(Text, Chr(15), i); if(bNormal) { bBold = False; bColor = False; } bReverse = MultiInStr(Text, Chr(22), i); if(bReverse) { bBold = False; bColor = False; bNormal = False; } bUnderline = MultiInStr(Text, Chr(31), i); if(bUnderline) { bBold = False; bColor = False; bNormal = False; bReverse = False; } if(i == -1) { NextBlock = Text; Text = ""; } else if(i == 0) { if(bUnderline || bBold || bNormal || bReverse) i = 1; else if(bColor) { for(i = 1;i"; else NextBlock = ""; } } else if(bUnderline) { if(UnderlineState != 0) NextBlock = ""; else NextBlock = ""; UnderlineState = 1-UnderlineState; } else if(bBold) { if(BoldState != 0) NextBlock = ""; else NextBlock = ""; BoldState = 1-BoldState; } else if(bNormal) { NextBlock = ""; if(BoldState != 0) NextBlock = ""; BoldState = 0; if(UnderlineState != 0) NextBlock = ""; UnderlineState = 0; if(ColorState != 0) NextBlock = ""; ColorState = 0; } else if(bReverse) { if(ColorState != 0) NextBlock = ""; else NextBlock = ""; ColorState = 1 - ColorState; } else NextBlock = ""$NextBlock$""; } else { NextBlock = Left(Text, i); Text = Mid(Text, i); } } function bool MultiInStr(string Text, string In, out int i) { local int j; j = InStr(Text, In); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); return j!=-1 && i==j; } function string GetColorString(int Num) { switch(Num) { case 0:return "#ffffff"; case 1:return "#000000"; case 2:return "#0000ff"; case 3:return "#00ff00"; case 4:return "#ff0000"; case 5:return "#7f0000"; case 6:return "#7f007f"; case 7:return "#ff7f00"; case 8:return "#ffff00"; case 9:return "#00ff00"; case 10:return "#00ffff"; case 11:return "#00ffff"; case 12:return "#0000ff"; case 13:return "#ff00ff"; case 13:return "#ff00ff"; case 14:return "#7f7f7f"; case 15:return "#c0c0c0"; } return ""; } z} I`K TQ zOP:!<%&pp*** Pb ^ .U^  JchMHma0fw0fw.'lo /T20fwP"}S~Szzt9//============================================================================= // UBrowserBufferedTcpLink //============================================================================= class UBrowserBufferedTcpLink extends TcpLink; var string InputBuffer; var string OutputBuffer; var string CRLF; var string CR; var string LF; var bool bWaiting; var float WaitTimeoutTime; var string WaitingFor; var int WaitForCountChars; // if we're waiting for X bytes var string WaitResult; var int WaitMatchData; function ResetBuffer() { InputBuffer = ""; OutputBuffer = ""; bWaiting = False; CRLF = Chr(10)$Chr(13); CR = Chr(13); LF = Chr(10); } function WaitFor(string What, float TimeOut, int MatchData) { bWaiting = True; WaitingFor = What; WaitForCountChars = 0; WaitTimeoutTime = Level.TimeSeconds + TimeOut; WaitMatchData = MatchData; WaitResult = ""; } function WaitForCount(int Count, float TimeOut, int MatchData) { bWaiting = True; WaitingFor = ""; WaitForCountChars = Count; WaitTimeoutTime = Level.TimeSeconds + TimeOut; WaitMatchData = MatchData; WaitResult = ""; } function GotMatch(int MatchData) { // called when a match happens } function GotMatchTimeout(int MatchData) { // when a match times out } function string ParseDelimited(string Text, string Delimiter, int Count, optional bool bToEndOfLine) { local string Result; local int Found, i; local string s; Result = ""; Found = 1; for(i=0;i= Count) Result = Result $ s; } } return Result; } // Read an individual character, returns 0 if no characters waiting function int ReadChar() { local int c; if(InputBuffer == "") return 0; c = Asc(Left(InputBuffer, 1)); InputBuffer = Mid(InputBuffer, 1); return c; } // Take a look at the next waiting character, return 0 if no characters waiting function int PeekChar() { local int c; if(InputBuffer == "") return 0; return Asc(Left(InputBuffer, 1)); } function bool ReadBufferedLine(out string Text) { local int i; i = InStr(InputBuffer, Chr(13)); if(i == -1) return False; Text = Left(InputBuffer, i); if(Mid(InputBuffer, i+1, 1) == Chr(10)) i++; InputBuffer = Mid(InputBuffer, i+1); return True; } function SendBufferedData(string Text) { OutputBuffer = OutputBuffer $ Text; } event ReceivedText(string Text) { InputBuffer = InputBuffer $ Text; } // DoQueueIO is intended to be called from Tick(); function DoBufferQueueIO() { local int i; while(bWaiting) { if(Level.TimeSeconds > WaitTimeoutTime) { bWaiting = False; GotMatchTimeout(WaitMatchData); } if(WaitForCountChars > 0) { if(Len(InputBuffer) < WaitForCountChars) break; WaitResult = Left(InputBuffer, WaitForCountChars); InputBuffer = Mid(InputBuffer, WaitForCountChars); bWaiting = False; GotMatch(WaitMatchData); } else { i = InStr(InputBuffer, WaitingFor); if(i == -1 && WaitingFor == CR) i = InStr(InputBuffer, LF); if(i != -1) { WaitResult = Left(InputBuffer, i + Len(WaitingFor)); InputBuffer = Mid(InputBuffer, i + Len(WaitingFor)); bWaiting = False; GotMatch(WaitMatchData); } else break; } } if(IsConnected()) { i = SendText(OutputBuffer); OutputBuffer = Mid(OutputBuffer, i); } } zGUS Z|S,/me TgHS,g(tUS,zS&/g S{SUgHSg(wUS z]E5p W5E-F z@//============================================================================= // UBrowserRulesList - The rules returned by the server //============================================================================= class UBrowserRulesList extends UWindowList; var string Rule; var string Value; // Sentinel only var int SortColumn; var bool bDescending; function SortByColumn(int Column) { if(SortColumn == Column) { bDescending = !bDescending; } else { SortColumn = Column; bDescending = False; } Sort(); } function int Compare(UWindowList T, UWindowList B) { local int Result; local UBrowserRulesList RT, RB; if(B == None) return -1; if(UBrowserRulesList(T).Rule < UBrowserRulesList(B).Rule) Result = -1; else Result = 1; if(UBrowserRulesList(Sentinel).bDescending) Result = -Result; return Result; } zSH9| W9H-I zTKx3Z}w|D Z&pw C JD Z&aTKaa~a:GHaC w zVM\$^6MP%\P, 6ME PhMREPORTQUERYP z~class UBrowserBrowserButton extends UWindowButton; var string LogoNames[30]; var Texture LogoImages[30]; var int LogoCount; var string ClickURL; var int CurrentFrame; var float CurrentTime; var bool bSpin; function Created() { local int i; bNoKeyboard = True; bStretched = True; if(ClickURL != "") Cursor = Root.HandCursor; Super.Created(); for(i=0;i 0.03333) { UpTexture = LogoImages[CurrentFrame]; OverTexture = UpTexture; DownTexture = UpTexture; CurrentFrame++; if(CurrentFrame >= LogoCount) CurrentFrame = 0; CurrentTime = 0; } } else { UpTexture = LogoImages[0]; OverTexture = UpTexture; DownTexture = UpTexture; } } function Click(float X, float Y) { if(ClickURL != "") GetPlayerOwner().ConsoleCommand("start "$ClickURL); Super.Click(X, Y); } zX/pG ' zzzGWQYQR%G: (UBrowserLocalLink: Could not bind to a free port. \ z#{8-#*%w4*4a4* zYi D!# i-GM zzz_g K%(%ppp<g > h  zsBKk 2%'ppp*** B : C zZDBK42a M44 ~![,4-O-D4-c-A4-N- -T' zHKc  @Hc d e E < zn[`HB?D?,?D?,, zik C b$?m'(,m('PwG*GCk l k l  z^sW R42a M44 ~!T,-T' zbdb` ;4a4*-T(AACA zzzc_k~ 64-T w4*4-cc('(' zeTcu w4*4a4*-T(-S-| -d'R.-L -S<wR*wR#*R#-A wR#*R#vccwR*wR#*wRR#Unsorted PingDone lost as it's not in ping list!w*.-\'-TJ-} wR*`R#`-x`-{'`-A -TRD-T-L  zt$class UBrowserUpdateServerWindow expands UWindowPageWindow; var UBrowserUpdateServerLink Link; var UBrowserUpdateServerTextArea TextArea; var localized string QueryText; var localized string FailureText; var class LinkClass; var class TextAreaClass; var bool bGotMOTD; var string StatusBarText; var bool bHadInitialQuery; var int Tries; var int NumTries; function Created() { Super.Created(); TextArea = UBrowserUpdateServerTextArea(CreateControl(TextAreaClass, 0, 0, WinWidth, WinHeight, Self)); SetAcceptsFocus(); } function Query() { bHadInitialQuery = True; StatusBarText = QueryText; if(Link != None) { Link.UpdateWindow = None; Link.Destroy(); } Link = GetEntryLevel().Spawn(LinkClass); Link.UpdateWindow = Self; Link.QueryUpdateServer(); bGotMOTD = False; } function BeforePaint(Canvas C, float X, float Y) { local UBrowserMainWindow W; if(!bHadInitialQuery) Query(); Super.BeforePaint(C, X, Y); TextArea.SetSize(WinWidth, WinHeight); W = UBrowserMainWindow(GetParent(class'UBrowserMainWindow')); if(StatusBarText == "") W.DefaultStatusBarText(TextArea.StatusURL); else W.DefaultStatusBarText(StatusBarText); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function SetMOTD(string MOTD) { TextArea.SetHTML(MOTD); } function SetMasterServer(string Value) { ReplaceText(Value, Chr(10), ""); if(Value != "") UBrowserMainClientWindow(UBrowserMainWindow(GetParent(class'UBrowserMainWindow')).ClientArea).NewMasterServer(Value); } function SetIRCServer(string Value) { StripCRLF(Value); if(Value != "") UBrowserMainClientWindow(UBrowserMainWindow(GetParent(class'UBrowserMainWindow')).ClientArea).NewIRCServer(Value); } function Failure() { Link.UpdateWindow = None; Link.Destroy(); Link = None; Tries++; if(Tries < NumTries) { Query(); return; } StatusBarText = FailureText; Tries = 0; } function Success() { StatusBarText = ""; Link.UpdateWindow = None; Link.Destroy(); Link = None; Tries = 0; } function KeyDown(int Key, float X, float Y) { switch(Key) { case 0x74: // IK_F5; TextArea.Clear(); Query(); break; } } zj zu zFze rz* m'?-b EzqDEGppb - E=zs z|aa0Gn_.0 0a` @ _ @ a`_aa` z\class UBrowserUpdateServerTextArea expands UWindowHTMLTextArea; var string StatusURL; function LaunchUnrealURL(string URL) { Super.LaunchUnrealURL(URL); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } function BeforePaint(Canvas C, float X, float Y) { StatusURL = ""; Super.BeforePaint(C, X, Y); } function OverURL(string URL) { StatusURL = URL; } U@flBLTx<+o ]RotatingU.u_a00RotatingU.u_a01RotatingU.u_a02RotatingU.u_a03RotatingU.u_a04RotatingU.u_a05RotatingU.u_a06RotatingU.u_a07RotatingU.u_a08 RotatingU.u_a09 RotatingU.u_a10 RotatingU.u_a11 RotatingU.u_a12 RotatingU.u_a13RotatingU.u_a14RotatingU.u_a15RotatingU.u_a16RotatingU.u_a17RotatingU.u_a18RotatingU.u_a19RotatingU.u_a20RotatingU.u_a21RotatingU.u_a22RotatingU.u_a23RotatingU.u_a24RotatingU.u_a25RotatingU.u_a26RotatingU.u_a27RotatingU.u_a28RotatingU.u_a29Z"x]! http://www.unrealtournament.comzzf}Jr}. .#[pw}*}gq}. }0 zsclass UBrowserUpdateServerLink expands UBrowserHTTPClient; var config string UpdateServerAddress; var config int UpdateServerPort; var config int UpdateServerTimeout; var string URIs[10]; var int CurrentURI; var int MaxURI; var UBrowserUpdateServerWindow UpdateWindow; const GetMOTD = 3; const GetFallback = 2; const GetMaster = 1; const GetIRC = 0; function QueryUpdateServer() { SetupURIs(); CurrentURI = MaxURI; BrowseCurrentURI(); } function SetupURIs() { MaxURI = 3; URIs[3] = "/UpdateServer/motd"$Level.EngineVersion$".html"; URIs[2] = "/UpdateServer/motdfallback.html"; URIs[1] = "/UpdateServer/masterserver.txt"; URIs[0] = "/UpdateServer/ircserver.txt"; } function BrowseCurrentURI() { Browse(UpdateServerAddress, URIs[CurrentURI], UpdateServerPort, UpdateServerTimeout); } function Failure() { UpdateWindow.Failure(); } function Success() { UpdateWindow.Success(); } function ProcessData(string Data) { switch(CurrentURI) { case GetMOTD: case GetFallback: UpdateWindow.SetMOTD(Data); break; case GetMaster: UpdateWindow.SetMasterServer(Data); break; case GetIRC: UpdateWindow.SetIRCServer(Data); break; } } ////////////////////////////////////////////////////////////////// // HTTPClient functions ////////////////////////////////////////////////////////////////// function HTTPError(int ErrorCode) { if(ErrorCode == 404 && CurrentURI == GetMOTD) { CurrentURI = GetFallback; BrowseCurrentURI(); } else Failure(); } function HTTPReceivedData(string Data) { ProcessData(Data); if(CurrentURI == MaxURI) CurrentURI--; if(CurrentURI == 0) Success(); else { CurrentURI--; BrowseCurrentURI(); } } zmVIMV.KwV*V&<FV.V zbclass UBrowserSupersetList expands UWindowList; var UBrowserServerListWindow SupersetWindow; zoHg-T(x.rwx*x-T(x-S(x-d(x.xD-H-{  zhg ) j g g  zrn'y  + zpclass UBrowserSubsetList expands UWindowList; var UBrowserSubsetFact SubsetFactory; var bool bOldElement; zqK D:mkNw#*)#mno%-s'K.wK*K-d-s(K-ToK.Km-s w#*-T(#qomK.wK*K-TK-d-K K-X omoKB-K (-GomK.K zja<~http://www.unreal://ftp://ftp.telnet://-{,-~,-~-{(-[, -[-{(-~(-Q,G-Q-{(-~(-[(-K,-K-{(-~(-[(-Q(%-K-{-[-Q&b-~&C}9~,0123456789&C_}~ ,,,, F-~&TzI:a%a$Ca$~,LwJLwJvwJ&zLL#ffffffzvppCpppp-Kj:O%uO=:$:O-{:n%n=:$:nE-[:n%n$:O%O$::a%a$-Ql:a%a=:$:apppp zy"d)-'-'C$ zMclass UBrowserScreenshotCW expands UWindowClientWindow; var Texture Screenshot; var string MapName; function Paint(Canvas C, float MouseX, float MouseY) { local float X, Y, W, H; local int i; local string M; local UBrowserServerList L; L = UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server; if( L != None ) { M = L.MapName; if( M != MapName ) { MapName = M; if( MapName == "" ) ScreenShot = None; else { i = InStr(Caps(MapName), ".UNR"); if(i != -1) MapName = Left(MapName, i); Screenshot = Texture(DynamicLoadObject(MapName$".Screenshot", class'Texture')); } } } else { ScreenShot = None; MapName = ""; } DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); if(Screenshot != None) { W = Min(WinWidth, Screenshot.USize); H = Min(WinHeight, Screenshot.VSize); if(W > H) W = H; if(H > W) H = W; X = (WinWidth - W) / 2; Y = (WinHeight - H) / 2; DrawStretchedTexture(C, X, Y, W, H, Screenshot); } } z] //============================================================================= // UBrowserToolbar - the toolbar! //============================================================================= class UBrowserBannerBar extends UWindowWindow; var UBrowserBannerAd BannerAdWindow; function Paint(Canvas C, float X, float Y) { C.Style = GetPlayerOwner().ERenderStyle.STY_Modulated; Tile(C, Texture'Background'); C.Style = GetPlayerOwner().ERenderStyle.STY_Normal; } function Created() { Super.Created(); BannerAdWindow = UBrowserBannerAd(CreateWindow(class'UBrowserBannerAd', 0, 2, 256, 64)); } function BeforePaint(Canvas C, float X, float Y) { BannerAdWindow.WinLeft = (WinWidth - 256) / 2; } zz(class UBrowserSubsetFact extends UBrowserServerListFactory; // Config var() config string GameMode; var() config string GameType; var() config float Ping; var() config name SupersetTag; var() config bool bLocalServersOnly; var() config bool bCompatibleServersOnly; var() config int MinPlayers; var() config int MaxPing; // Errors var localized string NotFoundError; var localized string NotReadyError; var UBrowserServerListWindow SupersetWindow; function Query(optional bool bBySuperset, optional bool bInitial) { local UBrowserMainClientWindow W; local int i; local UBrowserServerList l, List; Super.Query(bBySuperset, bInitial); W = UBrowserMainClientWindow(Owner.Owner.GetParent(class'UBrowserMainClientWindow')); for(i=0;i<20;i++) { if(W.ServerListNames[i] == SupersetTag) { SupersetWindow = W.FactoryWindows[i]; List = W.FactoryWindows[i].PingedList; break; } } if(SupersetWindow != None) { SupersetWindow.AddSubset(Self); Owner.Owner.AddSuperSet(SupersetWindow); } else { QueryFinished(False, NotFoundError$SupersetTag); } if(List == None) { QueryFinished(False, NotReadyError$SupersetTag); } else { if(!bBySuperset && !bInitial) { List.Owner.Refresh(); return; } for(l = UBrowserServerList(List.Next);l != None;l = UBrowserServerList(l.Next)) ConsiderItem(l); QueryFinished(True); } } function Shutdown(optional bool bBySuperset) { Super.Shutdown(bBySuperset); SupersetWindow.RemoveSubset(Self); } function ConsiderItem(UBrowserServerList L) { local UBrowserServerList NewItem; local int MinNetVer; local int GameVer; if(!L.bPinged) return; if(bLocalServersOnly && !L.bLocalServer) return; MinNetVer = int(Owner.Owner.GetPlayerOwner().Level.MinNetVersion); GameVer = int(Owner.Owner.GetPlayerOwner().Level.EngineVersion); if(bCompatibleServersOnly && (L.MinNetVer > GameVer || MinNetVer > L.GameVer)) return; if(GameMode != "" && GameMode != L.GameMode) return; if(GameType != "" && GameType != L.GameType) return; if(MinPlayers != 0 && L.NumPlayers < MinPlayers) return; if(MaxPing != 0 && L.Ping > MaxPing) return; if( PingedList.FindExistingServer( L.IP, L.QueryPort ) != None) return; NewItem = UBrowserServerList(Owner.CopyExistingListItem(L.Class, L)); NewItem.Remove(); PingedList.AppendItem(NewItem); Owner.bNeedUpdateCount = True; } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Super.QueryFinished(bSuccess, ErrorMsg); } zusBxtw*]z.9s._r. * zwt ..zj t r q  z|z sZW lz  zzzg//============================================================================= // UBrowserServerPing: Query an Unreal server for its details //============================================================================= class UBrowserServerPing extends UdpLink; var UBrowserServerList Server; var IpAddr ServerIPAddr; var float RequestSentTime; var float LastDelta; var name QueryState; var bool bInitial; var bool bJustThisServer; var bool bNoSort; var int PingAttempts; var int AttemptNumber; var int BindAttempts; var localized string AdminEmailText; var localized string AdminNameText; var localized string ChangeLevelsText; var localized string MultiplayerBotsText; var localized string FragLimitText; var localized string TimeLimitText; var localized string GameModeText; var localized string GameTypeText; var localized string GameVersionText; var localized string WorldLogText; var localized string MutatorsText; var localized string TrueString; var localized string FalseString; var localized string ServerAddressText; var localized string GoalTeamScoreText; var localized string MinPlayersText; var localized string PlayersText; var localized string MaxTeamsText; var localized string BalanceTeamsText; var localized string PlayersBalanceTeamsText; var localized string FriendlyFireText; var localized string MinNetVersionText; var localized string BotSkillText; var localized string TournamentText; var localized string ServerModeText; var localized string DedicatedText; var localized string NonDedicatedText; var localized string WorldLogWorkingText; var localized string WorldLogWorkingTrue; var localized string WorldLogWorkingFalse; var localized string PasswordText; // config var config int MaxBindAttempts; var config int BindRetryTime; var config int PingTimeout; var config bool bUseMapName; function ValidateServer() { if(Server.ServerPing != Self) { Log("ORPHANED: "$Self); Destroy(); } } function StartQuery(name S, int InPingAttempts) { QueryState = S; ValidateServer(); ServerIPAddr.Port = Server.QueryPort; GotoState('Resolving'); PingAttempts=InPingAttempts; AttemptNumber=1; } function Resolved( IpAddr Addr ) { ServerIPAddr.Addr = Addr.Addr; GotoState('Binding'); } function bool GetNextValue(string In, out string Out, out string Result) { local int i; local bool bFoundStart; Result = ""; bFoundStart = False; for(i=0;i= 406 ) { if( Value ~= "True" ) AddRule(WorldLogWorkingText, WorldLogWorkingTrue); else AddRule(WorldLogWorkingText, WorldLogWorkingFalse); } else AddRule(WorldLogText, LocalizeBoolValue(Value)); } else if(Value ~= "mutators") { bOK = GetNextValue(In, Out, Value); AddRule(MutatorsText, Value); } else if(Value ~= "goalteamscore") { bOK = GetNextValue(In, Out, Value); AddRule(GoalTeamScoreText, Value); } else if(Value ~= "minplayers") { bOK = GetNextValue(In, Out, Value); if(Value == "0") AddRule(MultiplayerBotsText, FalseString); else AddRule(MinPlayersText, Value@PlayersText); } else if(Value ~= "changelevels") { bOK = GetNextValue(In, Out, Value); AddRule(ChangeLevelsText, LocalizeBoolValue(Value)); } else if(Value ~= "botskill") { bOK = GetNextValue(In, Out, Value); AddRule(BotSkillText, Value); } else if(Value ~= "maxteams") { bOK = GetNextValue(In, Out, Value); AddRule(MaxTeamsText, Value); } else if(Value ~= "balanceteams") { bOK = GetNextValue(In, Out, Value); AddRule(BalanceTeamsText, LocalizeBoolValue(Value)); } else if(Value ~= "playersbalanceteams") { bOK = GetNextValue(In, Out, Value); AddRule(PlayersBalanceTeamsText, LocalizeBoolValue(Value)); } else if(Value ~= "friendlyfire") { bOK = GetNextValue(In, Out, Value); AddRule(FriendlyFireText, Value); } else if(Value ~= "gamestyle") { bOK = GetNextValue(In, Out, Value); AddRule(GameModeText, Value); } else if(Value ~= "tournament") { bOK = GetNextValue(In, Out, Value); AddRule(TournamentText, LocalizeBoolValue(Value)); } else if(Value ~= "listenserver") { bOK = GetNextValue(In, Out, Value); if(bool(Value)) AddRule(ServerModeText, NonDedicatedText); else AddRule(ServerModeText, DedicatedText); } else if(Value ~= "password") { bOK = GetNextValue(In, Out, Value); AddRule(PasswordText, LocalizeBoolValue(Value)); } } until(!bOK); } event Timer() { if(AttemptNumber < PingAttempts) { Log("Timed out getting player replies. Attempt "$AttemptNumber); AttemptNumber++; GotoState(QueryState); } else { Server.StatusDone(False); Log("Timed out getting player replies. Giving Up"); } } Begin: // Player info ValidateServer(); if(Server.PlayerList != None) { Server.PlayerList.DestroyList(); } Server.PlayerList = New(None) class'UBrowserPlayerList'; Server.PlayerList.SetupSentinel(); if(Server.RulesList != None) { Server.RulesList.DestroyList(); } Server.RulesList = New(None) class'UBrowserRulesList'; Server.RulesList.SetupSentinel(); AddRule(ServerAddressText, "unreal://"$Server.IP$":"$string(Server.GamePort)); SendText( ServerIPAddr, "\\status\\" ); SetTimer(PingTimeout + FRand(), False); } function string ParseReply(string Text, string Key) { local int i; local string Temp; i=InStr(Text, "\\"$Key$"\\"); Temp = Mid(Text, i + Len(Key) + 2); return Left(Temp, InStr(Temp, "\\")); } state GetInfo { event ReceivedText(IpAddr Addr, string Text) { local string Temp; local float ElapsedTime; // Make sure this packet really is for us. Temp = IpAddrToString(Addr); if(Server.IP != Left(Temp, InStr(Temp, ":"))) return; ValidateServer(); ElapsedTime = (Level.TimeSeconds - RequestSentTime) * Level.TimeDilation; Server.Ping = Max(1000*ElapsedTime - (0.5*LastDelta) - 10, 4); // subtract avg client and server frametime from ping. if(!Server.bKeepDescription) Server.HostName = Server.IP; Server.GamePort = 0; Server.MapName = ""; Server.MapTitle = ""; Server.MapDisplayName = ""; Server.GameType = ""; Server.GameMode = ""; Server.NumPlayers = 0; Server.MaxPlayers = 0; Server.GameVer = 0; Server.MinNetVer = 0; Temp = ParseReply(Text, "hostname"); if(Temp != "" && !Server.bKeepDescription) Server.HostName = Temp; Temp = ParseReply(Text, "hostport"); if(Temp != "") Server.GamePort = Int(Temp); Temp = ParseReply(Text, "mapname"); if(Temp != "") Server.MapName = Temp; Temp = ParseReply(Text, "maptitle"); if(Temp != "") { Server.MapTitle = Temp; Server.MapDisplayName = Server.MapTitle; if(Server.MapTitle == "" || Server.MapTitle ~= "Untitled" || bUseMapName) Server.MapDisplayName = Server.MapName; } Temp = ParseReply(Text, "gametype"); if(Temp != "") Server.GameType = Temp; Temp = ParseReply(Text, "numplayers"); if(Temp != "") Server.NumPlayers = Int(Temp); Temp = ParseReply(Text, "maxplayers"); if(Temp != "") Server.MaxPlayers = Int(Temp); Temp = ParseReply(Text, "gamemode"); if(Temp != "") Server.GameMode = Temp; Temp = ParseReply(Text, "gamever"); if(Temp != "") Server.GameVer = Int(Temp); Temp = ParseReply(Text, "minnetver"); if(Temp != "") Server.MinNetVer = Int(Temp); if( Server.DecodeServerProperties(Text) ) { Server.PingDone(bInitial, bJustThisServer, True, bNoSort); Disable('Tick'); } } event Tick(Float DeltaTime) { LastDelta = DeltaTime; } event Timer() { ValidateServer(); if(AttemptNumber < PingAttempts) { Log("Ping Timeout from "$Server.IP$". Attempt "$AttemptNumber); AttemptNumber++; GotoState(QueryState); } else { Log("Ping Timeout from "$Server.IP$" Giving Up"); Server.Ping = 9999; Server.GamePort = 0; Server.MapName = ""; Server.MapDisplayName = ""; Server.MapTitle = ""; Server.GameType = ""; Server.GameMode = ""; Server.NumPlayers = 0; Server.MaxPlayers = 0; Disable('Tick'); Server.PingDone(bInitial, bJustThisServer, False, bNoSort); } } Begin: Enable('Tick'); SendText( ServerIPAddr, "\\info\\" ); RequestSentTime = Level.TimeSeconds; SetTimer(PingTimeout + FRand(), False); } state Resolving { Begin: Resolve( Server.IP ); } z{A2  .# zzz@uBi7.u;7-v.;-v79.;97_.;_7&.;&7=.;=7F.;F7P.;P7R.;R7l.;l7P.;P7_.;_7N.;N7c.;c7k.;k7C.;C7].;]7-B.;-B7 zG}V4Z|V,/me \KHV,K(tQV,zV&/K V{VKKHVK(wQV zHV GNE%&pp*** V { Q.W lV  z7zzE //============================================================================= // UBrowserBannerAd //============================================================================= class UBrowserBannerAd extends UWindowWindow; #exec TEXTURE IMPORT NAME=BannerAd FILE=Textures\logo3.pcx GROUP="Icons" FLAGS=2 MIPS=OFF var string URL; function Created() { URL = "http://www.unreal.com"; Cursor = Root.HandCursor; } function Paint(Canvas C, float X, float Y) { DrawClippedTexture(C, 0, 0, Texture'BannerAd'); } function Click(float X, float Y) { Root.Console.ViewPort.Actor.ConsoleCommand("start "$URL); } function MouseLeave() { Super.MouseLeave(); ToolTip(""); } function MouseEnter() { Super.MouseLeave(); ToolTip(URL); } zBv J)D.#SJ.v .s  zCQ HHUE%&pp*** Q z Q.W LQ  z|q62$-h 70-q zzzGZv/#Z.-\' zLM@>G' 2zG' M%xM, n|MMG' @MM9-C ' SG', 'B.'M%M, kwB*MMBB.ByMMMb'Y . @G zKg7.4g.2wg*g-\' z\//============================================================================= // UBrowserServerGrid - base class for server listings //============================================================================= class UBrowserServerGrid extends UWindowGrid; #exec TEXTURE IMPORT NAME=Highlight FILE=Textures\Highlight.bmp GROUP="Icons" FLAGS=2 MIPS=OFF var UBrowserRightClickMenu Menu; var UWindowGridColumn Server, Ping, MapName, Players, SortByColumn; var bool bSortDescending; var localized string ServerName, PingName, MapNameName, PlayersName; var UBrowserServerList SelectedServer; var int Count; var float TimePassed; var int AutoPingInterval; var UBrowserServerList OldPingServer; function Created() { Super.Created(); RowHeight = 12; CreateColumns(); Menu = UBrowserRightClickMenu(Root.CreateWindow(UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).RightClickMenuClass, 0, 0, 100, 100, Self)); Menu.HideWindow(); } function Close(optional bool bByParent) { Super.Close(bByParent); if(Menu != None && Menu.bWindowVisible) Menu.CloseUp(); } function CreateColumns() { Server = AddColumn(ServerName, 300); Ping = AddColumn(PingName, 30); MapName = AddColumn(MapNameName, 100); Players = AddColumn(PlayersName, 50); SortByColumn = Ping; } function DrawCell(Canvas C, float X, float Y, UWindowGridColumn Column, UBrowserServerList List) { switch(Column) { case Server: Column.ClipText( C, X, Y, List.HostName ); break; case Ping: Column.ClipText( C, X, Y, Int(List.Ping) ); break; case MapName: Column.ClipText( C, X, Y, List.MapDisplayName ); break; case Players: Column.ClipText( C, X, Y, List.NumPlayers$"/"$List.MaxPlayers ); break; } } function PaintColumn(Canvas C, UWindowGridColumn Column, float MouseX, float MouseY) { local UBrowserServerList List; local float Y; local int Visible; local int Skipped; local int TopMargin; local int BottomMargin; C.Font = Root.Fonts[F_Normal]; List = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList; if(List == None) Count = 0; else Count = List.Count(); if(bShowHorizSB) BottomMargin = LookAndFeel.Size_ScrollbarWidth; else BottomMargin = 0; TopMargin = LookAndFeel.ColumnHeadingHeight; Visible = int((WinHeight - (TopMargin + BottomMargin))/RowHeight); VertSB.SetRange(0, Count+1, Visible); TopRow = VertSB.Pos; Skipped = 0; List = UBrowserServerList(List.Next); if(List != None) { Y = 1; while((Y < RowHeight + WinHeight - RowHeight - (TopMargin + BottomMargin)) && (List != None)) { // FIXME: make more efficient - cache top server in list if TopRow doesn't change if(Skipped >= VertSB.Pos) { // Draw highlight if(List == SelectedServer) Column.DrawStretchedTexture( C, 0, Y-1 + TopMargin, Column.WinWidth, RowHeight + 1, Texture'Highlight'); DrawCell(C, 2, Y + TopMargin, Column, List); Y = Y + RowHeight; } Skipped ++; List = UBrowserServerList(List.Next); } } } function SortColumn(UWindowGridColumn Column) { if(SortByColumn == Column) bSortDescending = !bSortDescending; else bSortDescending = False; SortByColumn = Column; UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList.Sort(); } function Tick(float DeltaTime) { local UBrowserServerListWindow W; W = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')); if(W.PingState == PS_Done && SelectedServer == None) { SelectedServer = UBrowserServerList(W.PingedList.Next); if(SelectedServer == None || SelectedServer.bPinging) SelectedServer = None; else UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).AutoInfo(SelectedServer); } if(W.PingState == PS_Done) { if(TimePassed >= AutoPingInterval) { TimePassed = 0; if(SelectedServer != OldPingServer) { if(OldPingServer != None) OldPingServer.CancelPing(); OldPingServer = SelectedServer; } if(SelectedServer != None && !SelectedServer.bPinging) SelectedServer.PingServer(False, True, True); } TimePassed = TimePassed + DeltaTime; } } function SelectRow(int Row) { local UBrowserServerList S; S = GetServerUnderRow(Row); if(SelectedServer != S) { if(S != None) UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).AutoInfo(S); TimePassed = 0; } if(S != None) SelectedServer = S; } function RightClickRow(int Row, float X, float Y) { local float MenuX, MenuY; WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.List = GetServerUnderRow(Row); Menu.Grid = Self; Menu.ShowWindow(); } function UBrowserServerList GetServerUnderRow(int Row) { local int i; local UBrowserServerList List; List = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList; if(List != None) { i = 0; List = UBrowserServerList(List.Next); while(List != None) { if(i == Row) return List; List = UBrowserServerList(List.Next); i++; } } return None; } function int GetSelectedRow() { local int i; local UBrowserServerList List; List = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList; if(List != None) { i = 0; List = UBrowserServerList(List.Next); while(List != None) { if(List == SelectedServer) return i; List = UBrowserServerList(List.Next); i++; } } return -1; } function JoinServer(UBrowserServerList Server) { if(Server != None && Server.GamePort != 0) { GetPlayerOwner().ClientTravel("unreal://"$Server.IP$":"$Server.GamePort$UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).URLAppend, TRAVEL_Absolute, false); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } } function DoubleClickRow(int Row) { local UBrowserServerList Server; Server = GetServerUnderRow(Row); if(SelectedServer != Server) return; JoinServer(Server); } function MouseLeaveColumn(UWindowGridColumn Column) { ToolTip(""); } function KeyDown(int Key, float X, float Y) { switch(Key) { case 0x74: // IK_F5; Refresh(); break; case 0x26: // IK_Up SelectRow(Clamp(GetSelectedRow() - 1, 0, Count - 1)); VertSB.Show(GetSelectedRow()); break; case 0x28: // IK_Down SelectRow(Clamp(GetSelectedRow() + 1, 0, Count - 1)); VertSB.Show(GetSelectedRow()); break; case 0x0D: // IK_Enter: DoubleClickRow(GetSelectedRow()); break; default: Super.KeyDown(Key, X, Y); break; } } function int Compare(UBrowserServerList T, UBrowserServerList B) { switch(SortByColumn) { case Server: return ByName(T, B); case Ping: return ByPing(T, B); case MapName: return ByMap(T, B); case Players: return ByPlayers(T, B); default: return 0; } } function int ByPing(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping < B.Ping) { Result = -1; } else if (T.Ping > B.Ping) { Result = 1; } else { /* if(T.HostName < B.HostName) Result = -1; else if(T.HostName > B.HostName) Result = 1; else */ Result = 0; } if(bSortDescending) Result = -Result; return Result; } function int ByName(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping == 9999) return 1; if(B.Ping == 9999) return -1; if(T.HostName < B.HostName) { Result = -1; } else if (T.HostName > B.HostName) { Result = 1; } else { Result = 0;//T.Ping - B.Ping; } if(bSortDescending) Result = -Result; return Result; } function int ByMap(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping == 9999) return 1; if(B.Ping == 9999) return -1; if(T.MapDisplayName < B.MapDisplayName) { Result = -1; } else if (T.MapDisplayName > B.MapDisplayName) { Result = 1; } else { Result = T.Ping - B.Ping; } if(bSortDescending) Result = -Result; return Result; } function int ByPlayers(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping == 9999) return 1; if(B.Ping == 9999) return -1; if(T.NumPlayers > B.NumPlayers) { Result = -1; } else if (T.NumPlayers < B.NumPlayers) { Result = 1; } else { if (T.MaxPlayers > B.MaxPlayers) { Result = -1; } else if(T.MaxPlayers < B.MaxPlayers) { Result = 1; } else { Result = T.Ping - B.Ping; } } if(bSortDescending) Result = -Result; return Result; } function ShowInfo(UBrowserServerList List) { UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).ShowInfo(List); } function Refresh() { UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).Refresh(); } function RefreshServer() { TimePassed = AutoPingInterval; } function RePing() { UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).RePing(); } zMrHDO %S%N %r.}wr*O SrcN rkr.r% zWclass UBrowserServerListWindow extends UWindowPageWindow PerObjectConfig; var config string ServerListTitle; // Non-localized page title var config string ListFactories[10]; var config string URLAppend; var config int AutoRefreshTime; var config bool bNoAutoSort; var config bool bHidden; var config bool bFallbackFactories; var string ServerListClassName; var class ServerListClass; var UBrowserServerList PingedList; var UBrowserServerList UnpingedList; var UBrowserServerListFactory Factories[10]; var int QueryDone[10]; var UBrowserServerGrid Grid; var string GridClass; var float TimeElapsed; var bool bPingSuspend; var bool bPingResume; var bool bPingResumeIntial; var bool bNoSort; var bool bSuspendPingOnClose; var UBrowserSubsetList SubsetList; var UBrowserSupersetList SupersetList; var class RightClickMenuClass; var bool bShowFailedServers; var bool bHadInitialRefresh; var int FallbackFactory; var UWindowVSplitter VSplitter; var UBrowserInfoWindow InfoWindow; var UBrowserInfoClientWindow InfoClient; var UBrowserServerList InfoItem; var localized string InfoName; const MinHeightForSplitter = 384; var localized string PlayerCountLeader; var localized string ServerCountLeader; // Status info enum EPingState { PS_QueryServer, PS_QueryFailed, PS_Pinging, PS_RePinging, PS_Done }; var localized string PlayerCountName; var localized string ServerCountName; var localized string QueryServerText; var localized string QueryFailedText; var localized string PingingText; var localized string CompleteText; var string ErrorString; var EPingState PingState; function WindowShown() { local UBrowserSupersetList l; Super.WindowShown(); if(VSplitter.bWindowVisible) { if(UWindowVSplitter(InfoClient.ParentWindow) != None) VSplitter.SplitPos = UWindowVSplitter(InfoClient.ParentWindow).SplitPos; InfoClient.SetParent(VSplitter); } InfoClient.Server = InfoItem; if(InfoItem != None) InfoWindow.WindowTitle = InfoName$" - "$InfoItem.HostName; else InfoWindow.WindowTitle = InfoName; ResumePinging(); for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) l.SuperSetWindow.ResumePinging(); } function WindowHidden() { local UBrowserSupersetList l; Super.WindowHidden(); SuspendPinging(); for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) l.SuperSetWindow.SuspendPinging(); } function SuspendPinging() { if(bSuspendPingOnClose) bPingSuspend = True; } function ResumePinging() { if(!bHadInitialRefresh) Refresh(False, True); bPingSuspend = False; if(bPingResume) { bPingResume = False; UnpingedList.PingNext(bPingResumeIntial, bNoSort); } } function Created() { local Class C; ServerListClass = class(DynamicLoadObject(ServerListClassName, class'Class')); C = class(DynamicLoadObject(GridClass, class'Class')); Grid = UBrowserServerGrid(CreateWindow(C, 0, 0, WinWidth, WinHeight)); Grid.SetAcceptsFocus(); SubsetList = new class'UBrowserSubsetList'; SubsetList.SetupSentinel(); SupersetList = new class'UBrowserSupersetList'; SupersetList.SetupSentinel(); VSplitter = UWindowVSplitter(CreateWindow(class'UWindowVSplitter', 0, 0, WinWidth, WinHeight)); VSplitter.SetAcceptsFocus(); VSplitter.MinWinHeight = 60; VSplitter.HideWindow(); InfoWindow = UBrowserMainClientWindow(GetParent(class'UBrowserMainClientWindow')).InfoWindow; InfoClient = UBrowserInfoClientWindow(InfoWindow.ClientArea); if(Root.WinHeight >= MinHeightForSplitter) ShowInfoArea(True, False); } function ShowInfoArea(bool bShow, optional bool bFloating, optional bool bNoActivate) { if(bShow) { if(bFloating) { VSplitter.HideWindow(); VSplitter.TopClientWindow = None; VSplitter.BottomClientWindow = None; InfoClient.SetParent(InfoWindow); Grid.SetParent(Self); Grid.SetSize(WinWidth, WinHeight); if(!InfoWindow.bWindowVisible) InfoWindow.ShowWindow(); if(!bNoActivate) InfoWindow.BringToFront(); } else { InfoWindow.HideWindow(); VSplitter.ShowWindow(); VSplitter.SetSize(WinWidth, WinHeight); Grid.SetParent(VSplitter); InfoClient.SetParent(VSplitter); VSplitter.TopClientWindow = Grid; VSplitter.BottomClientWindow = InfoClient; } } else { InfoWindow.HideWindow(); VSplitter.HideWindow(); VSplitter.TopClientWindow = None; VSplitter.BottomClientWindow = None; InfoClient.SetParent(InfoWindow); Grid.SetParent(Self); Grid.SetSize(WinWidth, WinHeight); } } function AutoInfo(UBrowserServerList I) { if(Root.WinHeight >= MinHeightForSplitter || InfoWindow.bWindowVisible) ShowInfo(I, True); } function ShowInfo(UBrowserServerList I, optional bool bAutoInfo) { if(I == None) return; ShowInfoArea(True, Root.WinHeight < MinHeightForSplitter, bAutoInfo); InfoItem = I; InfoClient.Server = InfoItem; InfoWindow.WindowTitle = InfoName$" - "$InfoItem.HostName; I.ServerStatus(); } function ResolutionChanged(float W, float H) { if(Root.WinHeight >= MinHeightForSplitter) ShowInfoArea(True, False); else ShowInfoArea(False, True); if(InfoWindow != None) InfoWindow.ResolutionChanged(W, H); Super.ResolutionChanged(W, H); } function Resized() { Super.Resized(); if(VSplitter.bWindowVisible) { VSplitter.SetSize(WinWidth, WinHeight); VSplitter.OldWinHeight = VSplitter.WinHeight; VSplitter.SplitPos = VSplitter.WinHeight - Min(VSplitter.WinHeight / 2, 250); } else Grid.SetSize(WinWidth, WinHeight); } function AddSubset(UBrowserSubsetFact Subset) { local UBrowserSubsetList l; for(l = UBrowserSubsetList(SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) if(l.SubsetFactory == Subset) return; l = UBrowserSubsetList(SubsetList.Append(class'UBrowserSubsetList')); l.SubsetFactory = Subset; } function AddSuperSet(UBrowserServerListWindow Superset) { local UBrowserSupersetList l; for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) if(l.SupersetWindow == Superset) return; l = UBrowserSupersetList(SupersetList.Append(class'UBrowserSupersetList')); l.SupersetWindow = Superset; } function RemoveSubset(UBrowserSubsetFact Subset) { local UBrowserSubsetList l; for(l = UBrowserSubsetList(SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) if(l.SubsetFactory == Subset) l.Remove(); } function RemoveSuperset(UBrowserServerListWindow Superset) { local UBrowserSupersetList l; for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) if(l.SupersetWindow == Superset) l.Remove(); } function UBrowserServerList AddFavorite(UBrowserServerList Server) { return UBrowserServerListWindow(UBrowserMainClientWindow(GetParent(class'UBrowserMainClientWindow')).Favorites.Page).AddFavorite(Server); } function Refresh(optional bool bBySuperset, optional bool bInitial, optional bool bSaveExistingList, optional bool bInNoSort) { bHadInitialRefresh = True; if(!bSaveExistingList) { InfoItem = None; InfoClient.Server = None; } if(!bSaveExistingList && PingedList != None) { PingedList.DestroyList(); PingedList = None; Grid.SelectedServer = None; } if(PingedList == None) { PingedList=New ServerListClass; PingedList.Owner = Self; PingedList.SetupSentinel(True); PingedList.bSuspendableSort = True; } else { TagServersAsOld(); } if(UnpingedList != None) UnpingedList.DestroyList(); if(!bSaveExistingList) { UnpingedList = New ServerListClass; UnpingedList.Owner = Self; UnpingedList.SetupSentinel(False); } PingState = PS_QueryServer; ShutdownFactories(bBySuperset); CreateFactories(bSaveExistingList); Query(bBySuperset, bInitial, bInNoSort); if(!bInitial) RefreshSubsets(); } function TagServersAsOld() { local UBrowserServerList l; for(l = UBrowserServerList(PingedList.Next);l != None;l = UBrowserServerList(l.Next)) l.bOldServer = True; } function RemoveOldServers() { local UBrowserServerList l, n; l = UBrowserServerList(PingedList.Next); while(l != None) { n = UBrowserServerList(l.Next); if(l.bOldServer) { if(Grid.SelectedServer == l) Grid.SelectedServer = n; l.Remove(); } l = n; } } function RefreshSubsets() { local UBrowserSubsetList l, NextSubset; for(l = UBrowserSubsetList(SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) l.bOldElement = True; l = UBrowserSubsetList(SubsetList.Next); while(l != None && l.bOldElement) { NextSubset = UBrowserSubsetList(l.Next); l.SubsetFactory.Owner.Owner.Refresh(True); l = NextSubset; } } function RePing() { PingState = PS_RePinging; PingedList.InvalidatePings(); PingedList.PingServers(True, False); } function QueryFinished(UBrowserServerListFactory Fact, bool bSuccess, optional string ErrorMsg) { local int i; local bool bDone; bDone = True; for(i=0;i<10;i++) { if(Factories[i] != None) { if(Factories[i] == Fact) QueryDone[i] = 1; if(QueryDone[i] == 0) bDone = False; } } if(!bSuccess) { PingState = PS_QueryFailed; ErrorString = ErrorMsg; // don't ping and report success if we have no servers. if(bDone && UnpingedList.Count() == 0) { if( bFallbackFactories ) { FallbackFactory++; if( ListFactories[FallbackFactory] != "" ) Refresh(); // try the next fallback master server else FallbackFactory = 0; } return; } } else ErrorString = ""; if(bDone) { RemoveOldServers(); PingState = PS_Pinging; if(!bNoSort && !Fact.bIncrementalPing) PingedList.Sort(); UnpingedList.PingServers(True, bNoSort || Fact.bIncrementalPing); } } function PingFinished() { PingState = PS_Done; } function CreateFactories(bool bUsePingedList) { local int i; for(i=0;i<10;i++) { if(ListFactories[i] == "") break; if(!bFallbackFactories || FallbackFactory == i) { Factories[i] = UBrowserServerListFactory(BuildObjectWithProperties(ListFactories[i])); Factories[i].PingedList = PingedList; Factories[i].UnpingedList = UnpingedList; if(bUsePingedList) Factories[i].Owner = PingedList; else Factories[i].Owner = UnpingedList; } QueryDone[i] = 0; } } function ShutdownFactories(optional bool bBySuperset) { local int i; for(i=0;i<10;i++) { if(Factories[i] != None) { Factories[i].Shutdown(bBySuperset); Factories[i] = None; } } } function Query(optional bool bBySuperset, optional bool bInitial, optional bool bInNoSort) { local int i; bNoSort = bInNoSort; // Query all our factories for(i=0;i<10;i++) { if(Factories[i] != None) Factories[i].Query(bBySuperset, bInitial); } } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function Tick(float Delta) { PingedList.Tick(Delta); if(PingedList.bNeedUpdateCount) { PingedList.UpdateServerCount(); PingedList.bNeedUpdateCount = False; } // AutoRefresh local servers if(AutoRefreshTime > 0) { TimeElapsed += Delta; if(TimeElapsed > AutoRefreshTime) { TimeElapsed = 0; Refresh(,,True, bNoAutoSort); } } } function BeforePaint(Canvas C, float X, float Y) { local UBrowserMainWindow W; local UBrowserSupersetList l; local EPingState P; local int PercentComplete; local int TotalReturnedServers; local string E; local int TotalServers; local int PingedServers; local int MyServers; Super.BeforePaint(C, X, Y); W = UBrowserMainWindow(GetParent(class'UBrowserMainWindow')); l = UBrowserSupersetList(SupersetList.Next); if(l != None && PingState != PS_RePinging) { P = l.SupersetWindow.PingState; PingState = P; if(P == PS_QueryServer) TotalReturnedServers = l.SupersetWindow.UnpingedList.Count(); PingedServers = l.SupersetWindow.PingedList.Count(); TotalServers = l.SupersetWindow.UnpingedList.Count() + PingedServers; MyServers = PingedList.Count(); E = l.SupersetWindow.ErrorString; } else { P = PingState; if(P == PS_QueryServer) TotalReturnedServers = UnpingedList.Count(); PingedServers = PingedList.Count(); TotalServers = UnpingedList.Count() + PingedServers; MyServers = PingedList.Count(); E = ErrorString; } if(TotalServers > 0) PercentComplete = PingedServers*100.0/TotalServers; switch(P) { case PS_QueryServer: if(TotalReturnedServers > 0) W.DefaultStatusBarText(QueryServerText$" ("$ServerCountLeader$TotalReturnedServers$" "$ServerCountName$")"); else W.DefaultStatusBarText(QueryServerText); break; case PS_QueryFailed: W.DefaultStatusBarText(QueryFailedText$E); break; case PS_Pinging: case PS_RePinging: W.DefaultStatusBarText(PingingText$" "$PercentComplete$"% "$CompleteText$". "$ServerCountLeader$MyServers$" "$ServerCountName$", "$PlayerCountLeader$PingedList.TotalPlayers$" "$PlayerCountName); break; case PS_Done: W.DefaultStatusBarText(ServerCountLeader$MyServers$" "$ServerCountName$", "$PlayerCountLeader$PingedList.TotalPlayers$" "$PlayerCountName); break; } } zORFR< ' zS@zzzz}//============================================================================= // UBrowserServerListFactory // An abstract class to add servers to an existing server list. // eg GameSpy, HTTP master servers, favorites list, etc //============================================================================= class UBrowserServerListFactory extends UWindowList abstract; var UBrowserServerList PingedList; var UBrowserServerList UnpingedList; var UBrowserServerList Owner; var bool bIncrementalPing; // Servers are pinged as they come in function Query(optional bool bBySuperset, optional bool bInitial) { } function Shutdown(optional bool bBySuperset) { Owner = None; PingedList = None; UnpingedList = None; } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Owner.QueryFinished(Self, bSuccess, ErrorMsg); } function UBrowserServerList FoundServer(string IP, int QueryPort, string Category, string GameName, optional string HostName) { local UBrowserServerList NewListEntry; NewListEntry = Owner.FindExistingServer(IP, QueryPort); // Don't add if it's already in the existing list if(NewListEntry == None) { // Add it to the server list(s) NewListEntry = UBrowserServerList(Owner.CreateItem(Owner.Class)); NewListEntry.IP = IP; NewListEntry.QueryPort = QueryPort; NewListEntry.Ping = 9999; if(HostName != "") NewListEntry.HostName = HostName; else NewListEntry.HostName = IP; NewListEntry.Category = Category; NewListEntry.GameName = GameName; NewListEntry.bLocalServer = False; Owner.AppendItem(NewListEntry); } NewListEntry.bOldServer = False; return NewListEntry; } function PlayerPawn GetPlayerOwner() { return Owner.GetPlayerOwner(); } z} U`g? l zzQ @zzW@zz@zzzzi@zz^@zzDzz@zzZzzb@zzc@zzf@zzd@zz_@zza@zzs@zzvzzzz9@zz~@zzu@zz|@zzt@zz}@zzzzBzzGzzz z@zzzzzz@zz@zz@zzJzzzzzE@zzF@zz@zzUzzzzH@zzAzz@zz{zzP@zzL@zzM@zz~zzNO{;"8~O6w~*~5M-P zAC~J--}CzBJj-y?DB?,y?DB?,y@rz*|CyGz%A%AK@p@ A|CyGp@z zPI{v W{I-H z@@ ` @ @@@`@@@@@` `@``````` @` @` @` @`@ @@@`@@@@@ @ @@ @` @ @ @ @ @@@ @@@@@`@@@@@@@@@@`@ `@@`@``@`@`@`@`@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@@ @@@`@@@@@ @` @ ` @ @@@`@@@@@` `@``````` @` @`ࠀ @` @` @` @ ` @ @@@`@@@@@` `@``````` @` @` @`zyzz@J@=*"6+'/%$WKA2'4(6)M;&8+>.k\HC17(-"L9WA!4&F3J5A.iEkO!;+3% P9W>[l-wX<+ J5cEE0 bk]lKYvQ }V hG K3cCߞݗܔېڎ֊Ձ~ttf\b_[[VQRQOMNLMKLJեE٧FGH߬FޫEۨBܩCգ@ڧAإ?բ<֣=4ԡ;Ӡ:Н7Ϝ6̙3͚4Ò0ʗ1,ǔ.đ+Ð*)&&&#%$~ "#"|tpS; u~}~XaD zhZ? wtn qOZ>p q j _nKYcn\hcDl`A{SgiG0]jdf>*idhwPag4#M4Q7U9Y<\>`AcCfEiGnJpLsMuNyQzR|SUX[]_bef)fF9'C.I2rN 0 / ) . 4 3 4  *.- )0 - , & 1 2 0+4. .3-(%,""9*)($,&84A$ & $/)1""$"*"&&!zDN{h:H{&NFw{*{-x-L C{ HHG~ GDGAGIH'GOGJGW GLGD Gg JAJG G| GcGGG~H3GnII G\G}GXGCGhGCG|AL Cg IQGy IQGE G[GIG{GY Gq AFJOG} Ar GC G]JGu A2AIV GS Oc AP GZ GX AGl GEIjGSGPIw J@ J~ GlG{ A;GyGtGGIkCdI@Is Gj GDL\ GRG{ G} AGBACOb IFAyGm L] IfA G@A/AI A"Gi AAbGk 'yBICAAAyJQ I` JMA.Ay EN AQ IZ AGvIs IEAGd Iq Ir Jb A_AIeDGCAAEIkGZAnI~@Gz Dh AyAOh AJD| AA{ANJ~ GHAAA.ADY GuAaGGAxGaO\ A|AoDy AnDR GoOt AAPT IrJp JMLRLx Av PR AFPb AtAz LL Is D} A{ IHAAvAuEt Pu Lx AUI[ Jz AIw Ix AAiEa GZG\AnAA.JX A{GsABA{EAkAgI` ALh AvAJz IfAiD| J{ G{GfLMop AjAgApLKLAJ{ Lh Jv AH Ju HuOTAQ LJIa'yzLL L_ Lh An Ay GEOgsLo o'JA{GBIM AJDOEAiAEAdArACD} IgIJc AwAkOv JC Y" /hI WC f[ uf D#p S}p bbrMXA@ P` _S pp @p PU _p nS}C LG [M jp yAaH"F`ipp IDC Xb gn wfaGC Vde?Itm CfLQzb q qY@hOi^C mC |?C K\ Y!PhB x i F OU!Qdp sN BtQj`"naoZPf_3hnrf ~M OP _FmO |sK}U ZP j] xE GTV_eP tKBF Q"Zxbp ZC iewgp EC T$S bZ@rEAS PS `&X p&U@V P_p n1q ~1i M}S \S mh}dMsa\V kp zP Ip XK gsLv+NGG VffY uC EgTC bPJpB zrHb WgYvP EH Tdc| qfw@}b PQ _1kmMG}yLfy[C j Qxp IS XS hGg x`C F!v TF drt!RC``TgS ckSrd ET T}cF qE @K[ Pyp _op nzp }FbL| [t jmy E JeZy iC x"(@F g Flp T*m cm_ sLBC P\G_zU msw}O MzE [C k@yp Hp W>gv wtv Gv XM i]xsGfUU dV tsCKZ SW b+Wq| BfsQK _nni }+VLj \` jfE zlJAXU gjV wF MI\lkE y[I"HPXP hMkwN G0eW|l |\ L}` Zz}c i}a wsm FP Uf dN sLC0@T` TM eEuMcD2C SMYaMHpC F MN \rlN {SJFYP hb wO GC V6Rd[F vM E}UFdssdIAb JZ ZU jP y*AHI XB fZ u[S Cq SO bvU qj @C OhR ^]R l{zZ I"\ X1H gK vsR E1GTU cfIrJ BL QU `#U o_C P` _| o3_~+l OF ^Y l`|g K@ Y^hY vU FIULU eLS tF DIS U bxqSU @SS OS`_[S n[U }#C MMW]U lfq{[`JtU YZr h_S wV| Fw TkS cm| r}R@S R O aqpU C N|\qkKD zg Ip WIfH v@ Eb T^ dO tM BR RF aF pMVaNx_xo` ~^ OA ^G mC }fv LP[P iFhx0FO dsyr` Axa QP `c nPF~` MKV ^IlOF|` KH[` jA z}A Img XngA vr EzHSi bS qV AW Pu_R nO |C KGBZW \AV l*D{*K K [*ik,{AW KVZljA y^ HO W` gzx vL F~ Ua eAS tC Db TOAc&u rsM@&K OC ^sjmxb |*;_JfjiCC x*"oGQ vzy E1R UfydfxsxQ B` QZ_`nx| | K| [V jRy^XC w*hFb UC c*n r1TBOPQB a q*l AQv Qk GO| U8C e*t1SD@S1Iag@jC xS G`VC dOtxq D| STYb>t {C~ JT YMzioxF GG WH gMzvM\EMpTW cC rlAI PJ _MfmMi|mK| ZZiVBwyF H~ W` fHwYFN Usda sHBF Qb _Y oR }b LF \Y jexdF<z UHd3F s RBT PN ^| mF_{F^IFZWT eFYu6T CDp QI`?Q oA ~SMU\AI kAJ zS HmW+m fV v| Eq SX b+Pq~S A"HmP"k}Tt]K~q hjF w0`FuNdM tS Dc Sn b Jpm gF N\n ]Sz kY zpIDXn g\m v]F Em Tcp rmBpQk`Ho,T ~0cMtn \Se ktm zL`IfXLF gfpvXM EU` TX` d0ft| CBREU aF q| @dNzc]U lG {M I` YH iV zW I#J X@e h` v^ F` UYfA xzBG` Ug e6d w| F Tbez$I sw BzS{ Q0g`e qG @U Ozzu ^}_ lf{vJ*sXIgg w] EB_TvsN B]AQJ RN bHqP @SO*u^&` m*t}H LFC ]F lX z}` I}W Y}V hF wY FG Ui dU sF BYC Qq _YB nYA }z~LOT Z*^)izyROpa"E phOd N0l]0`l0t{0gJiYjh0ewOnFdUPq dDDs*wwgF\W W\V fvueCC Reu bbpi*uNx ]` lW |V KW Y}` hU x*pGxVHg evsV Ag OW ]V lW z?e I` WU g\ v` EW UV dP rF @| Og ]7F k7| z| H=F W=| f*vt} CV QW _b n` ~eHNM V<{ f<e uCCF QY_X nG}G LYZ3e hGvF ED THbF qS@X NF ]i lU zc I_ YY guMmDd SMobMqqF @e OMb]MrlM_{zJMaYMuhywF E| TTbF qB@MrNM]MujMNyMQHe WJ fS wW HMxXV gMu]DaS`bM qMBAM{P` _W oV ~MOLM}[M~j`yM|HT WMyeMbtM`CV RMwaW pO Y NN` \NW lJ{FvJFgYF]hG vrLwDtY {wN ItX WlyflTuk`DkF Sk| blmqlw @iHOj| ]iN kxZzdN Hx[VaY e_`s_F B_| QaX `^Ho^N }]| LjZyhMwU| FU`TacWN rM| @TY NTX \QHkM`yQN HyW `e F tsM{Cv ~yMU \jk3zz>R H1M}WyTTc!b r!M BY Rf`|oV Nc \jkU zmZIXd g+QvV E+PT`cF rD Ak PU _`nF }SL_ [k i`xF Gi VC e_ te BU PB _W nA }+SL| [+Rj+a yuI+hX|g+KwAFT@c&^rk@| Ofm]` lW |V Ku Z+OhV wWV F+LT1Ec_r^A]Plb] tc Cf"R1Dt\Bm[PWW _|Y nv` }vW MvV \1ukW` z` JtV ZpIitW xa Gs_ U1Hc`Jr1FAc` P`K``Lo^S ~ke M`O[`EjrXy1GHrWW1}frVu1JDrUSq_ brYp`N~TV M`M[OG jrcaxTW YOU hC` wCW GCV VmzdAG sAU Ar{mP u }NKMZ5_ iM wM@GM VMjfX u*pnDN rM@PNK]XlW{vJxYYhUwTFVUYdHsNV BF\Pc ^amDN |W KV Zc h` wDHGY VX d&T s U B P S` c ` s p CV RW ampU Od ^W mz |sUKpYzzsuhfUwfuEsmTF c| qW pFNXV \XW k`IzzzIM WT` e&J uJ D(| R `d oz\S}z^L\RjO yc GY VzmO)ezmWlNz:zzzz\jtR^rkn\biYmVEBmO-GBm|Jt[s6O~&W M h\q$Dmk  h\HqJp?yboxW g.Lv]mmPBeIRrbP[zmN)kzf^TC-rJ9N_7mzzbEdzso  ic 4e r&LW]uc\cX1YV{KCQsH Tsn-]>JsQ3Hau{U]pmQ2MF xc 4xMUEQ Zceis_DN+oOR+Una{%Osc 4T8t1FW s@U BU ^h9W p{kP ,v{ s{q 7P sygG s"n (d P c 4v,^ Q T dud me  Y md  b |Rk !c 4M } }V J ~X PVV *Al U s^Qm :R~ \;P gc@K yeK Oc 4v p T sR2f t[X E;s &V n L| ~H C-F ]s rMP $] OO\ fJk @lu O  a o*j p*T N  ~ [p G ;_ U Jc C-m c 4xZ [o R $Va .@w pw [n g cV v qD eu mGZ s!>a rl_ jRK MJ] k>g ^V e ^W s ODB NZF ~` cW ^ `Xm `AaE f!>f LPd fNt fqC lNR f_t` c 4sT i+G Adr W V T fRAe V f U f^yt `|xm tU e }t xq fAZi ytC s z^@w ?d w `nFE V K `o a ~U A 1c 4wO @F pAF pAJG J5NQ fyC_ Nb qq fF~@ f{~ f/v] C z;WS o  j &9u f_Dn [f6"r fQ_T p|xs U k c 4Vz aUP fn'e F z"3L c 4A fB  @ pnFI &A.O po } U ] fA  k f@  t f } vaF zJjog &.,V &zB 1N'| x*c 1VfM Q s CxC J&_{ c 4D6Z r"^*@c 4ujQ _knKYu'dWaKTRl_ ^$~Fmb` OQ ]G2lAq^Q O}A^N_qnQ }1RLO?^9B]l_T_ Kn[YO;dtHX}`U_ ]ohkQ S1{0a|qQ5BBQ DW ^]wRQI;CZP~]Q [Q i1IyEB<@GQ GXQVEJge\q+O ME>\Y Z1_whd&_Y EkfT"=zC w+pDFJmJ-OwMKFQ QVI_;;h\c 4~"cQ ac 4fp`yVMRFO/bUQ w[WFXQ]&n`c 4A@TQ Uc d]WtxO KM[hZQ BQ Qe1`+7Q+Hi&sz-YM YFl_.K+/fJEpLYuz3NqA W P V _gMmW zV It)Wg*@"{juQec 4v7vW lV {uAIu7J` AW QV `*c 4k nS~Yc 4w W JoNN}^~L!Q Jpc 4]$YSsv(c i+x}yCc 4q!v c 4` gMTHG{N O{H^0/"lN NMNA\N.]Q  KJc 4}(TMG~QQOR  `3Ji;CsQ vfc 4D>F"2(J;Q rzM ZAjH[CQ cCacq?Q TMK3c{\Vc 4Trc 4uIFKQ {CECJ@Mc 4qLMMu}Htr1wAf3pgJQDWJL<[{aW0WXxthPk 9x1tVq{XMVGZ??]1LA\zc 4S]g X] pG@M0a]MT4j{S^\Cqg c{tk 9ogQ h1YCxZ??{0KzsQ E{bS0y0u{xMeU4rKCfx xHriH[c 4s c0kDVvJZlUdlQ sM4GCkx IJ3$eS3.@xZx??xJlYwZPQ jFszQ H07WT?N;dMCSqc 4^&D}W b3eq{FHVC'^2EM bw]~YM_0WVHGZF?3ONWBFqfY+c 4}K1NA|EC}"t@kF *t1TA^c 4]_c 4n|M~JjM1?tX@s1Z3syfQ _P  o.Fx!o~>GmQ tJgBHDiwgmQ TGNb^c 4H p3c 4Ox0YG1k4`Q TJ"d0b|FjB!C.l0c 4M,Z>HgQ oJz~1_HxQ @Q Pi-_pLq\c 4p ky[| TECbE;eUB`rc 4K2bgMmPHzQ Bc 4BPi]RTDoc 4ms{"`UDB|qFc 4^Ow} `-U:HBhbJc 4@:lGtl5/`c 4LO9/[xCJ\bMc 4Jo/)yS bQmp{;] 1X` IK;XKCSBCVHDY!`T]CfqsUWbHlX t_FBcuHc 4@%}b}eCNacQc 4htfM \Jkimc 4TIQS c 4ndg{R),Mn0y c 4|iDteaqY:Jc 4YDuc 4i ]Fc 4F)FBoL={s-xQ eMc 4tu21i!Q Z!BTi!Gt}!GPq!Q A!c 4Q P!JJa!HPk!A{!Q |!v6J!\@`@!B`!c 4ib!HtK"c 4d"F!c$F D$Q S$"c 4Ia$} `3j$u]$V_$Xn$MW}$`eK$bZ$gi$B x$cG$`fU$M\d$`^s$MZB$``Q$`_`$`ao$M[~$z]M$zzzz_\$pj$zzzzMyx$1FG$1NV$1Ge$ZI t$ KC$RW Q$Rp `$WFp$1E$ZC N$QU \$1Bk$RLy$RC G$RU V$R` e$JGu$JFD$JNS$RV a$SKp$SF ~$RG M$C\$WKj$QF y$WF H$Q`W$QKf${Cu$C~xx${1p$CDa$RQ e%ODt%J{Ox%