*?Gݟ\AP)None WinHeightWinTopWinLeft WinWidthMapVotexVotingHandler DebugLogCaptionInternalOnCreateComponent__OnCreateComponent__DelegateNonePropDescriptionPropsDisplayTextxVotingCoreGetText MapVoteDebugNoneCountDownSounds Broadcast SetFocus StyleNameHint TextFontClear TextColorNoneColorAddNoneNonebVisibleWhenEmptyAddMap__OnClick__DelegateNone DrawText CloseAllSystem CaptionWidthGetPlayerScoreNoneKarma LightColorForceClientMessageNoneAddItem LoadMapList CollisionMatchSetupLogin LightingNone SetIndex MovementComponentWidthSetComponentValueEngineGetComponentValuePlayMapNone GetMVRIIndexInitComponent RenderWeight GetExtra TabOrderUserSaveNone TextAlignCloseAllVoteWindowsTimer ServerTravelNone XInterfaceInternalOnClick GetAccVoteDefaultMapListLoaderGetItemAtIndexImageRenderStyle ImageStyle OpenMenuNoneFindNone TallyVotesSetTextReplicationReplyImageNone SetupGameMapMatchSetupLogout FindIndex LoadPlayInfoGUI2K4GetDefaultMapRemoveMapByIndex GetMapListTallyKickVotesGetGameConfigNoneGetMapHistoryClosedNoneNoneMapListChange KickPlayer SendKickVoteNone CloseMenuRequestMatchSettingsLoadFromMapListNone CloseWindowConsoleCommandSaveAsDefaultAddMapVoteReplicationInfoNone MatchConfigMapVoteHistoryNoneRestoreDefaultProfileNoneNoneMatchSettingsSubmitTopPageNoneNoneGetExtraAtIndexLoadFromPreFixNoneNoneNoneNoneSubmitMapVoteSetupQuestionbAllowedAsLast OpenWindowNone SendMapVotePlayerListDblClickLoadPlayerListNoneNoneNoneMapListDblClickNoneNoneNoneNoneNoneNoneOpenAllVoteWindows GetPortrait__OnKeyEvent__DelegateNoneOnOkButtonClickNoneNoneNoneNoneNoneNoneNone UnrealGameRemoveNotifyLevelChangeGetServerDataReloadNoneUserIDKeyPress StartMatchPasswordKeyPressInitNoneSubmitKickVoteNone SaveAccVotesLoadCurrentSettingsChangeSettingNone RemoveMap SaveDefaultNoneNone ReadMapInfoRestoreDefaultTickPostBeginPlaylmsgDefaultNotAvailablelmsgRestoringDefaultProfilelmsgLoadingMatchProfile AdminLogin AdminLogoutProfileSettingGetUser CanPerformNoneNoneNoneRemoveOldestMapHandleRestartGame LastMapIndexGetMostPlayedMapGetLeastPlayedMap GetMapBySeqb_Login ed_UserIDNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNonelb_MapListBoxNoneNoneNonel_PlayerListTitleNonei_PlayerPortraitNoneNonelb_PlayerListBoxGetDescriptionTextPostNetBeginPlay TypingCloseNoneNoneNoneMapNamePrefixesGetMapNameStringNone MaxSecLevel SetPauseNoneNoneNonelmsgNotAllAcceptedlmsgSavedAsDefaultSuccess KickVote GameVotebOnlyRelevantToOwnerNetUpdateFrequency ServerNumberMapListLoaderTypebAnonymousKicking KickPercentbDefaultToCurrentGameType RepeatLimitMapVoteHistoryType MinMapCountMidGameVotePercent bAutoOpenScoreBoardDelayVoteTimeLimitNoneVotingReplicationInfoMatchSetupLoginPageMapVoteHistory_INI VotingPageMapListLoader b_Cancell_TitleMatchSetupPageKickVotingPageMapVotingPage ed_PasswordEndNoneReset SetContent PlayerJoin PlayerExit EOLDelayxPlayer CharDelay bNoTeletype FillPlayInfoNone OpenSoundNoneNone BanPlayerNoneSwap bNeverFocusbAcceptsInputAddTextNone GUIComboBox GUIButtonNoneNone GUIEditBox GUILabel GUIImageGUIPageGUIListNone GUIListBaseNoneGUIScrollTextNoneGUIScrollTextBox GUIListBoxExtendedConsoleGUIQuestionPageNone moCheckBox moComboBox moEditBoxNoneNoneMultiSelectListBox GUIStyles MenuState FontScale MapPrefixGUI GUIComponent MapListType StrPropertyStructPropertyArrayPropertyClassProperty bGameEndedValueKey__OnDblClick__Delegate__OnChange__DelegateData bCancelledVRI MyControllerMyOwnerDelegatePropertybBot bOutOfLives NameProperty ControlsObjectPropertybOnlySpectator bPending bIsSpectatorNonebAdminObjectTeam PlayerNameNone MyScrollTextNonebButton NumPlayers PRIArray GameClass GameNameFloatProperty MyComboBox ItemCountScoreIndex MutatorClassStructState PlayerID BaseMutator MyEditBoxNone TeamIndexNone PasswordbUpdateNone selectDshortNone CancelButton__OnButtonClick__Delegate MenuSounds FirstMapListAccessControlClass PortraitNonePAccumulationData bMaskTextbConvertSpacesKickVoteCountGRITextNoneSelectedStyle__OnDrawItem__DelegateKickVoteScore SortListNoneNoneNoneNoneNoneNoneMutatorString VoteCount ActivePagebCurMenuInitializedPrefix__OnChatMessage__DelegatePInfo 2K4MenusNonebuttonThick_bMapName AdminUserSecurityLevelNoneNone SubmitButtonbLoopNoneNone MapListBoxNone GameTypesNoneGameConfigIndex MapVoteScoreMapHistoryInfo PlayCountMapVoteMapList MutatorArray Mutators mutstring PIClasses bMatchSetupNoneName DeltaTimeMapVoteGameConfigNonepos NewValueNone SequenceNone FunctionNone BoolPropertyMVRI MapCountbLevelSwitchPending bMidGameVoteScoreBoardTimeServerTravelTimeNoneNoneMapVoteHistoryClass GameConfig 20_seconds30_seconds_remain1_minute_remainseight bScoreModebAccumulationModebEliminationModefivefournineDefaultGameConfigone bMapVote bKickVotesevenNonesixServerTravelStringtenAccInfothree MatchProfileDelta bSelected bNetInitialEnabledMapCountMapListLoaderClassLoader GameOptionsMapInfotwoNoneVoterOwnerbForceMapSwitchtopmapmapidxgameidxRankingPlayersThatVoted TieCountVotesNone xAdminUserMapList ReturnString OptionStringNoneAccessControl p_MapIndexNonep_GameConfigIndexDynamicLoadObject PlayerScore PropNamePlayerAccVotesGetPropertyTextWinningMapIndexWinningGameIndexPartsGCIdx PrefixListNoneVoterID VictumIDNoneLamerjUserID RequestoriGameConfigCountNoneNoneNoneNonebWaitingForReplyNone IntPropertyVotingHandlerNoneNoneNonebMatchSetupPermittedbMatchSetupAccepted bDebugLogNoneAcronymSGameConfigItem ReturnValue p_GameConfig LocationNoneMaps p_GameIndexMACClass mutClassRGGameClassStringNoneNoneWNoneVHZ bAllAcceptedYXC ByteProperty bUseMapListMapListTypeListNoneBTestMapANoneNoneNoneNoneNoneNoneidxLastChatMsg LastMsgTimeRI ScriptTextHistoryNone TypedStrExitingItemViewportOwnerGUIControllerNextMapNoneEnum LevelInfo GameInfoPlayerReplicationInfoGameReplicationInfoNone ControllerPlayerControllerNone TeamInfoNoneNone MapListClassNone SecLevelNoneNoneNone SettingName ThisProp PlayInfoDataNoneMutator CacheManagerCanvasNetConnection InteractionNoneNoneLevelPlayerSenderNoneU TimeLeftMsg PlayerOwnerH NextMutatoridxbTyping FriendlyNameNoneNonenextControllerNoneNone SettingValueNoneNone bIsPlayer bEnabledL MapIndexbFound PlayInfo MaterialNoneInfoActorStyle ClassName SettingsOptionsSoundTexture GameIndexMutClassNamesNoneNoneConsoleRole MapRecordSeqNumMutatorRecord GameRecordClass CurrentMap bUpdated TimeDilationLowestPackageNoneDefaultGameClassStringNoneDefaultMutatorsStringNextSwitchCountdownNextURLControllerListLvNoneGameNetMode TextBufferPauserNoneNoneNone ExitButtonNonePlayerListBoxControlNoneKickImagePlayerPortraitNoneNoneNoneNoneNone MapImageNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone TitleLabelUserIDEditBoxPasswordEditBox LoginButtonNonebScaleToParentInternalOnKeyEventMatchSetupLoginPanelSendClientResponsebBoundToParentMatchSetupMapsAddLinkObjectMapVoteGameConfigPageGetCellLeftWidthMatchSetupMutatorGetControllerManageComponentMapVoteFooter SendCommand MapInfoPage OnClickSoundIsValidInternalOnRightClickModifyMapList__OnPreDraw__DelegateClearPendingElementsHandleResponseInternalPreDrawAddToTickedReplicationQueue lmsgMode DrawItem UpdateStatus FieldChangeModifyMutatorList LoggedOutUpdateKickVoteCount SaveChangeInternalOnOpen LoadListOnSortChanged__OnRightClick__Delegate bRepeatClickSetVisibilityMatchSetupMainInternalCheckLinkedObj KickInfoPageSubmitChangesFreeFindTrackingIndexlmsgGameConfigColumnTitle PanelCaption IsCheckedGameConfigList_Changed SendVoteSetGameClassStringReloadMatchConfigMatchConfigPage LoggedInBottomPaddingMapVoteMapListConfigPage InitPanelGetCommandString LoadMutatorsInternalOnChange StripMapNameGetSelectedMapIndexDefaultListClassSelectedStyleNameReceiveCompleteColumnHeadingsMatchSetupPanelBaseConvertMutatorIndexesInitColumnPercReturnButtonOnClickGetSortString OnLogOut AddElement WindowNameGetSelectedMapName LoadFromRemoveElementGetPendingElements bFillClientUpdateVoteCountUpdatedVoteCountGetSelectedPlayerNameColumnHeadingHintsUpdateRecordIndex SortColumnReceiveKickVoteCount__OnSelect__Delegate ContextItems ContextMenu AddMutatorbSortedOnLogIn GetMapURL__OnLogOut__DelegateUpdateSubmitButtonGetMapCacheIndexFindCredentialsGetMutatorCacheIndex__OnOpen__DelegateReceiveMapVoteCountbRequire640x480ChangeGameType LoadDefaultsNotifyContextSelectUpdateMapVoteCountRemoveMutatorPlayStatusAnnouncement OnResponseGameTypeChangedSubmitEnableLinkedObjectsSaveCredentials LoadInfoDecodeResponseb_ReturnButton ReceiveChatLoadDefaultMutators OnSendChatLoadCurrentMutatorsSortDescendingPaddingPercent OnAccept InitBaseList VertPercPrecacheSoundLoadDefaultMaps PanelChanged OnSubmitHandleParameters IncludeParam SetPosition bMultiLine SendValueFindCacheRecordIndex SubmitActive ReceiveValue sb_Avail SaveMapListAddMutatorByIndexNoneTrackMutatorInfoAcceptAndSaveReceiveNewMutatorOkClickGetGameCacheIndex lb_ActiveAddMapByIndex TrackMapInfoReceiveNewMap b_AddAllIsAdminNeedNetNotifyPropagateValue b_RemoveAllb_Add GetPrefixCreateMatchProfileGetCurrentMutatorArrayGetCurrentMapArray LoginFailed SendLogout SendLogin SendResponsePasswordKeyEventUserNameKeyEvent b_SubmitMatchSetupRules DefaultLeft__OnLogIn__DelegateAppendComponent DefaultTopNewButtonClick DefaultWidth IsLoggedInConvertMapIndexes sb_Active lb_AvailDeleteButtonClickDisableLinkedObjectsGetSelectedGameConfigIndex co_GameType LoadMapLists SendPlayerIDRequestPlayerIPPlayCountDown__OnActivate__Delegate VertAlignHandleCommandDecodeCommandReceiveCommandUseMapList_Change HorzPercAutoSizePadding b_RemoveDefaultHeight RemoveItemGetSelectedPlayerIDInternalOnActivateReceiveMapInfoTickedReplication_GameConfigTickedReplication_MapListTickedReplication_MatchConfig RemoveExtraTickedReplication_MapVoteCount TickedReplication_KickVoteCountTickedReplication_MapsTickedReplication_MutatorsReceiveGameConfigInternalOnDragDrop LoggedText PlayerTextNone ed_LoginNameed_LoginPassword GameTypeID DemoRecID TabHeight TournamentID GetLocalURL FailedIDSetOutlineAlpha UpdateIDInternalOnEndDrag ReloadAll RemoveIDAddID CompleteIDLoginIDPostNetReceive RightPadding MatchSetupID StatusIDURLID GeneralID OptionID MutatorIDMapIDlmsgAnonymousKickVote l_NoPreview ch_DefaultRefresh bNetNotifyRemoveComponentGetActiveMapNameNonePlayerInfoMultiColumnListBoxGetConfigArrayDataPlayerInfoMultiColumnList MutatorDataMapVoteMultiColumnListBoxMapVoteMultiColumnList bKeepHistoryTickedReplicationQueueItemNoUsernameSpecifiedNoPasswordSpecifiedInvalidLoginTextButtonLoginTextButtonLogoutTextPleaseWaitTextREPDATATYPE_MutatorsREPDATATYPE_MapsREPDATATYPE_MatchConfigREPDATATYPE_KickVoteCountREPDATATYPE_MapVoteCountREPDATATYPE_MapList ed_Params ed_DemoRec ch_DemoRecch_TournamentREPDATATYPE_GameConfigTeamSayMatchSetupLockedCheckLinkedObjects ScoreText PanelHint ReceivedRule lb_MapListMapVoteCountMultiColumnListBox bPersistent lb_MapDescMapVoteCountMultiColumnList GetGameIndex MutatorInfo__ProcessCommand__DelegateGetRecordIndex PanelClass ApplyMapListKickVoteMultiColumnListBox bDockPanelsb_New l_MapAuthorKickVoteMultiColumnListNone bTransparentsb_Backgrounded_Chat OnChangeb_Close LeftPaddingDeleteConfigArrayItemLabelJustificationbVerticalLayoutAddTabStaticGetMaps FindExtraAddConfigArrayItem l_PlayerNamelb_PlayerInfoBoxIDTextIPText KillsText SuicidesTextMultiKillsText SpreesText HeaderBase l_Statusf_ChatReceivedValueAddListNonelmsgKickVotingDisabledUpdateConfigArrayItem LevelChangedGameConfigPagelb_VoteCountListBoxl_Modei_MapListBackgroundi_MapCountListBackgroundlmsgMapVotingDisabledlmsgReplicationNotFinishedlmsgMapDisabledlmsgTotalMapsNoneSayWaitingForLoginTextAcceptPlayInfoProperty LoginCacheOpened OnDblClick c_GroupsMapListConfigPageGetConfigArrayColumnTitleMessageNoInfo__SettingChanged__DelegateGetConfigArrayItemCount i_MapImagelmsgLevelPreviewUnavailable bTabStoplmsgInvalidPassword AuthorText DeathsTextsb_List sb_List2lb_GameConfigList co_GameClasslmsgMatchSetupPermission ed_Acronym ed_Prefix lb_Mutator ed_Parameter lmsgKickVotelmsgNewlmsgAddlmsgAdminMapChange ClearRules PingTextlmsgMapVotedForWithCountlmsgMapVotedForNoneMapVoteEnabledch_UseMapListed_MapListPrefix sbCaptionlmsgSpectatorsCantVotelmsgMidGameVote GetStyleKickVoteEnabledMatchSetupEnabled lmsgMapWon l_MapPlayersPlayerInfoData b_MoveUpGetServerDetails b_MoveDownlmsgKickVoteAdmin b_DeleteGetSelectedTeamlb_Chat TopPadding ed_GameTitlep_RulesPrevSortColumn MapVoteDataMState KickVoteData ListDataLabelStaticSaveConfigLoadVRI ListArray MapListArraySelectedMapLists b_Return SaveIndex StatusLabel NewFooter bRemoved UpdatedIndexGameTypeIndexDefaultParametersDefaultTournamentModeDefaultDemoRecFileNameIP MapIndexListMutatorIndexListbTournamentModeDemoRecFileNameCompPRIMapVotingMenuODummy__OnSendChat__Delegate__OnAccept__Delegate__OnSubmit__DelegateMapArr b_Accept NewString ColorNames ParamArray__CheckLinkedObjects__Delegate RecallIdxAnnouncerVoicebReloadMapList bTournament RecallQueueOldMapsTrackedMutators FullMapName TrackedMapsSubTypeInfoStr DemoFilename bDemoRec__SendCommand__DelegateMaplistManager DataTypeRCMenuActiveBackgroundTournamentCheckboxCommandLineParamsBoxDemoRecCheckbox DemoRecBox InactiveList ActiveListMutInactiveListMutActiveListMutAddAllButton MutAddButtonMutRemoveButtonMutRemoveAllButtonPIPanelMapvoteFooterBackgroundChatScrollBox ChatEditboxMatchSetupFooterMatchSetupTabControlstr1MapPlayersLabel MapInfoListPanelsSBListSBList2GameConfigListBoxGameClassComboBoxGameTitleEditBoxAcronymEditBoxPrefixEditBoxMutatorListBoxParameterEditBoxDefaultCheckBox NewButton DeleteButtonMapListCheckBoxMapListListBoxMapListLoaderPrefixEditBox IPAddressPlayerInfoBoxControlPlayerNameLabelNoneb_OKMapCountListBackgroundVoteCountListBoxMapListBackgroundNoneTeamRedConfigured ArrayDimURLbDirtyConstPendingElements SortItem MapVoteGroup Description LargeWindow IdentifierGUIListBoxBase bChangedbRefreshMutatorsDLastIndexes SortDataKVCDatabReply AddButtonType KeyValuePairVotingReplicationInfoBaseGUIMultiColumnListPIData bListeningKickVoteGroup LoadDecoTextMapURLPCNewMapsCount NewStatusMsg bDedicatedArr ItemHeightGroupAuthorbSendingMatchSetup ServerGroupTickedReplicationQueue RepDataTypeGetSoundDurationGUIMultiColumnListBox Parameters bRefreshMuts bRefreshMaps GUITabButton PropertyName __NotifyContextSelect__Delegate TeamName CountDownDeathsPing Response__ProcessResponse__Delegate ParentPage PlayerIndex RecordIndex LeftPart bTeamGameLockedFloatingWindowVoteCountDelta PreviousVote bRefresh MyFooter ActiveTabbInitializeListt TextName GameAcronymMapListClassName GUITabPanelScreenshotRefTeamBlueConfigured InControllerMyListPlayerCountMinPlayerCountMaxClasses AcceptingCmdServerResponseLine ServerInfoTop RemovedItemFloatingWindow LocalListMaplistHandler RowIndex RightPartRemotePlayInfoPanel Characters ScreeniePage DecoText IsDemoBuild SuicidesParams DrawStyle MultiKillsMapVoteGameConfigLite ColumnIndexSpreeMVCDataSpreesVoteReplicationInfoStatusAnnouncer PrevGameVote Display2 PrevMapVoteParam1TeamPlayerReplicationInfoGUITabControlRows NewIndex bAcceptedmDescGUIMultiComponentGUIContextMenuGUISectionBackgroundbParam GUIPanelUnrealMPGameInfoPort MapHandlerGetServerNetworkAddress GUIFooterupassBotModeUT2K4TabPanel GUIListElemxUtilExitingPlayerIndexConfigArrayNameMATCHSETUPALLOWED bDropTargetMouseYKICKVOTEALLOWEDMAPVOTEALLOWEDXGame NewControlsDMRosterConfiguredInOwnerCurrentGameConfigGUICustomPropertyPageUT2K4PlayInfoPanelPanel bAutologinAutoLoginInfo CurrentPort CurrentIPImagesEnableComponent bIsVisible MenuOwner MyButtonMyPanel TextMessage MapVoteCountMouseXbNotify CellWidth OutlineStyle DropIndex ClassFrom ServerState MouseOffsetMultiColumnSortDataGameTypeCombo InvSortDataMode UpdatedItem AddedItemHeader CellLeftDrawGUIMultiColumnListHeaderCommandKillsGetPlayerIDHashGetPlayerNetworkAddressstr ParamNameCallerAltSectionBackground bPropagate Username eMenuStateDisableComponent LoginHistory bDropSourceDTextNewInfo DropState SelStyleunameRemoveAllButton RemoveButton MoveUpButtonMoveDownButtonsb_Mainstr2 AddAllButtonInactiveBackgroundMapAuthorLabel li_Active li_AvailNone NoPreview CloseButton ColumnDataParam2 ClientBoundsNonebStandardizedSetItemAtIndexHeaderColumnPercSetExtraAtIndex InfoClick IsValidVote MyOnDraw KickClickAlignBKb_Info__OnDraw__DelegateUseMapListPropsDisplayText ListIndexb_KickUserMapListPropDescriptionInsertsb_Info bVisible GUIHeaderYLt_WindowTitleXL InfoButton currentGame eFontScalebAutoDetectMode ImageOffset KickButton TextSizesbInfo GUIBorderFS AcceptButtonlistbackgroundNoneNoneNoneNone IsEnabledNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneI \UQl n9:9:$-9:9:$-o9:9:$-G9:9:$-H9:9:$G6|ƛ,)ZJ@X 곌J@J@X 곌J@ uzVGB uzVGB u u u_ . u u u_ . u4u:h uzVGB4u:h4u:4u:ƛ4u:ƛ4u:h4u:h4u:h4u:h4u:4u:h4u:h4u:hв4u:4u:ZZZ4u:4u:ZZBm= uZZ^ 0uZZM^ 0u4u:hhh4u:h4u:h4u:4u:4u:4u:4u:hhhhhh4u:hв4u:hв4u:4u:3}3} uu*F3} uu*F3}4u:4u:4u:4u:4u:4u:4u:4u:4u:4u:4u:4u:4u:3}3} u uu*F3}Zs9&613+*,"E"D"j}sgfombh q_`;aC]+*Profile was saved as default successfullyB]MKYou have Accepted the current settings, Waiting for other users to accept.R]mapQ] mutatorP]optionO] generalN]urlM]statusL= matchsetupI]loginH]doneG]addF]removeC]updateA]failed= tournament}] demorec|]gameAWcFG$?W``w@@} `@`A B ^6P4u:f> Í3}Zsƛƛƛƛƛƛƛƛ3}ввввввввввввввввDJв3}Zs± uzVGB3}Zs±3}Zs±3}Zs±֧O uzVGB u uƛƛ uzVGB3}Zsƛƛƛƛ uzVGB3}Zs±ƛƛƛ3}Zsƛƛƛ uzVGBƛ uzVGBƛ uzVGB uzVGB uzVGB uƛ uzVGBƛ u uzVGB3}Zs uzVGB3}Zs uzVGB3}Zsƛƛƛƛ3},e,e uzVGBƛƛ,e3},e,e uzVGBƛƛ uzVGB,e uzVGB3}Zs uzVGB3}ƛ3}Zs3}Zs- =1ƛƛ3}3}/kl/kl3}ƛƛƛƛƛƛƛƛƛƛƛƛ3}Zsƛƛ3}Zs3}Zs3}Zs3}Zs3}Zs3}Zs3}Zs3}Zs3}Zs/kl/kl3}3}ƛƛ uzVGB3}Zs/kl3} uzVGB uƛƛ uzVGBƛƛƛƛ uzVGB3}Zs uzVGB3}Zs uzVGB3}Zs uzVGB3}Zsƛƛƛ/kl/kl3}Zs3}Zs3}Zs3}ZsgM/klgMgM uƛ uzVGB3}ƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛ3} u uzVGB u3}3}3}Zs3}Zshh9&613+*,S"FR"QP"2O"N]xVoting.MapVoteHistory_INIM"LK"3JI]xVoting.DefaultMapListLoaderH"i]xVoting.MapVoteGameConfigPagez]"!xVoting.MapVoteMapListConfigPageB]#"The password entered is invalid !I]87Sorry, you do not have permission to use Match Setup !N]87%playername1% placed a kick vote against %playername2%S]21A kick vote has been placed against %playername%f]RP%playername% attempted to submit a kick vote against the server administrator !`]%mapname% has won !\]-,Mid-Game Map Voting has been initiated !!!![]! Sorry, Spectators can not vote.U]&%%playername% has voted for %mapname%T]98%playername% has placed %votecount% votes for %mapname% ]Enable Map Voting Auto Open GUI ScoreBoard Delay  Score Mode Accumulation Mode Elimination Mode  Minimum Maps  Repeat Limit Voting Time Limit  Mid-Game Vote Percent  Default Current GameType  Enable Kick Voting  Kick Vote Percent  Anonymous Kick Voting Allow Match Setup Game Configuration Map List Configuration ]'&If enabled players can vote for maps. WUIf enabled the Map voting interface will automatically open at the end of each game. fdSets the number of seconds to delay after the end of each game before opening the voting interface. ?>If enabled, each player gets his or her score worth of votes. JHIf enabled, each player will accumulate votes each game until they win. ZXIf enabled, available maps are disabled as they are played until there are X maps left. mkThe number of enabled maps that remain in the map list (in Elimination mode) before the map list is reset. >=Number of previously played maps that should not be votable. 87Limits how much time (in seconds) to allow for voting. C APercentage of players that must vote to trigger a Mid-Game vote. i gIf enabled, and there are no players on the server then the server will stay on the current game type. 3 2If enable players can vote to kick other players. m kThe percentage of players that must vote against an individual player to have them kicked from the server. V TIf enabled players can place Kick votes without anyone knowing who placed the vote. omEnables match setup on the server - valid admin username & password is required in order to use this feature 0/Opens the map voting game configuration screen 0/Opens the map voting list configuration screenQ]*)Admin has forced map switch to %mapname%S ] GameTypeS  MapPrefixesS  AbbreviationS NameS  MutatorsS Options`` @@`o ````X`S``n @^] `D@`~ `v@``N  @]Q`G@@| X Kv6fh@E3}Zsڌڌڍ3}KAKAKAKAKAKAв3}Zs3}Zs3}Zs4u:KAWSFввZs_#,G3} uвввв3}Zs3}Zs3}Zs4u:ввввв3}Zsƛ4u:ƛƛ4u:ƛƛƛввKAвZsZsв3}Zs3}KAKAڍ3}ZsjWjWjWjWڍ3}Zsڌv]&%Match settings are being loaded now.~]#"Restoring default server profile.}] Default Profile Not available.``f``]@`j `0``%``t```qQ \6 {q^JB``z````Y@`Q `f `H`$@``N@``o``@`k `A``h``-@```` Fw/kl@E&``R``[``V``m``O@``@`K `E````O @``4``j `/```D@`o `Z@`{ `j````D``j ````Z``@``c@``p``7@`M `k @V`x``G `Hb z Y2gM׿e]9&613+*,``h````m@`d@```L@`N TX6 qz; u u3} u^JBbtJ SH$=$=$L?$L?sS````a````}``A``a@``w @``C`````g`m ``_ @V`A``@``````!``k@``{``{ ``l ``S@``O@@`X `l@`g ``f_>i_^Zc,.Zfwc,*wc,*c,~( G`````i@`H@``Z@`} `F``I@`Q``Z@``@ ``N``O``f``@``g````\``n````n``I``S``^`````H ``" ``G@`o `F ``J``w``k@``s`````V [ V6 Wy8z;ddddƛddddddddddƛZddddƛddddZdd0ƛƛZdd0dd uzVGB^JB[e OC_FNh Zi Hl$m~>$$?$>``L@@My `E``d ``\@`s ```````b @````k``|@``[``G ``b``r``M``````I``i``_``6@``{@``|@``@`s `h``A@`f@`h@```e@@``K@@``N@``U``@``@``w``````g``Q ``L ``o````V ````^ ````}``K `H`@``````C``R``Q``r@@M`K``2````P``V``;``S``b@``@``Y@``@``J@````@``t``@``o``E@``&``c``d``j``t``@``B`g`B``X@````v``@@`k@` `/`g@``5``L @``Z``^``@```@``P``X@M`{ 0 G`m @V`T @V`@``y``V``````q@``@@``] !  G`B_ u" G`Ca e$* G`h k ;) G`EC+r  G`i@``I@``B@``~ @`` @``d@``L@````XB`T ``V ``Y ``[ ``^@``y@```@``U@``n ``X``q@`c@`Y@`e@`H@@`g@`b@`i@`j@`O`/_ P W{KOC3/klwJ"`qc @ ]6 Bm=qQQQQQH /nvƛQH /nvZƛZZ FZ FQՐY]QH /nvp ip ip iȝhh^JBEtsqvxz~f]DBSorry, Kick Voting has been disabled by the server administrator.o ] Kick VotingH 'BG `]UserID WC $ǻ>$q=>$33>$q= =A"Z'Wj`gf R M6DJgM3}вcH4u:3}4u:3}4u:4u:ZsZs4u:4u:4u:9&613+*,x] Use MapLists{]GEIf enabled, the map lists are used instead of showing all map names.`] Password WF $u>$>$ >$=A"Z'Wl````{vQ`UW v' G`````N@ L8\ k' G`N  @]`@``q aol aa Vra*p___Couldn't load maplist type:a! DaUt%t7D@|otD7L%ho?Lh&o%Li&i7L%|iL,mutator=@iL,|iL,Game=bz||iL|pp|?iLix~o.UT2xoox`!o@|tr G`t UAS P bU%NP|PZkNJ~k.UT2wJkkJb!kNbUN&ZN% G`@``edp0{5'-dLoading Maps from the following MapLists!7X%2%27p\62p w\*\!o\p2M$2%$27X2X!o2Xp22pLoading Maps from Maps dir. L!zL2%27paBL62p27p&aBL,2f7[%OL,[2O%2%227[A2[p2 G`@``eb G```F @V`@ v>vy_-'/ VtswVm *rVm c,TVt10rT*%(_-'F8c, G`gtB[-Kt! G`K lyWRW____RestoreDefaultProfile()T-"ln (l zm  G``F iK$Mwrik}F%}_%T$2F_c-?'rim%(' G`O sPl____SaveAsDefault()i-"m -n (vj J G````J G285wT*T-"m( G`M fj:c/9:f,  9:g&_*'^9:f,( 9:g&_*'( G`p||N____MatchSettingsSubmit()-"-\'-f'|%|7n |n -"!|n -f-\(|A-\n (kj I G``R ````N klJj9:k,  9:o&}F%}_%T$2F_c-?''9:k,& 9:o&F*'( G`W ````S }f^j T*}- G`Z VnzC____RequestConfigSettings-"-f(-G'f-V~ $7n (y &-T~ $7n (F &~ $7n (,j { G``\ ["B=-"(-f(-G(n [m j logout G``X sfd& T* G`` A2@`Jn 2A@m q-"'Bqj w1]-"(j w G``@``@``@``j w{?*w7O'6wO G`b @``@``Dd M% G`e ``@``c g L& G`@``f i K'\ G`@``m I>"q Qq  G`l @``@``n q=a(q %' G`p WkB=n oW G``@``q ~K<<WppppMVRI.SendMapVote(9S~, 9S})n F~} G``|W::-U(7-G 7| %j f-G( G``B)!Mz6) -v' @%&6%6)6%%6%%6%6)6%6) % -%-  |6)6-6-6)6-6) t6-6)@-& 6-6)6-%6-%6-6)6-6) - @ &6 6)6 %6 %6 6)6 6)  G`Er };Nz}[-v'< 7& 7& @%&6%}6%&6%&6%6% %[%[-n(%d 1|}66&6[-n'YY6%6Zt6} -n@&  6%66}6&6&66[[-n @ &6 }6 &6 &6 6 [ [ G`P ``@``y v {bF7| %-U -o 9:9:$C9:9:$ wm *rm *-b9:9:$ wm *wm *-o  -b P 7| &6kP | %$m6_ P | -o  I$n6_ P | -o  m$q6_ P | -o  $r6_ P | -o  $o6_ P | -o  $s6_ P | -o  $t6_ P | -o  6_ P | C6_ P | 6jP | A| P & G`Ugs9:9:$-Gn -l-on -Y-Hn -mZn Z7n G-oK9@n -IK9=9:9@n -b,K9=9:9@n -i,gn A~ $Z&~ $Z&G7n t %~ $7n t &-G7n @ %~ $7n @ & G`Yu[A____VotingReplicationInfo.PostNetBeginPlayg G `@``Du OeLY\OCYY7EYE G`@``Y@``@``pPtP bMapVote%$ 2bAutoOpen&$ OScoreBoardDelay,$ gbScoreMode,$ bAccumulationMode,$ bEliminationMode,$ MinMapCount,$ RepeatLimit,$ VoteTimeLimit,$ MidGameVotePercent, $ 8bDefaultToCurrentGameType, $ ObKickVote, $ hKickPercent, $ bAnonymousKicking, $ bMatchSetup,$ GameConfig,$ MapListLoaderType,$  G(`F| C -vb-v( G`A BH}n-v'S&B,`B V6B6SSBB`S G`D jX"  (bbMapVote%#$$Check '( )bbAutoOpen&#$$Check '' 6bScoreBoardDelay,#$$Text3;0:60 '' +bbScoreMode,#$$Check '' 2bbAccumulationMode,#$$Check '' 1bbEliminationMode,#$$Check '' 4bMinMapCount,#$$Text4;1:9999 '' 4bRepeatLimit,#$$Text4;0:9999 '' 6bVoteTimeLimit,#$$Text3;10:300 '' :bMidGameVotePercent, #$$Text3;1:100 '' :bbDefaultToCurrentGameType, #$$Check '' 6bGameConfig,#$$Customp;;h '' *bbKickVote, #$$Check '' 3bKickPercent, #$$Text3;1:100 '' 2bbAnonymousKicking, #$$Check '' ,bbMatchSetup,#$$Check '' D j  b G `G F[NIF-mw.F*A.F G`CB Ru2-v'd\R/d%`d G`H``I W2"-mw.L*X|WAdmin.L-J,'@.LWSD.LXmpW has logged in to MatchSetup.H CW9wH*JH}@J%uJ%.L-J,pSecLevel = 9SJ'pW doesnt have MatchSetup permissions..L -S(pW password was invalid..L -X( G`E T`-v'AT&  G`N Zj /rZ*rZm * j %playername% has been kicked.j j %playername%Zm  j (-lL%(L7wL*LDLDLNwZ*Zqpp___Zm  has been kicked.!oZm ' G`H M\ w&} &'n}w,wq|6n&Mn&w}t6n&M}nwnw}wn* G```w````q>b7^7>%>7xw>*>DI>D^>A%>%>7^>^%@7A&A7>>I&%A&z&zA{7^z7^C77z7z7Cz C%79?C^9?9?,d9?djC  G`R joVW9pSubmitKickVote 9Sj!9-S -l Z=.Z-[(%7w*.m j-['@wm ^ -[ *ZD@ .Z-ppp___Admin .Z kicked w!j@ .Z-.Z -U @m -&r.@m *j {j j %playername%.Z j  ppp___.Z placed a kick vote against w!1-cj Aj j %playername%w j j Pj j %playername1%.Zj j %playername2%w j CZDZD@E @n&0CE Cnb G`J Jq{<VJJRRV G`@``S Q_9( % $-eQA/Qf7!%K6Q,!w7!%PQQ% N%-Y'-Y -6 %% %7!|6 }%!%!-Y( %-Y N,d%-6 %%%7!|6 }%!%!-Y(%U+-Y%-6 o%o77!%K6o,!7!%%%%7!|6 }%!%!Qo-Y(%8-YoPQQppppDefault Map Choosen = 6Q (6P)! G`U Tqv7%%7{6-a(;w;*E.;y;- wE**z6Et=Evwt*tbTtVS-a'd-b669D(Ev6;;V-a66%7&%z6A&;w;*E.;;- wE*-a(7%%7z6E-a'zt=E-atbTtVS@7&67&E-b67&9D(E67&&;;% G`j``W VL~BtUV+zU%7%j%j7z6jUQ6jj>Q%Q G`a``Z W(nri+-a?HaW`a9?&a?a G`@`U`h@``\ XccqZ6h6X6h6X6h6Xh G`@``a Ya\pY  G`e``c ` I=~l0____HandleRestartGame!99:9:$'-me%e7we*e-"(eI+-Y-j |9VRoARAssault.xAssault 9J Part,'5wmka?'(' G`\@``d [Z(h_4{6ycpc6ya{6gcppc,6g{6yHpH6y,? {6gHppH?6g\6[\pp\?Game=6y3{c\pp\?Mutator=cV{H\pp\?H\ G`f zX MfJz%Gz7=wz*zIz G`X]m3nt r]* 0]* K .0 c$R c)F L  G`h ~FeJ~%G~7=w~*~q~ G`FBr5X 9V0\ y0@y?Ba y&&y7ByB=ryB|Tournament-{9Kr|DemoRecdrg {a aBa ;aBa yByZ]0 G`l zG$_ -S z 9?%___Map change Failed, bad or missing map file.!_z_^D,;6z RZz _^pServerTravelString = R!DC HR( 5m,m%Xm 55,< 5, 5, 5, t%t7wt*wtm *t ^5ty5%U' G`Oq]:bM? 7wM*qIMwM ww*qIwAC@A%&%AMr%#r7A{rAGrA wG*qIGr I G`````rgU(HL -S ]%7&7%q7gw*bV] -b-iELm 9D(m  E9D(m C<-iELm &CE&Vb&Vb&Eg-bg,\9?Vb&9??--g'-p___Voted - 9S]!O,- -{29?]9?9?,d9?i G-{'5wm&a?'j%%7&&%@j&j]_]&%\j&`&R`jH&`&```]%_dccd%]&j&%&&&%&%p&&@j6%&&ppbb#f%|6 bpf,dc%-g>]%Bz6  j xj j %mapname%ppp6 (6) j F`D+,;6 RZ `pServerTravelString = R!DC-IH-iqA-kb-S'a' HR( G`p 'F5N -S V=.48r'A .4-j Nj j %mapname%ppp6' (6A) j ppppAdmin has forced map switch to 6' (6A)!F-S'iD,;6' RZ' AipServerTravelString = R! HR(a?' .4-.4 -U w'% 'A7<VVAVb'-6'  pppppppp___9SV - .4 voted for 6' (6A)!rVbqVVVb'VVA;-iZ-bl L.49D(.4j Yj j %playername%.4j j %votecount%9Sl j j %mapname%ppp6' (6A) j 8l L.4&j Yj j %playername%.4j j %votecount%9Sl j j %mapname%ppp6' (6A) j $-bl 9D(.4j Yj j %playername%.4j j %votecount%9Sl j j %mapname%ppp6' (6A) j l &j Lj j %playername%.4j j %mapname%ppp6' (6A) j u 'Al *r qu rqVxVxl U( G`K````q a=v3aK%XK7NwK*rKm aKK G`r l!Lv/s%=s7 3|l6s  s6D ,el7 &6 l6 666 6666H66%-6 (-6 'B{|{|6666|-O'|{{{{6666{-O'z6666l-O'-OD !6 G`u R0J"7 %%y/g D*pMapVoteHistory9SG yrD*D*pMapVoteHistory9SG {GameTypes:!b7%-k'7&6%9V6%6%6%6%6%%R%R7{6R6R!RppMapListLoaderType = q!kgq BakrB*Ba DB0p9S maps loaded.!DC-Ij%R%R-6R jRsjh j%Elimination Mode Reset/Reload.!H%7 %%bB0Ba G`@``R|s"pppp____ChangeSetting(|, m)!}.0|  Q|m?-B(l%l7R|6lRm-B'l-B(X mh'}Y '('  iO m' b e`{R mR mh(}Y (('  Ea m'  R-{9Km'  Sdm' lb|l blm'( G`v Dt___Spawning VotingReplicationInfo!ha D D rh*___Failed to spawn VotingReplicationInfo! hnD7h G`y be`9:9:$ M ____PlayerExit!-Y-l-mX%X7wX*8rXm *rXm bpexiting player MVRI found 9SX!M X-YM bM Vj %j 7t  M b6j t 'M V6j t 6j t M xu 6j t 6j t 6j t j G-lE M n%M DwM D*E M Dn -l M wX*XDM XDwX*8rXm *rXm b___Destroying VRI...!XaX*-lb-YU(Xc G`t Ehib"]-E0 G`w svr0#>ppSaving Default settings to MatchConfig.ini - [9W]O?Ki ea -f-{gd7X7s%2s7(r.6s*6XsX6s6YsX6sso b G`{ nd79:9:$ 3na/!g -Y-l-mppp___New Player Joined - n, n!tn G`x pz '___RestoreDefault()!.r.p* L pMapIndexList = O !z? zO .p -` ]v%Ov7Xf%Ef7;r.6v*;|6XvX6fbf6YvXEfv0"0^F.0wF*FY '' G`[ y|X !9:9:$ C-Y(-l(-m-m(~-lKick Voting Enabled!Kick Voting Disabled!r-YMap Voting Enabled!b7%_|9V6AA%y%_y7U|6y9VAy_y iA%0Map Voting Disabled!-mMatchSetup Enabled!(B( m(rMatchSetup Disabled! G`@``@``@``z zk+vb0"0Z.0Fgi {ggp?mutator=gzpppK Y` U ?Game=?gaBzp?-{TOURNAMENT=1TOURNAMENT=0,{daBzp?DemoRec=dZ{a aBzp?a ,?   $MbMinPlayersM%aBzp?NumBots=6M $aBz?bAutoNumBots=True $F-F7 %aBz?RedTeam=XGame.TeamRedConfigured7 %aBz?BlueTeam=XGame.TeamBlueConfigured7 %aBz?DMTeam=XGame.DMRosterConfigured 0 Hz( G`t ````d// ==================================================================== // Class: xVoting.xVotingHandler // // xVotingHandler handles the server side of map voting, kick voting, // and match setup. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class xVotingHandler extends VotingHandler config; // work variables var array MVRI; // used to communicated between players and server var int MapCount; // number of maps var bool bLevelSwitchPending; var bool bMidGameVote; var int TimeLeft,ScoreBoardTime,ServerTravelTime; var array MapVoteCount; var array KickVoteCount; var class MapVoteHistoryClass; var array MapList; var MapVoteHistory History; var string TextMessage; var string ServerTravelString; var bool bAutoDetectMode; // true if mapvote enabled but not configuration // ---- INI Configuration setting variables ---- var() config array GameConfig; var() config int VoteTimeLimit; var() config int ScoreBoardDelay; var() config bool bAutoOpen; var() config int MidGameVotePercent; var() config bool bScoreMode; var() config bool bAccumulationMode; var() config bool bEliminationMode; var() config int MinMapCount; var() config string MapVoteHistoryType; var() config int RepeatLimit; var() config int DefaultGameConfig; var() config bool bDefaultToCurrentGameType; var() config bool bMapVote; var() config bool bKickVote; var() config bool bMatchSetup; var() config int KickPercent; var() config bool bAnonymousKicking; var() config string MapListLoaderType; var() config array AccInfo; // used to save player's unused votes between maps when in Accumulation mode var() config int ServerNumber; var() config int CurrentGameConfig; // MatchSetup var MatchConfig MatchProfile; var string GameConfigPage; var string MapListConfigPage; // Localization variables var localized string lmsgInvalidPassword; var localized string lmsgMatchSetupPermission; var localized string lmsgKickVote; var localized string lmsgAnonymousKickVote; var localized string lmsgKickVoteAdmin; var localized string lmsgMapWon; var localized string lmsgMidGameVote; var localized string lmsgSpectatorsCantVote; var localized string lmsgMapVotedFor; var localized string lmsgMapVotedForWithCount; var localized string PropsDisplayText[17]; var localized string PropDescription[17]; var localized string lmsgAdminMapChange; var localized string lmsgGameConfigColumnTitle[6]; const MAPVOTEALLOWED = True; const KICKVOTEALLOWED = True; const MATCHSETUPALLOWED = False; static function bool IsEnabled() { return ( Default.bMapVote || Default.bKickVote || Default.bMatchSetup ); } //================================================================================================ // Startup/Event Code //================================================================================================ function PostBeginPlay() { local int i; Super.PostBeginPlay(); // disable voting in single player mode if( Level.NetMode == NM_StandAlone ) return; if ( Level.IsDemoBuild() ) { bMapVote = False; bKickVote = False; } bMatchSetup = bMatchSetup && MATCHSETUPALLOWED; if(bKickVote) log("Kick Voting Enabled",'MapVote'); else log("Kick Voting Disabled",'MapVote'); if(bMapVote) { log("Map Voting Enabled",'MapVote'); // check current game settings if( GameConfig.Length > 0 ) { if( !(string(Level.Game.Class) ~= GameConfig[CurrentGameConfig].GameClass) ) { CurrentGameConfig = 0; // find matching game type in game config for( i=0; i -1 && MVRI[ExitingPlayerIndex].GameVote > -1 ) { for( x=0; x -1 && MVRI[MVRI[ExitingPlayerIndex].KickVote] != none ) UpdateKickVoteCount( MVRI[MVRI[ExitingPlayerIndex].KickVote].PlayerID, -1); } } if( bKickVote && ExitingPlayerIndex > -1 && MVRI[i] != none && MVRI[i].KickVote == ExitingPlayerIndex ) MVRI[i].KickVote = -1; if( MVRI[i] != none && (MVRI[i].PlayerOwner == none || MVRI[i].PlayerOwner == Exiting) ) { log("___Destroying VRI...",'MapVoteDebug'); MVRI[i].Destroy(); MVRI[i] = none; if( bKickVote ) TallyKickVotes(); if( bMapVote ) TallyVotes(false); } } } } //------------------------------------------------------------------------------------------------ function AddMapVoteReplicationInfo(PlayerController Player) { local VotingReplicationInfo M; log("___Spawning VotingReplicationInfo",'MapVoteDebug'); M = Spawn(class'VotingReplicationInfo',Player,,Player.Location); if(M == None) { Log("___Failed to spawn VotingReplicationInfo",'MapVote'); return; } M.PlayerID = Player.PlayerReplicationInfo.PlayerID; MVRI[MVRI.Length] = M; } //================================================================================================ // Map Voting //================================================================================================ function LoadMapList() { local int i,EnabledMapCount; local class MapListLoaderClass; local MapListLoader Loader; MapList.Length = 0; // clear MapCount = 0; MapVoteHistoryClass = class(DynamicLoadObject(MapVoteHistoryType, class'Class')); History = new(None,"MapVoteHistory"$string(ServerNumber)) MapVoteHistoryClass; if(History == None) // Failed to spawn MapVoteHistory History = new(None,"MapVoteHistory"$string(ServerNumber)) class'MapVoteHistory_INI'; log("GameTypes:",'MapVote'); if(GameConfig.Length == 0) { bAutoDetectMode = true; // default to ONLY current game type and maps GameConfig.Length = 1; GameConfig[0].GameClass = string(Level.Game.Class); GameConfig[0].Prefix = Level.Game.MapPrefix; GameConfig[0].Acronym = Level.Game.Acronym; GameConfig[0].GameName = Level.Game.GameName; GameConfig[0].Mutators=""; GameConfig[0].Options=""; // GameConfig.Length = 10; // // UT2003 game types // GameConfig[0].GameClass="XGame.xDeathMatch";GameConfig[0].Prefix="DM";GameConfig[0].Acronym="DM";GameConfig[0].GameName="DeathMatch";GameConfig[0].Mutators="";GameConfig[0].Options=""; // GameConfig[1].GameClass="XGame.xTeamGame";GameConfig[1].Prefix="DM";GameConfig[1].Acronym="TDM";GameConfig[1].GameName="Team DeathMatch";GameConfig[1].Mutators="";GameConfig[1].Options=""; // GameConfig[2].GameClass="XGame.xDoubleDom";GameConfig[2].Prefix="DOM";GameConfig[2].Acronym="DOM";GameConfig[2].GameName="Double Domination";GameConfig[2].Mutators="";GameConfig[2].Options=""; // GameConfig[3].GameClass="XGame.xCTFGame";GameConfig[3].Prefix="CTF";GameConfig[3].Acronym="CTF";GameConfig[3].GameName="Capture the Flag";GameConfig[3].Mutators="";GameConfig[3].Options=""; // GameConfig[4].GameClass="XGame.xBombingRun";GameConfig[4].Prefix="BR";GameConfig[4].Acronym="BR";GameConfig[4].GameName="Bombing Run";GameConfig[4].Mutators="";GameConfig[4].Options=""; // // bonus pack game types // GameConfig[5].GameClass="BonusPack.xMutantGame";GameConfig[5].Prefix="DM";GameConfig[5].Acronym="MUT";GameConfig[5].GameName="Mutant";GameConfig[5].Mutators="";GameConfig[5].Options=""; // GameConfig[6].GameClass="BonusPack.xLastManStandingGame";GameConfig[6].Prefix="DM";GameConfig[6].Acronym="LMS";GameConfig[6].GameName="Last Man Standing";GameConfig[6].Mutators="";GameConfig[6].Options=""; // GameConfig[7].GameClass="SkaarjPack.Invasion";GameConfig[7].Prefix="DM";GameConfig[7].Acronym="INV";GameConfig[7].GameName="Invasion";GameConfig[7].Mutators="";GameConfig[7].Options=""; // // UT2004 game types // GameConfig[8].GameClass="Onslaught.ONSOnslaughtGame";GameConfig[8].Prefix="ONS";GameConfig[8].Acronym="ONS";GameConfig[8].GameName="Onslaught";GameConfig[8].Mutators="";GameConfig[8].Options=""; // GameConfig[9].GameClass="UT2k4Assault.ASGameInfo";GameConfig[9].Prefix="AS";GameConfig[9].Acronym="AS";GameConfig[9].GameName="Assault";GameConfig[9].Mutators="";GameConfig[9].Options=""; } MapCount = 0; for(i=0;i < GameConfig.Length;i++) if(GameConfig[i].GameClass != "") log(GameConfig[i].GameName,'MapVote'); log("MapListLoaderType = " $ MapListLoaderType,'MapVote'); MapListLoaderClass = class(DynamicLoadObject(MapListLoaderType, class'Class')); Loader = spawn(MapListLoaderClass); if(Loader == None) // Failed to spawn MapListLoader Loader = spawn(class'DefaultMapListLoader'); // default Loader.LoadMapList(self); log(MapCount $ " maps loaded.",'MapVote'); History.Save(); if(bEliminationMode) { // Count the Remaining Enabled maps EnabledMapCount = 0; for(i=0;i -1 && PrevGameVote > -1 ) UpdateVoteCount(PrevMapVote, PrevGameVote, -MVRI[Index].VoteCount); // undo previous vote MVRI[Index].VoteCount = VoteCount; TallyVotes(false); } //------------------------------------------------------------------------------------------------ function bool IsValidVote(int MapIndex, int GameIndex) { local int i; local array PrefixList; // check if the maps prefix is one listed for the gametype Split(GameConfig[GameIndex].Prefix, ",", PrefixList); for( i=0; i 0) // add new if not found { x = MapVoteCount.Length; MapVoteCount.Insert(x,1); MapVoteCount[x].GameConfigIndex = GameIndex; MapVoteCount[x].MapIndex = MapIndex; MapVoteCount[x].VoteCount = VoteCount; MVCData = MapVoteCount[x]; } // send update to all players for( i=0; i VoteCount; local array Ranking; local int PlayersThatVoted; local int TieCount; local string CurrentMap; local int Votes; local MapHistoryInfo MapInfo; if(bLevelSwitchPending) return; PlayersThatVoted = 0; VoteCount.Length = GameConfig.Length * MapCount; // note: VoteCount array is a 2 dimension array VoteCount[GameConfigIndex, MapIndex] // Maps -> // 0 1 2 3 4 5 6 7 8 // G - - - - - - - - - // a 0 |0 0 0 0 0 0 0 2 0 // m 1 |0 0 0 2 0 0 0 0 0 // e 2 |0 6 0 0 0 5 0 0 0 // s 3 |0 0 0 3 0 0 0 0 0 for(x=0;x < MVRI.Length;x++) // for each player { if(MVRI[x] != none && MVRI[x].MapVote > -1 && MVRI[x].GameVote > -1) // if this player has voted { PlayersThatVoted++; if(bScoreMode) { if(bAccumulationMode) Votes = GetAccVote(MVRI[x].PlayerOwner) + int(GetPlayerScore(MVRI[x].PlayerOwner)); else Votes = int(GetPlayerScore(MVRI[x].PlayerOwner)); } else { // Not Score Mode == Majority (one vote per player) if(bAccumulationMode) Votes = GetAccVote(MVRI[x].PlayerOwner) + 1; else Votes = 1; } VoteCount[MVRI[x].GameVote * MapCount + MVRI[x].MapVote] = VoteCount[MVRI[x].GameVote * MapCount + MVRI[x].MapVote] + Votes; if(!bScoreMode) { // If more then half the players voted for the same map as this player then force a winner if(Level.Game.NumPlayers > 2 && float(VoteCount[MVRI[x].GameVote * MapCount + MVRI[x].MapVote]) / float(Level.Game.NumPlayers) > 0.5 && Level.Game.bGameEnded) bForceMapSwitch = true; } } } log("___Voted - " $ PlayersThatVoted,'MapVoteDebug'); if(Level.Game.NumPlayers > 2 && !Level.Game.bGameEnded && !bMidGameVote && (float(PlayersThatVoted) / float(Level.Game.NumPlayers)) * 100 >= MidGameVotePercent) // Mid game vote initiated { Level.Game.Broadcast(self,lmsgMidGameVote); bMidGameVote = true; // Start voting count-down timer TimeLeft = VoteTimeLimit; ScoreBoardTime = 1; settimer(1,true); } index = 0; for(x=0;x < VoteCount.Length;x++) // for each map { if(VoteCount[x] > 0) { Ranking.Insert(index,1); Ranking[index++] = x; // copy all vote indexes to the ranking list if someone has voted for it. } } if(PlayersThatVoted > 1) { // bubble sort ranking list by vote count for(x=0; x 1) // need more than one player vote for a tie { if(index > 1 && VoteCount[Ranking[0]] == VoteCount[Ranking[1]] && VoteCount[Ranking[0]] != 0) { TieCount = 1; for(x=1; x int Rand( int Max ); Returns a random number from 0 to Max-1. topmap = Ranking[Rand(TieCount)]; // Don't allow same map to be choosen CurrentMap = GetURLMap(); r = 0; while(MapList[topmap - (topmap/MapCount) * MapCount].MapName ~= CurrentMap) { topmap = Ranking[Rand(TieCount)]; if(r++>100) break; // just incase } } else { topmap = Ranking[0]; } } // if everyone has voted go ahead and change map if(bForceMapSwitch || (Level.Game.NumPlayers == PlayersThatVoted && Level.Game.NumPlayers > 0) ) { if(MapList[topmap - topmap/MapCount * MapCount].MapName == "") return; TextMessage = lmsgMapWon; TextMessage = repl(TextMessage,"%mapname%",MapList[topmap - topmap/MapCount * MapCount].MapName $ "(" $ GameConfig[topmap/MapCount].Acronym $ ")"); Level.Game.Broadcast(self,TextMessage); CloseAllVoteWindows(); MapInfo = History.PlayMap(MapList[topmap - topmap/MapCount * MapCount].MapName); ServerTravelString = SetupGameMap(MapList[topmap - topmap/MapCount * MapCount], topmap/MapCount, MapInfo); log("ServerTravelString = " $ ServerTravelString ,'MapVoteDebug'); History.Save(); if(bEliminationMode) RepeatLimit++; if(bAccumulationMode) SaveAccVotes(topmap - topmap/MapCount * MapCount, topmap/MapCount); //if(bEliminationMode || bAccumulationMode) CurrentGameConfig = topmap/MapCount; if( !bAutoDetectMode ) SaveConfig(); bLevelSwitchPending = true; settimer(Level.TimeDilation,true); // timer() will monitor the server-travel and detect a failure Level.ServerTravel(ServerTravelString, false); // change the map } } //------------------------------------------------------------------------------------------------ event timer() { local int mapidx,gameidx,i; local MapHistoryInfo MapInfo; if(bLevelSwitchPending) { if( Level.NextURL == "" ) { if(Level.NextSwitchCountdown < 0) // if negative then level switch failed { Log("___Map change Failed, bad or missing map file.",'MapVote'); GetDefaultMap(mapidx, gameidx); MapInfo = History.PlayMap(MapList[mapidx].MapName); ServerTravelString = SetupGameMap(MapList[mapidx], gameidx, MapInfo); log("ServerTravelString = " $ ServerTravelString ,'MapVoteDebug'); History.Save(); Level.ServerTravel(ServerTravelString, false); // change the map } } return; } if(ScoreBoardTime > -1) { if(ScoreBoardTime == 0) OpenAllVoteWindows(); ScoreBoardTime--; return; } TimeLeft--; if(TimeLeft == 60 || TimeLeft == 30 || TimeLeft == 20 || TimeLeft == 10) // play announcer count down voice { //log("___CountDown " $ TimeLeft,'MapVoteDebug'); //BroadcastLocalizedMessage(class'MapVoteCountDownMsg', TimeLeft); for( i=0; i 0 ) // play announcer voice Count Down // BroadcastLocalizedMessage(class'VotingTimerMessage', TimeLeft); if(TimeLeft == 0) // force level switch if time limit is up TallyVotes(true); // if no-one has voted a random map will be choosen } //------------------------------------------------------------------------------------------------ function CloseAllVoteWindows() { local int i; for(i=0; i < MVRI.Length;i++) { if(MVRI[i] != none) { //log("___Closing window " $ i,'MapVoteDebug'); MVRI[i].CloseWindow(); } } } //------------------------------------------------------------------------------------------------ function OpenAllVoteWindows() { local int i; for(i=0; i < MVRI.Length;i++) { if(MVRI[i] != none) { //log("Opening window " $ i,'MapVoteDebug'); MVRI[i].OpenWindow(); } } } //------------------------------------------------------------------------------------------------ function string SetupGameMap(MapVoteMapList MapInfo, int GameIndex, MapHistoryInfo MapHistoryInfo) { local string ReturnString; local string MutatorString; local string OptionString; // Add Per-GameType Mutators if(GameConfig[GameIndex].Mutators != "") MutatorString = MutatorString $ GameConfig[GameIndex].Mutators; // Add Per-Map Mutators if(MapHistoryInfo.U != "") MutatorString = MutatorString $ "," $ MapHistoryInfo.U; // Add Per-GameType Game Options if(GameConfig[GameIndex].Options != "") OptionString = OptionString $ Repl(Repl(GameConfig[GameIndex].Options,",","?")," ",""); // Add Per-Map Game Options if(MapHistoryInfo.G != "") OptionString = OptionString $ "?" $ MapHistoryInfo.G; // create URL ReturnString = MapInfo.MapName; //$ ".ut2"; ReturnString = ReturnString $ "?Game=" $ GameConfig[GameIndex].GameClass; if(MutatorString != "") ReturnString = ReturnString $ "?Mutator=" $ MutatorString; if(OptionString != "") ReturnString = ReturnString $ "?" $ OptionString; return ReturnString; } //------------------------------------------------------------------------------------------------ function bool HandleRestartGame() { local int i; // Called by GameInfo.RestartGame at End Of Game // Return False to prevent traveling to next map log("____HandleRestartGame", 'MapVoteDebug'); // disable voting in single player mode if( Level.NetMode == NM_StandAlone ) return true; if( bMatchSetup ) // check if any match setup in progress { for( i=0; i 0) { // Find the players name in the saved accumulated votes for(x=0;x 0) { for(x=0;x=0;x--) { if(AccInfo[x].Name == "") { //log("Removeing " $ AccInfo[x].Name); AccInfo.Remove(x,1); } } } // Add players who have not voted for(C=Level.ControllerList;C!=None;C=C.NextController) { P = PlayerController(C); if(C.bIsPlayer && P != None) { bFound = false; if(AccInfo.Length > 0) { for(x=0;x PrefixList; local bool bLoop; if(MapCount <= 0) return; // set the default gametype if(bDefaultToCurrentGameType) GCIdx = CurrentGameConfig; else GCIdx = DefaultGameConfig; // Parse Prefix list for default game type PrefixList.Length = 0; p = Split(GameConfig[GCIdx].Prefix, ",", PrefixList); if(PrefixList.Length == 0) { gameidx = GCIdx; mapidx = 0; return; } // choose a map at random, check if it is enabled and the prefix is in the prefix list r=0; bLoop = True; while(bLoop) { i = Rand(MapCount); if( MapList[i].bEnabled ) { for(x=0; x < PrefixList.Length; x++) { if( left(MapList[i].MapName, len(PrefixList[x])) ~= PrefixList[x] ) { bLoop = false; break; } } } if(bLoop && r++ > 100) { // give up after 100 unsuccessful attempts. // find the first map that matches up to default gametype for(i=0;i<=MapCount;i++) { if( MapList[i].bEnabled ) { for(x=0; x < PrefixList.Length; x++) { if( left(MapList[i].MapName, len(PrefixList[x])) ~= PrefixList[x] ) { // ding ding ding, found one bLoop = false; break; } } } } if(bLoop) // still didnt find any, then find the first enabled map and find its gameconfig { for(i=0;i<=MapCount;i++) { if( MapList[i].bEnabled ) { // find prefix in GameConfigs for(y=0;y 0) { for(x=0; x < PrefixList.Length; x++) { if( left(MapList[i].MapName, len(PrefixList[x])) ~= PrefixList[x] ) { // ding ding ding, found one GCIdx = y; bLoop = false; break; } } } if(!bLoop) break; } break; } } } break; } } gameidx = GCIdx; mapidx = i; log("Default Map Choosen = " $ MapList[mapidx].MapName $ "(" $ GameConfig[gameidx].Acronym $ ")",'MapVoteDebug'); } //================================================================================================ // Kick Voting //================================================================================================ function SubmitKickVote(int PlayerID, Actor Voter) { local int VoterID, VictumID, i, PreviousVote; local bool bFound; local string PlayerName; log("SubmitKickVote " $ PlayerID, 'MapVoteDebug'); if(bLevelSwitchPending || !bKickVote) return; VoterID = GetMVRIIndex(PlayerController(Voter)); // Find Player bFound = false; for(i=0;i < MVRI.Length;i++) { if(MVRI[i] != none && MVRI[i].PlayerOwner.PlayerReplicationInfo.PlayerID == PlayerID) { bFound = true; VictumID = i; PlayerName = MVRI[i].PlayerOwner.PlayerReplicationInfo.PlayerName; break; } } if(!bFound) return; if( MVRI[VoterID].KickVote == VictumID ) // if vote is for same player stop return; if( PlayerController(Voter).PlayerReplicationInfo.bAdmin ) // Administrator Vote { log("___Admin " $ PlayerController(Voter).PlayerReplicationInfo.PlayerName $ " kicked " $ PlayerName,'MapVote'); KickPlayer(VictumID); return; } if( PlayerController(Voter).PlayerReplicationInfo.bOnlySpectator ) { // Spectators cant vote PlayerController(Voter).ClientMessage(lmsgSpectatorsCantVote); return; } // cant kick admin if(MVRI[VictumID].PlayerOwner.PlayerReplicationInfo.bAdmin || NetConnection(MVRI[VictumID].PlayerOwner.Player) == None) { TextMessage = lmsgKickVoteAdmin; TextMessage = repl(TextMessage,"%playername%",PlayerController(Voter).PlayerReplicationInfo.PlayerName); Level.Game.Broadcast(self,TextMessage); return; } log("___" $ PlayerController(Voter).PlayerReplicationInfo.PlayerName $ " placed a kick vote against " $ PlayerName,'MapVote'); if(bAnonymousKicking) { TextMessage = lmsgAnonymousKickVote; TextMessage = repl(TextMessage,"%playername%",PlayerName); Level.Game.Broadcast(self,TextMessage); } else { TextMessage = lmsgKickVote; TextMessage = repl(TextMessage,"%playername1%",PlayerController(Voter).PlayerReplicationInfo.PlayerName); TextMessage = repl(TextMessage,"%playername2%",PlayerName); Level.Game.Broadcast(self,TextMessage); } PreviousVote = MVRI[VoterID].KickVote; MVRI[VoterID].KickVote = VictumID; UpdateKickVoteCount(MVRI[VictumID].PlayerID, 1); if( PreviousVote > -1 ) UpdateKickVoteCount(MVRI[PreviousVote].PlayerID, -1); // undo previous vote TallyKickVotes(); } //------------------------------------------------------------------------------------------------ function UpdateKickVoteCount(int PlayerID, int VoteCountDelta) { local int x,i; local bool bFound; if( PlayerID < 0 ) return; // search for matching record for( x=0; x 0) // add new if not found { x = KickVoteCount.Length; KickVoteCount.Insert(x,1); KickVoteCount[x].PlayerID = PlayerID; KickVoteCount[x].KickVoteCount = 1; } // send update to all players for( i=0; i VoteCount; local array Ranking; VoteCount.Length = MVRI.Length; // tally up the votes for(i=0;i < MVRI.Length;i++) { if(MVRI[i] != None && MVRI[i].KickVote != -1) // if this player has voted { PlayersThatVoted++; VoteCount[MVRI[i].KickVote]++; // increment the votecount for this player } } index = 0; for(i=0;i < VoteCount.Length;i++) // for each player { if(VoteCount[i] > 0) { Ranking.Insert(index,1); Ranking[index++] = i; } } if(PlayersThatVoted > 1) { // bubble sort ranking list by vote count for(x=0; x 2 && ((float(VoteCount[Lamer])/float(Level.Game.NumPlayers))*100 >= KickPercent)) if(((float(VoteCount[Lamer])/float(Level.Game.NumPlayers))*100 >= KickPercent)) { KickPlayer(Lamer); return; } } //------------------------------------------------------------------------------------------------ function KickPlayer(int PlayerIndex) { local int i; if( MVRI[PlayerIndex] == none || MVRI[PlayerIndex].PlayerOwner == none ) return; TextMessage = "%playername% has been kicked."; TextMessage = repl(TextMessage,"%playername%",MVRI[PlayerIndex].PlayerOwner.PlayerReplicationInfo.PlayerName); Level.Game.Broadcast(self,TextMessage); if(bKickVote) { // Reset votes for(i=0;i < MVRI.Length;i++) { if(MVRI[i] != None && MVRI[i].KickVote != -1) MVRI[i].KickVote = -1; } } //close his/her voting window if open if(MVRI[PlayerIndex] != None) MVRI[PlayerIndex].CloseWindow(); log("___" $ MVRI[PlayerIndex].PlayerOwner.PlayerReplicationInfo.PlayerName $ " has been kicked.",'MapVote'); Level.Game.AccessControl.BanPlayer(MVRI[PlayerIndex].PlayerOwner, True); // session type ban } //================================================================================================ // MatchSetup //================================================================================================ function bool MatchSetupLogin(string UserID, string Password, Actor Requestor, out int SecLevel) { local xAdminUser AdminUser; if( bMatchSetup && PlayerController(Requestor) != none ) { if( UserID ~= "Admin" && PlayerController(Requestor).PlayerReplicationInfo.bAdmin ) { SecLevel = 255; return True; // this user is already logged in as an administrator } if( Level.Game.AccessControl.AdminLogin( PlayerController(Requestor), UserID, Password) ) { // Xm = MatchSetup Priv if( Level.Game.AccessControl.CanPerform(PlayerController(Requestor), "Xm") ) { Log(UserID $ " has logged in to MatchSetup."); AdminUser = Level.Game.AccessControl.GetUser(UserID); if( AdminUser != none ) SecLevel = AdminUser.MaxSecLevel(); else SecLevel = 0; // hack for default AccessControl setup if( SecLevel == 0 && PlayerController(Requestor).PlayerReplicationInfo.bAdmin ) SecLevel = 255; Log("SecLevel = " $ SecLevel); return True; } else { log(UserID $ " doesnt have MatchSetup permissions."); PlayerController(Requestor).ClientMessage(lmsgMatchSetupPermission); Return False; } } else { Log(UserID $ " password was invalid."); PlayerController(Requestor).ClientMessage(lmsgInvalidPassword); return False; } } } //------------------------------------------------------------------------------------------------ function MatchSetupLogout(Actor Requestor) { if( bMatchSetup && PlayerController(Requestor) != none ) Level.Game.AccessControl.AdminLogout( PlayerController(Requestor) ); } //================================================================================================ // Configuration //================================================================================================ static function FillPlayInfo(PlayInfo PlayInfo) { // this sends configuration settings to ether the WebAdmin, Server Rules GUI, // or MatchSetup via the PlayInfo class. Super.FillPlayInfo(PlayInfo); PlayInfo.AddSetting(default.MapVoteGroup,"bMapVote",default.PropsDisplayText[0],0,1,"Check",,,True,False); PlayInfo.AddSetting(default.MapVoteGroup,"bAutoOpen",default.PropsDisplayText[1],0,1,"Check",,,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"ScoreBoardDelay",default.PropsDisplayText[2],0,1,"Text","3;0:60",,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"bScoreMode",default.PropsDisplayText[3],0,1,"Check",,,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"bAccumulationMode",default.PropsDisplayText[4],0,1,"Check",,,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"bEliminationMode",default.PropsDisplayText[5],0,1,"Check",,,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"MinMapCount",default.PropsDisplayText[6],0,1,"Text","4;1:9999",,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"RepeatLimit",default.PropsDisplayText[7],0,1,"Text","4;0:9999",,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"VoteTimeLimit",default.PropsDisplayText[8],0,1,"Text","3;10:300",,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"MidGameVotePercent",default.PropsDisplayText[9],0,1,"Text","3;1:100",,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"bDefaultToCurrentGameType",default.PropsDisplayText[10],0,1,"Check",,,True,True); PlayInfo.AddSetting(default.MapVoteGroup,"GameConfig",default.PropsDisplayText[15],0, 1,"Custom",";;"$default.GameConfigPage,,True,True); //PlayInfo.AddSetting(default.MapVoteGroup,"MapListLoaderType",default.PropsDisplayText[16],0, 1,"Custom",";;"$default.MapListConfigPage,,True,True); PlayInfo.AddSetting(default.KickVoteGroup,"bKickVote",default.PropsDisplayText[11],0,1,"Check",,,True,True); PlayInfo.AddSetting(default.KickVoteGroup,"KickPercent",default.PropsDisplayText[12],0,1,"Text","3;1:100",,True,True); PlayInfo.AddSetting(default.KickVoteGroup,"bAnonymousKicking",default.PropsDisplayText[13],0,1,"Check",,,True,True); PlayInfo.AddSetting(default.ServerGroup,"bMatchSetup",default.PropsDisplayText[14],0,1,"Check",,,True,True); class'DefaultMapListLoader'.static.FillPlayInfo(PlayInfo); PlayInfo.PopClass(); } static event bool AcceptPlayInfoProperty(string PropertyName) { if ( class'LevelInfo'.static.IsDemoBuild() ) return false; switch ( PropertyName ) { case "bMapVote": case "bAutoOpen": case "ScoreBoardDelay": case "bScoreMode": case "bAccumulationMode": case "bEliminationMode": case "MinMapCount": case "RepeatLimit": case "VoteTimeLimit": case "MidGameVotePercent": case "bDefaultToCurrentGameType": case "GameConfig": case "MapListLoaderType": return MAPVOTEALLOWED; case "bKickVote": case "KickPercent": case "bAnonymousKicking": return KICKVOTEALLOWED; case "bMatchSetup": return MATCHSETUPALLOWED; } return Super.AcceptPlayInfoProperty(PropertyName); } //------------------------------------------------------------------------------------------------ static event string GetDescriptionText(string PropName) { switch (PropName) { case "bMapVote": return default.PropDescription[0]; case "bAutoOpen": return default.PropDescription[1]; case "ScoreBoardDelay": return default.PropDescription[2]; case "bScoreMode": return default.PropDescription[3]; case "bAccumulationMode": return default.PropDescription[4]; case "bEliminationMode": return default.PropDescription[5]; case "MinMapCount": return default.PropDescription[6]; case "RepeatLimit": return default.PropDescription[7]; case "VoteTimeLimit": return default.PropDescription[8]; case "MidGameVotePercent": return default.PropDescription[9]; case "bDefaultToCurrentGameType": return default.PropDescription[10]; case "bKickVote": return default.PropDescription[11]; case "KickPercent": return default.PropDescription[12]; case "bAnonymousKicking": return default.PropDescription[13]; case "bMatchSetup": return default.PropDescription[14]; case "GameConfig": return default.PropDescription[15]; case "MapListLoaderType": return default.PropDescription[16]; } return ""; } //------------------------------------------------------------------------------------------------ function string GetConfigArrayData(string ConfigArrayName, int RowIndex, int ColumnIndex) { switch( Caps(ConfigArrayName) ) { case "GAMECONFIG": if( RowIndex > GameConfig.Length-1 || ColumnIndex > 5 ) return ""; switch( ColumnIndex ) { case 0: return "GAMETYPE;50;" $ GameConfig[RowIndex].GameClass; case 1: return "TEXT;50;" $ GameConfig[RowIndex].Prefix; case 2: return "TEXT;20;" $ GameConfig[RowIndex].Acronym; case 3: return "TEXT;50;" $ GameConfig[RowIndex].GameName; case 4: return "MUTATORS;255;" $ GameConfig[RowIndex].Mutators; case 5: return "TEXT;255;" $ GameConfig[RowIndex].Options; default: return ""; } break; case "MAPLIST": // TODO: * break; } } //------------------------------------------------------------------------------------------------ function string GetConfigArrayColumnTitle(string ConfigArrayName, int ColumnIndex) { switch( Caps(ConfigArrayName) ) { case "GAMECONFIG": if( ColumnIndex > 5 || ColumnIndex < 0 ) return ""; return lmsgGameConfigColumnTitle[ColumnIndex]; case "MAPLIST": // TODO: * break; } } //------------------------------------------------------------------------------------------------ function DeleteConfigArrayItem(string ConfigArrayName, int RowIndex) { switch( Caps(ConfigArrayName) ) { case "GAMECONFIG": if( RowIndex < 0 || RowIndex > GameConfig.Length-1 ) return; GameConfig.Remove(RowIndex,1); return; case "MAPLIST": // TODO: * break; } } //------------------------------------------------------------------------------------------------ function int AddConfigArrayItem(string ConfigArrayName) { switch( Caps(ConfigArrayName) ) { case "GAMECONFIG": GameConfig.Insert(GameConfig.Length,1); GameConfig[GameConfig.Length-1].GameClass = "XGame.xDeathMatch"; GameConfig[GameConfig.Length-1].Prefix = ""; GameConfig[GameConfig.Length-1].Acronym = ""; GameConfig[GameConfig.Length-1].GameName = "new"; GameConfig[GameConfig.Length-1].Mutators = ""; GameConfig[GameConfig.Length-1].Options = ""; return GameConfig.Length-1; case "MAPLIST": // TODO: * break; } } //------------------------------------------------------------------------------------------------ function UpdateConfigArrayItem(string ConfigArrayName, int RowIndex, int ColumnIndex, string NewValue) { switch( Caps(ConfigArrayName) ) { case "GAMECONFIG": if( RowIndex < 0 || RowIndex > GameConfig.Length-1 || ColumnIndex > 5 ) return; switch( ColumnIndex ) { case 0: GameConfig[RowIndex].GameClass = NewValue; break; case 1: GameConfig[RowIndex].Prefix = NewValue; break; case 2: GameConfig[RowIndex].Acronym = NewValue; break; case 3: GameConfig[RowIndex].GameName = NewValue; break; case 4: GameConfig[RowIndex].Mutators = NewValue; break; case 5: GameConfig[RowIndex].Options = NewValue; break; } return; case "MAPLIST": // TODO: * break; } } //------------------------------------------------------------------------------------------------ function int GetConfigArrayItemCount(string ConfigArrayName) { switch( Caps(ConfigArrayName) ) { case "GAMECONFIG": return GameConfig.Length; case "MAPLIST": // TODO: * break; } } //------------------------------------------------------------------------------------------------ function ReloadAll( optional bool bParam ) { // TODO: ReloadAll ReloadMatchConfig(bParam,bParam); } //------------------------------------------------------------------------------------------------ function PropagateValue( VotingReplicationInfo Sender, string Type, string SettingName, string NewValue ) { local int i; // BroadCast change to all other MatchSetup users. for( i=0; i TickedReplicationQueue; var array MapList; var int MapCount; // total count of maps var array GameConfig; // game types var int GameConfigCount; // total count of game types var int CurrentGameConfig; var bool bWaitingForReply; // used in replication var array MapVoteCount; // holds vote counts var array KickVoteCount; // holds vote counts var int MapVote; // Index of the map that the owner has voted for var int VoteCount; var int GameVote; // Index of the Game type that the owner has voted for var int KickVote; // PlayerID of the that the owner has voted against to kick var PlayerController PlayerOwner; // player this RI belongs too var int PlayerID; // PlayerID of the owner. Needed to match up when player disconnects and owner == none var byte Mode; // voting mode enum var bool bMapVote; // Map voting enabled var bool bKickVote; // Kick voting enabled var bool bMatchSetup; // MatchSetup enabled var bool bMatchSetupPermitted; // owner is logged in as a MatchSetup user. var bool bMatchSetupAccepted; // owner has accept the current match settings var bool bSendingMatchSetup; // currently sending match setup stuff to client var int SecurityLevel; // matchsetup users security level var config bool bDebugLog; var() name CountDownSounds[60]; var int CountDown; var xVotingHandler VH; // localization var localized string lmsgSavedAsDefaultSuccess, lmsgNotAllAccepted; // Client Response Identifiers var string MapID, MutatorID, OptionID, GeneralID; var string URLID, StatusID, MatchSetupID, LoginID, CompleteID; var string AddID, RemoveID, UpdateID, FailedID, TournamentID, DemoRecID, GameTypeID; //------------------------------------------------------------------------------------------------ replication { // Variables the server should send to the client only initially reliable if( Role==ROLE_Authority && bNetInitial) PlayerOwner, MapCount, GameConfigCount, bKickVote, bMapVote, bMatchSetup, CurrentGameConfig; //bIsSpectator; // Variables or Functions the server should send to the client and keep updated if MapVoting enabled reliable if( Role==ROLE_Authority && bMapVote) ReceiveGameConfig, ReceiveMapInfo, CloseWindow, OpenWindow, ReceiveMapVoteCount, ReceiveKickVoteCount, Mode, PlayCountDown; // Functions the server should send to the client if KickVoting enabled reliable if( Role==ROLE_Authority && bKickVote) SendPlayerID; // Variables or Functions the server should send to the client // and keep updated if MatchSetup is enabled reliable if( Role==ROLE_Authority && bMatchSetup ) bMatchSetupPermitted, bMatchSetupAccepted, SecurityLevel; // functions the client calls on the server reliable if( Role < ROLE_Authority ) ReplicationReply, SendMapVote, SendKickVote, MatchSetupLogin, RequestMatchSettings, MatchSettingsSubmit, SaveAsDefault, RestoreDefaultProfile, MatchSetupLogout, RequestPlayerIP; } //------------------------------------------------------------------------------------------------ event PostBeginPlay() { Super.PostBeginPlay(); PlayerOwner = PlayerController(Owner); VH = xVotingHandler(Level.Game.VotingHandler); } simulated event PostNetBeginPlay() { DebugLog("____VotingReplicationInfo.PostNetBeginPlay"); Super.PostNetBeginPlay(); GetServerData(); } simulated event PostNetReceive() { bNetNotify = NeedNetNotify(); if ( !bNetNotify && Owner == None ) SetOwner(PlayerOwner); } simulated function bool NeedNetNotify() { return PlayerOwner == None; } simulated function GUIController GetController() { if ( Level.NetMode == NM_ListenServer || Level.NetMode == NM_Client ) { if ( PlayerOwner != None && PlayerOwner.Player != None ) return GUIController(PlayerOwner.Player.GUIController); } return None; } //------------------------------------------------------------------------------------------------ simulated function GetServerData() { // grab data from VotingHandler on server side if( Level.NetMode != NM_Client ) { bKickVote = VH.bKickVote; bMapVote = VH.bMapVote; bMatchSetup = VH.bMatchSetup; MapCount = VH.MapCount; GameConfigCount = VH.GameConfig.Length; if( bMapVote ) { Mode = byte(VH.bEliminationMode); Mode += byte(VH.bScoreMode) * 2; Mode += byte(VH.bAccumulationMode) * 4; CurrentGameConfig = VH.CurrentGameConfig; AddToTickedReplicationQueue(REPDATATYPE_GameConfig, GameConfigCount-1); AddToTickedReplicationQueue(REPDATATYPE_MapList, MapCount-1); if( VH.MapVoteCount.Length > 0 ) AddToTickedReplicationQueue(REPDATATYPE_MapVoteCount, VH.MapVoteCount.Length-1); } if( bKickVote && VH.KickVoteCount.Length > 0 ) AddToTickedReplicationQueue(REPDATATYPE_KickVoteCount, VH.KickVoteCount.Length-1); } } //------------------------------------------------------------------------------------------------ simulated function Tick(float DeltaTime) { local int i; local bool bDedicated, bListening; if( TickedReplicationQueue.Length == 0 || bWaitingForReply) return; bDedicated = Level.NetMode == NM_DedicatedServer || (Level.NetMode == NM_ListenServer && PlayerOwner != none && PlayerOwner.Player.Console == none ); bListening = Level.NetMode == NM_ListenServer && PlayerOwner != none && PlayerOwner.Player.Console != none; if( !bDedicated && !bListening ) return; i = TickedReplicationQueue.Length - 1; switch( TickedReplicationQueue[i].DataType ) { case REPDATATYPE_GameConfig: TickedReplication_GameConfig(TickedReplicationQueue[i].Index, bDedicated); break; case REPDATATYPE_MapList: TickedReplication_MapList(TickedReplicationQueue[i].Index, bDedicated); break; case REPDATATYPE_MapVoteCount: TickedReplication_MapVoteCount(TickedReplicationQueue[i].Index, bDedicated); break; case REPDATATYPE_KickVoteCount: TickedReplication_KickVoteCount(TickedReplicationQueue[i].Index, bDedicated); break; case REPDATATYPE_MatchConfig: TickedReplication_MatchConfig(TickedReplicationQueue[i].Index, bDedicated); break; case REPDATATYPE_Maps: TickedReplication_Maps(TickedReplicationQueue[i].Index, bDedicated); break; case REPDATATYPE_Mutators: TickedReplication_Mutators(TickedReplicationQueue[i].Index, bDedicated); break; } TickedReplicationQueue[i].Index++; if( TickedReplicationQueue[i].Index > TickedReplicationQueue[i].Last ) TickedReplicationQueue.Remove(i,1); } //------------------------------------------------------------------------------------------------ function AddToTickedReplicationQueue(RepDataType Type, int Last) { if( Last > -1 ) { TickedReplicationQueue.Insert(0,1); TickedReplicationQueue[0].DataType = Type; TickedReplicationQueue[0].Index = 0; TickedReplicationQueue[0].Last = Last; } } //------------------------------------------------------------------------------------------------ function TickedReplication_GameConfig(int Index, bool bDedicated) { local VotingHandler.MapVoteGameConfigLite GameConfigItem; GameConfigItem = VH.GetGameConfig(Index); DebugLog("___Sending " $ Index $ " - " $ GameConfigItem.GameName); if( bDedicated ) { ReceiveGameConfig(GameConfigItem); // replicate one GameConfig each tick bWaitingForReply = True; } else GameConfig[GameConfig.Length] = GameConfigItem; } //------------------------------------------------------------------------------------------------ function TickedReplication_MapList(int Index, bool bDedicated) { local VotingHandler.MapVoteMapList MapInfo; MapInfo = VH.GetMapList(Index); DebugLog("___Sending " $ Index $ " - " $ MapInfo.MapName); if( bDedicated ) { ReceiveMapInfo(MapInfo); // replicate one map each tick until all maps are replicated. bWaitingForReply = True; } else MapList[MapList.Length] = MapInfo; } //------------------------------------------------------------------------------------------------ function TickedReplication_MatchConfig(int Index, bool bDedicated) { local MatchConfig MatchProfile; local PlayInfo.PlayInfoData PIData; if( Index < 6 ) { MatchProfile = VH.MatchProfile; switch( Index ) { case 0: SendClientResponse( GeneralID, UpdateID $ Chr(27) $ GameTypeID, MatchProfile.GameClassString); break; case 1: SendClientResponse( MapID, UpdateID, MatchProfile.MapIndexList ); break; case 2: SendClientResponse( MutatorID, UpdateID, MatchProfile.MutatorIndexList ); break; case 3: SendClientResponse( GeneralID, UpdateId $ Chr(27) $ URLID, MatchProfile.Parameters ); break; case 4: SendClientResponse( GeneralID, UpdateId $ Chr(27) $ TournamentID, string(MatchProfile.bTournamentMode) ); break; case 5: SendClientResponse( GeneralID, UpdateID $ Chr(27) $ DemoRecID, MatchProfile.DemoRecFileName ); break; } bWaitingForReply = bDedicated; } else { DebugLog("___Sending " $ VH.MatchProfile.PInfo.Settings[Index-6].SettingName); PIData = VH.MatchProfile.PInfo.Settings[Index-6]; if( PIData.ArrayDim == -1) // no array properties (cant handle them) { SendClientResponse( OptionID, AddID, PIData.SettingName $ Chr(27) $ PIData.ClassFrom $ Chr(27) $ PIData.Value ); bWaitingForReply = bDedicated; } } } //------------------------------------------------------------------------------------------------ function TickedReplication_MapVoteCount(int Index, bool bDedicated) { DebugLog("___Sending MapVoteCountIndex " $ Index); if( bDedicated ) { ReceiveMapVoteCount(VH.MapVoteCount[Index], True); bWaitingForReply = True; } else MapVoteCount[MapVoteCount.Length] = VH.MapVoteCount[Index]; } //------------------------------------------------------------------------------------------------ function TickedReplication_KickVoteCount(int Index, bool bDedicated) { DebugLog("___Sending KickVoteCountIndex " $ Index); if( bDedicated ) { ReceiveKickVoteCount(VH.KickVoteCount[Index], True); bWaitingForReply = True; } else KickVoteCount[KickVoteCount.Length] = VH.KickVoteCount[Index]; } //------------------------------------------------------------------------------------------------ function TickedReplication_Maps(int Index, bool bDedicated) { DebugLog("TickedReplication_Maps " $ Index $ ", " $ VH.MatchProfile.Maps[Index].MapName); SendClientResponse(MapID, AddID, Index $ "," $ VH.MatchProfile.Maps[Index].MapName); bWaitingForReply = bDedicated; } //------------------------------------------------------------------------------------------------ function TickedReplication_Mutators(int Index, bool bDedicated) { local MatchConfig MatchProfile; local MutatorData M; MatchProfile = VH.MatchProfile; DebugLog("TickedReplication_Mutators " $ Index $ ", " $ MatchProfile.Mutators[Index].ClassName); M.ClassName = MatchProfile.Mutators[Index].ClassName; M.FriendlyName = MatchProfile.Mutators[Index].FriendlyName; SendClientResponse( MutatorID, AddID, Index $ "," $ M.ClassName $ Chr(27) $ M.FriendlyName ); bWaitingForReply = bDedicated; } //------------------------------------------------------------------------------------------------ simulated function ReceiveGameConfig(VotingHandler.MapVoteGameConfigLite p_GameConfig) { GameConfig[GameConfig.Length] = p_GameConfig; DebugLog("___Receiving - " $ p_GameConfig.GameName); ReplicationReply(); } //------------------------------------------------------------------------------------------------ simulated function ReceiveMapInfo(VotingHandler.MapVoteMapList MapInfo) { MapList[MapList.Length] = MapInfo; DebugLog("___Receiving - " $ MapInfo.MapName); ReplicationReply(); } //------------------------------------------------------------------------------------------------ simulated function ReceiveMapVoteCount(VotingHandler.MapVoteScore MVCData, bool bReply) { local int i; local bool bFound; for( i=0; i= MapList.Length) return ""; else return MapList[Index].MapName; } //------------------------------------------------------------------------------------------------ function MatchSetupLogin(string UserID, string Password) { local int SecLevel; if( VH.MatchSetupLogin(UserID,Password,PlayerOwner,SecLevel) ) { bMatchSetupPermitted=True; SecurityLevel = SecLevel; SendClientResponse(LoginID,"1"); } else { bMatchSetupPermitted=False; SendClientResponse(LoginID); } } //------------------------------------------------------------------------------------------------ function MatchSetupLogout() { bMatchSetupPermitted = false; bMatchSetupAccepted = false; bSendingMatchSetup = false; VH.MatchSetupLogout( PlayerOwner ); SendClientResponse("logout"); } //------------------------------------------------------------------------------------------------ function RequestMatchSettings(bool bRefreshMaps, bool bRefreshMutators) { DebugLog("____RequestConfigSettings"); if(bMatchSetupPermitted) { bMatchSetupAccepted = false; bSendingMatchSetup = true; // Send the full list of maps if ( bRefreshMaps ) AddToTickedReplicationQueue(REPDATATYPE_Maps, VH.MatchProfile.Maps.Length-1); // Send the full list of mutators if ( bRefreshMutators ) AddToTickedReplicationQueue(REPDATATYPE_Mutators, VH.MatchProfile.Mutators.Length-1); // Send the game configuration, including the active maps & mutators, command line params, and misc. settings AddToTickedReplicationQueue(REPDATATYPE_MatchConfig, VH.MatchProfile.PInfo.Settings.Length + 5); } else SendClientResponse(MatchSetupID, FailedID); } function SendClientResponse( string Identifier, optional string Response, optional string Data ) { if ( Identifier == "" ) return; if ( Response != "" ) Identifier $= ":" $ Response; if ( Data != "" ) Identifier $= ";" $ Data; SendResponse(Identifier); } function ReceiveCommand( string Command ) { local string Type, Info, Data; DecodeCommand( Command, Type, Info, Data ); HandleCommand( Type, Info, Data ); } static function DecodeCommand( string Response, out string Type, out string Info, out string Data ) { local string str; Type = ""; Info = ""; Data = ""; if ( Response == "" ) return; if ( Divide(Response, ":", Type, str) ) { if ( !Divide(str, ";", Info, Data) ) Info = str; } else Type = Response; } function HandleCommand( string Type, string Info, string Data ) { local bool bPropagate; if ( Type == "" ) return; log("HandleCommand Type: '"$Type$"' Info: '"$Info$"' Data: '"$Data$"'",'MapVoteDebug'); switch ( Type ) { case MapID: if ( bMatchSetupPermitted ) { bMatchSetupAccepted = false; bPropagate = VH.MatchProfile.ChangeSetting(Type, Info); } break; case MutatorID: if ( bMatchSetupPermitted ) { bMatchSetupAccepted = false; bPropagate = VH.MatchProfile.ChangeSetting( Type, Info ); } break; case GeneralID: if ( bMatchSetupPermitted ) { bMatchSetupAccepted = false; switch ( Info ) { case OptionID: case TournamentID: case DemoRecID: bPropagate = VH.MatchProfile.ChangeSetting( Info, Data ); } } break; } if ( bPropagate ) VH.PropagateValue(Self, Type, Info, Data); } simulated function SendResponse(string Response) { Super.SendResponse(Response); ReplicationReply(); } //------------------------------------------------------------------------------------------------ function MatchSettingsSubmit() { local int i; local bool bAllAccepted; DebugLog("____MatchSettingsSubmit()"); if(bMatchSetupPermitted) { bAllAccepted = true; bMatchSetupAccepted = true; // check if any match setup users did not accept the settings for( i=0; i 10 && Count <= 60 && CountDownSounds[Count-1] != '') PlayerOwner.PlayStatusAnnouncement( CountDownSounds[Count-1], 1); if( Count == 10 ) { t = GetSoundDuration(PlayerOwner.StatusAnnouncer.PreCacheSound(CountDownSounds[9])); if(t + 0.15 < 1) t = 1; SetTimer(t + 0.15,false); PlayerOwner.PlayStatusAnnouncement( CountDownSounds[9], 1); CountDown = 9; } } //------------------------------------------------------------------------------------------------ simulated function Timer() { local float t; t = GetSoundDuration(PlayerOwner.StatusAnnouncer.PreCacheSound(CountDownSounds[CountDown-1])); if(t + 0.15 < 1) t = 1; PlayerOwner.PlayStatusAnnouncement( CountDownSounds[CountDown-1], 1); CountDown--; if( CountDown > 0 ) SetTimer(t + 0.15,false); } //------------------------------------------------------------------------------------------------ function RequestPlayerIP( string PlayerName ) { local PlayerController P; if( PlayerOwner.PlayerReplicationInfo.bAdmin ) { foreach DynamicActors( class'PlayerController', P ) { if( P.PlayerReplicationInfo.PlayerName ~= PlayerName ) { SendPlayerID(P.GetPlayerNetworkAddress(), P.GetPlayerIDHash()); break; } } } } //------------------------------------------------------------------------------------------------ simulated function SendPlayerID(string IPAddress, string PlayerID) { local KickInfoPage Page; Page = KickInfoPage(GetController().ActivePage); if(Page != None) { Page.lb_PlayerInfoBox.Add(class'KickInfoPage'.default.IPText,IPAddress); Page.lb_PlayerInfoBox.Add(class'KickInfoPage'.default.IDText,PlayerID); } } //------------------------------------------------------------------------------------------------ simulated function DebugLog(string Text) { if(bDebugLog) log(Text,'MapVoteDebug'); } //------------------------------------------------------------------------------------------------ simulated function bool MatchSetupLocked() { return !bMatchSetupPermitted; } simulated function bool MapVoteEnabled() { return bMapVote; } simulated function bool KickVoteEnabled() { return bKickVote; } simulated function bool MatchSetupEnabled() { return bMatchSetup; } `V//==================================================================== // xVoting.VotingPage // Voting page is the base for MapVoting and KickVoting pages. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class VotingPage extends LargeWindow DependsOn(VotingHandler); var automated MapVoteFooter f_Chat; var() editconst noexport VotingReplicationInfo MVRI; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { local PlayerController PC; Super.Initcomponent(MyController, MyOwner); PC = PlayerOwner(); MVRI = VotingReplicationInfo(PC.VoteReplicationInfo); // Turn pause off if currently paused (stops replication) if(PlayerOwner() != None && PlayerOwner().Level.Pauser != None) PlayerOwner().SetPause(false); } //------------------------------------------------------------------------------------------------ function Free() { MVRI = None; Super.Free(); } //------------------------------------------------------------------------------------------------ `B//==================================================================== // xVoting.MatchSetupPage // MatchSetup page. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MatchSetupPage extends VotingPage; /* var automated GUITreeListBox lb_TreeListBox; var automated GUIButton b_SaveButton; var automated GUIButton b_SubmitButton; var automated GUIButton b_SaveAsDefault; var automated GUIButton b_RestoreDefault; var automated GUILabel l_OptionLabel; var automated GUILabel l_Title; var automated GUILabel l_AvailableMaps; // Generic controls (initially hidden) var automated GUIListBox lb_ListBoxA; var automated GUIListBox lb_ListBoxB; var automated MultiSelectListBox lb_MSListBox; var automated moCheckbox ch_CheckBox; var automated moComboBox co_ComboBox; var automated moFloatEdit fl_FloatEdit; var automated moNumericEdit nu_NumericEdit; var automated moEditBox ed_EditBox; var array GameTypes; //var array Maps; var array Maps; //var array Mutators; var array Mutators; var int SelectedGameTypeIdx; var string SelectedMapName; var string SelectedMutators; var string Parameters; var bool bTournamentMode; var string DemoRecFileName; var PlayInfo PInfo; var string SelectedOption; var bool bCurrentSettingChanged; var bool bInitialized; // Localization var localized string GameTypesCaption, MapNameCaption, MutatorsCaption, lmsgMustBeAdmin, lmsgMatchSetupDisabled, ParametersCaption, TournamentModeCaption, DemoRecCaption, MiscCaption, lmsgNotPermitted, lmsgMutator; //------------------------------------------------------------------------------------------------ function InternalOnOpen() { if( MVRI == none || (MVRI != none && !MVRI.bMatchSetup) ) { Controller.OpenMenu("GUI2K4.GUI2K4QuestionPage"); GUIQuestionPage(Controller.TopPage()).SetupQuestion(lmsgMatchSetupDisabled, QBTN_Ok, QBTN_Ok); GUIQuestionPage(Controller.TopPage()).OnButtonClick = OnOkButtonClick; return; } if(MVRI != none && !MVRI.bMatchSetupPermitted) { if( PlayerOwner().PlayerReplicationInfo.bAdmin ) MVRI.MatchSetupLogin("Admin", ""); // UserId and Password not checked for admins else Controller.OpenMenu("xVoting.MatchSetupLoginPage"); } class'CacheManager'.static.GetGameTypeList(GameTypes); //class'CacheManager'.static.GetMutatorList(Mutators); setTimer(1,true); // wait for login validation PInfo = new(None) class'Engine.PlayInfo'; } //------------------------------------------------------------------------------------------------ function OnOkButtonClick(byte bButton) // triggered by th GUIQuestionPage Ok Button { Controller.CloseAll(true); } //------------------------------------------------------------------------------------------------ function Timer() { if( !bInitialized && MVRI != None && MVRI.bMatchSetupPermitted ) { bInitialized = true; MVRI.RequestMatchSettings(True); } if( !MVRI.bMatchSetupAccepted && !b_SubmitButton.bVisible) b_SubmitButton.Show(); if( MVRI.bMatchSetupAccepted && b_SubmitButton.bVisible) b_SubmitButton.Hide(); } //------------------------------------------------------------------------------------------------ function AddGameType(string GameClassString) { local int i; //log("____AddGameType", 'MapVoteDebug'); lb_TreeListBox.List.OnChange = None; lb_TreeListBox.List.Clear(); // reload required when game type changed PInfo.Clear(); for(i = 0; i < GameTypes.Length; i++) { if(GameTypes[i].ClassName ~= GameClassString) { SelectedGameTypeIdx = i; break; } } lb_TreeListBox.List.OnChange = OptionSelected; bCurrentSettingChanged=false; SelectedOption = ""; lb_TreeListBox.List.AddItem(GameTypesCaption, "GameType", ""); } //------------------------------------------------------------------------------------------------ function AddMapName(string MapName) { //log("____AddMapName", 'MapVoteDebug'); lb_TreeListBox.List.OnChange = None; lb_TreeListBox.List.AddItem(MapNameCaption, "MapName", ""); SelectedMapName = MapName; lb_TreeListBox.List.OnChange = OptionSelected; } //------------------------------------------------------------------------------------------------ function AddMutators(string MutatorsString) { //log("____AddMutators", 'MapVoteDebug'); lb_TreeListBox.List.OnChange = None; lb_TreeListBox.List.AddItem(MutatorsCaption, "Mutators", ""); SelectedMutators = MutatorsString; lb_TreeListBox.List.OnChange = OptionSelected; } //------------------------------------------------------------------------------------------------ function AddParameters(string Value) { //log("____AddParameters", 'MapVoteDebug'); lb_TreeListBox.List.OnChange = None; //lb_TreeListBox.List.AddItem(ParametersCaption, "", ""); lb_TreeListBox.List.AddItem(MiscCaption, "GameOptions", ParametersCaption); lb_TreeListBox.List.OnChange = OptionSelected; Parameters = Value; } //------------------------------------------------------------------------------------------------ function AddTournamentMode(string Value) { //log("____AddTournamentMode", 'MapVoteDebug'); lb_TreeListBox.List.OnChange = None; lb_TreeListBox.List.AddItem(TournamentModeCaption, "Tournament", ParametersCaption); lb_TreeListBox.List.OnChange = OptionSelected; bTournamentMode = bool(Value); } //------------------------------------------------------------------------------------------------ function AddDemoRecFileName(string Value) { //log("____AddDemoRecFileName", 'MapVoteDebug'); lb_TreeListBox.List.OnChange = None; lb_TreeListBox.List.AddItem(DemoRecCaption, "DemoRec", ParametersCaption); lb_TreeListBox.List.OnChange = OptionSelected; DemoRecFileName = Value; } //------------------------------------------------------------------------------------------------ function AddSetting(string SettingName, string ClassFrom, string Value) { local int i; local class InfoClass; Log("___AddSetting " $ SettingName $ ", " $ ClassFrom $ ", " $ Value, 'MapVoteDebug'); i = PInfo.FindIndex(SettingName); if( i == -1 ) // setting not found, need to load it { InfoClass = class(DynamicLoadObject(ClassFrom,class'Class')); if (InfoClass != None) { PInfo.AddClass(InfoClass); InfoClass.static.FillPlayInfo(PInfo); i = PInfo.FindIndex(SettingName); if( i == -1 ) { log("Failed to find PlayInfo Setting " $ SettingName); return; } } else { Log("Failed to load " $ ClassFrom); return; } } PInfo.StoreSetting( i, Value); lb_TreeListBox.List.OnChange = None; if( class(InfoClass) != none) lb_TreeListBox.List.AddItem(PInfo.Settings[i].DisplayName, PInfo.Settings[i].SettingName, lmsgMutator); else lb_TreeListBox.List.AddItem(PInfo.Settings[i].DisplayName, PInfo.Settings[i].SettingName, PInfo.Settings[i].Grouping); lb_TreeListBox.List.OnChange = OptionSelected; } //------------------------------------------------------------------------------------------------ function UpdateSetting(string SettingName, string NewSetting) { local int i,x; //log("____UpdateSetting", 'MapVoteDebug'); switch( SettingName ) { case "MapName": SelectedMapName = NewSetting; break; case "Mutators": SelectedMutators = NewSetting; break; case "GameOptions": Parameters = NewSetting; break; case "Tournament": bTournamentMode = bool(NewSetting); break; case "DemoRec": DemoRecFileName = NewSetting; break; default: x = PInfo.FindIndex(SettingName); if( x > -1) PInfo.StoreSetting(x, NewSetting); } i = lb_TreeListBox.List.FindIndexByValue(SettingName); if( i > -1) lb_TreeListBox.List.SetIndex(i); } //------------------------------------------------------------------------------------------------ function OptionSelected(GUIComponent Sender) { local int i,x,Idx,pos; local array Range; local string Width, Op; local array MutatorArray; local array MapArray; local bool bFound; if( SelectedOption != lb_TreeListBox.List.GetValue() && bCurrentSettingChanged ) SaveOption(SelectedOption); // save the previously changed setting SelectedOption = lb_TreeListBox.List.GetValue(); // Hide all generic controls lb_ListBoxA.Hide(); lb_ListBoxB.Hide(); lb_MSListBox.Hide(); ch_CheckBox.Hide(); co_ComboBox.Hide(); fl_FloatEdit.Hide(); nu_NumericEdit.Hide(); ed_EditBox.Hide(); l_AvailableMaps.Hide(); // disable change notification lb_ListBoxA.OnChange=None; lb_ListBoxB.OnChange=None; lb_MSListBox.OnChange=None; ch_CheckBox.OnChange=None; co_ComboBox.OnChange=None; fl_FloatEdit.OnChange=None; nu_NumericEdit.OnChange=None; ed_EditBox.OnChange=None; bCurrentSettingChanged=False; b_SaveButton.Hide(); l_OptionLabel.Caption=lb_TreeListBox.List.GetCaption(); switch( SelectedOption ) { case "GameType": lb_ListBoxA.SetHint(""); lb_ListBoxA.List.Clear(); for (i = 0; i < GameTypes.Length; i++) lb_ListBoxA.List.Add(GameTypes[i].GameName,none,GameTypes[i].ClassName); lb_ListBoxA.List.SetIndex(SelectedGameTypeIdx); lb_ListBoxA.Show(); lb_ListBoxA.SetFocus(None); lb_ListBoxA.OnChange=SettingChanged; break; case "MapName": lb_ListBoxA.SetHint(""); ReadMapList(); lb_ListBoxA.List.Clear(); Split(SelectedMapName, ",", MapArray); for(i=0; i 1) { // Ranged data if (InStr(Range[0], ".") != -1) { // float edit fl_FloatEdit.Show(); if (i != -1) fl_FloatEdit.Setup( float(Range[0]), float(Range[1]), fl_FloatEdit.MyNumericEdit.Step); fl_FloatEdit.SetComponentValue(PInfo.Settings[Idx].Value); fl_FloatEdit.SetFocus(None); fl_FloatEdit.SetHint(PInfo.Settings[Idx].Description); fl_FloatEdit.OnChange=SettingChanged; } else { nu_NumericEdit.SetHint(PInfo.Settings[Idx].Description); nu_NumericEdit.Show(); if (i != -1) nu_NumericEdit.Setup( int(Range[0]), int(Range[1]), nu_NumericEdit.MyNumericEdit.Step); nu_NumericEdit.SetComponentValue(PInfo.Settings[Idx].Value); nu_NumericEdit.SetFocus(None); nu_NumericEdit.OnChange=SettingChanged; } } else { ed_EditBox.SetHint(PInfo.Settings[Idx].Description); ed_EditBox.Show(); if (i != -1) ed_EditBox.MyEditBox.MaxWidth = i; ed_EditBox.SetComponentValue(PInfo.Settings[Idx].Value); ed_EditBox.SetFocus(None); ed_EditBox.OnChange=SettingChanged; } break; } } else l_OptionLabel.Caption = lmsgNotPermitted; } } } //------------------------------------------------------------------------------------------------ function SettingChanged(GUIComponent Sender) { bCurrentSettingChanged=true; // set to auto-save b_SaveButton.Show(); } //------------------------------------------------------------------------------------------------ function MapSelected(GUIComponent Sender) { local string MapName; lb_ListBoxA.OnChange=none; lb_ListBoxB.OnChange=none; if( Sender == lb_ListBoxA) { MapName = lb_ListBoxA.List.Get(); lb_ListBoxB.List.Add(MapName); lb_ListBoxA.List.RemoveItem(MapName); } if( Sender == lb_ListBoxB) { MapName = lb_ListBoxB.List.Get(); lb_ListBoxA.List.Add(MapName); lb_ListBoxB.List.RemoveItem(MapName); } bCurrentSettingChanged=true; // set to auto-save b_SaveButton.Show(); lb_ListBoxA.OnChange=MapSelected; lb_ListBoxB.OnChange=MapSelected; } //------------------------------------------------------------------------------------------------ function bool SaveButtonClick(GUIComponent Sender) { SaveOption(lb_TreeListBox.List.GetValue()); b_SaveButton.Hide(); return true; } //------------------------------------------------------------------------------------------------ function bool SaveAsDefaultButtonClick(GUIComponent Sender) { if( bCurrentSettingChanged ) // make sure last change was saved { SaveOption(lb_TreeListBox.List.GetValue()); b_SaveButton.Hide(); } if( !PlayerOwner().PlayerReplicationInfo.bAdmin ) { Controller.OpenMenu("GUI2K4.GUI2K4QuestionPage"); GUI2K4QuestionPage(Controller.ActivePage).SetupQuestion(lmsgMustBeAdmin, QBTN_Ok, QBTN_Ok); } else MVRI.SaveAsDefault(); return true; } //------------------------------------------------------------------------------------------------ function bool RestoreDefaultButtonClick(GUIComponent Sender) { b_SaveButton.Hide(); MVRI.RestoreDefaultProfile(); return true; } //------------------------------------------------------------------------------------------------ function SaveOption(string SettingName) { local int i,pos,Idx; local array Range; local string Width, Op; switch( SettingName ) { case "GameType": SelectedGameTypeIdx = lb_ListBoxA.List.Index; MVRI.SendMatchSettingChange(SettingName,GameTypes[SelectedGameTypeIdx].ClassName); break; case "MapName": SelectedMapName = ""; for( i=0; i 1) { // Ranged data if (InStr(Range[0], ".") != -1) { // float edit PInfo.StoreSetting(Idx, fl_FloatEdit.GetComponentValue()); } else { // numeric edit PInfo.StoreSetting(Idx, nu_NumericEdit.GetComponentValue()); } } else { // text edit PInfo.StoreSetting(Idx, ed_EditBox.GetComponentValue()); } break; } //switch(PInfo.Settings[Idx].RenderType) MVRI.SendMatchSettingChange(SettingName, PInfo.Settings[Idx].Value); } //switch bCurrentSettingChanged = false; return; } //------------------------------------------------------------------------------------------------ function bool SubmitButtonClick(GUIComponent Sender) { if( MVRI != none ) MVRI.MatchSettingsSubmit(); return true; } //------------------------------------------------------------------------------------------------ function ReadMapList() { local int i; local bool bTemp; bTemp = Controller.bCurMenuInitialized; Controller.bCurMenuInitialized = False; lb_ListBoxB.List.Clear(); for (i = 0; i < Maps.Length; i++) lb_ListBoxB.List.Add(Maps[i]); lb_ListBoxB.List.Sort(); Controller.bCurMenuInitialized = bTemp; lb_ListBoxB.List.SetIndex(0); } //------------------------------------------------------------------------------------------------ function AddServerMaps(string MapName, int Index) { local int i; if( Index == 0 ) { if( SelectedOption == "MapName" ) { Maps.Remove(0,Maps.Length); lb_ListBoxB.List.Clear(); } } Maps[Maps.Length] = MapName; if( SelectedOption == "MapName" ) { i = lb_ListBoxA.List.FindIndex(MapName); if( i > -1 ) { // replace uppercase mapnames from maplist lb_ListBoxA.OnChange=None; lb_ListBoxA.List.Remove(i); lb_ListBoxA.List.Add(MapName); lb_ListBoxA.List.Sort(); lb_ListBoxA.OnChange=MapSelected; } else { lb_ListBoxB.OnChange=None; lb_ListBoxB.List.Add(MapName); lb_ListBoxB.List.Sort(); lb_ListBoxB.OnChange=MapSelected; } } } //------------------------------------------------------------------------------------------------ function AddServerMutators(VotingReplicationInfo.MutatorData M, int Index) { if( Index == 0 ) Mutators.Remove(0, Mutators.Length); Mutators[Mutators.Length] = M; if( SelectedOption == "Mutators" ) { lb_MSListBox.List.Add(M.FriendlyName,none,M.ClassName); lb_MSListBox.List.Sort(); if( InStr("," $ Caps(SelectedMutators) $ ",", "," $ Caps(M.ClassName) $ ",") > -1 ) lb_MSListBox.List.Find(M.ClassName,False,True); // bExtra } } //------------------------------------------------------------------------------------------------ function Closed(GUIComponent Sender, bool bCancelled) { if( MVRI != none ) MVRI.MatchSetupLogout(); Super.Closed(Sender, bCancelled); } //------------------------------------------------------------------------------------------------ defaultproperties { Begin Object class=GUILabel Name=TitleLabel Caption="Match Setup" TextALign=TXTA_Center TextFont="UT2LargeFont" TextColor=(R=0,G=0,B=255,A=255) WinWidth=0.554921 WinHeight=0.048632 WinLeft=0.223438 WinTop=0.107084 End Object l_Title=TitleLabel Begin Object Class=GUITreeListBox Name=TreeControl WinWidth=0.393437 WinHeight=0.487810 WinLeft=0.108204 WinTop=0.161405 bVisibleWhenEmpty=true Hint="Select a configuration option to modify." End Object lb_TreeListBox = TreeControl Begin Object class=GUILabel Name=OptionLabel Caption="" TextALign=TXTA_Center TextFont="UT2SmallFont" TextColor=(R=0,G=0,B=255,A=255) WinWidth=0.386170 WinHeight=0.032069 WinLeft=0.505509 WinTop=0.161823 End Object l_OptionLabel=OptionLabel Begin Object Class=GUIListBox Name=ListBoxA WinWidth=0.315269 WinHeight=0.213349 WinLeft=0.537139 WinTop=0.193488 bVisibleWhenEmpty=true bVisible=false bSorted=false End Object lb_ListBoxA = ListBoxA Begin Object Class=GUIListBox Name=ListBoxB WinWidth=0.315269 WinHeight=0.200848 WinLeft=0.537139 WinTop=0.443750 bVisibleWhenEmpty=true bVisible=false bSorted=true Hint="Selecting a map name in this list will move it to the Map Cycle List." End Object lb_ListBoxB = ListBoxB Begin Object class=GUILabel Name=AvailableMapsLabel Caption="Available Maps" TextALign=TXTA_Center TextFont="UT2SmallFont" TextColor=(R=0,G=0,B=255,A=255) WinWidth=0.315234 WinHeight=0.032382 WinLeft=0.536759 WinTop=0.412239 bVisible=False End Object l_AvailableMaps=AvailableMapsLabel Begin Object Class=MultiSelectListBox Name=MSListBox WinWidth=0.342769 WinHeight=0.329599 WinLeft=0.525890 WinTop=0.195155 bVisibleWhenEmpty=true bVisible=false End Object lb_MSListBox = MSListBox Begin Object class=GUIButton Name=SaveAsDefaultButton Caption="Save As Default" Hint="Save this profile as the default profile." StyleName="SquareButton" OnClick=SaveAsDefaultButtonClick WinWidth=0.188855 WinHeight=0.034616 WinLeft=0.108749 WinTop=0.655141 bVisible=true End Object b_SaveAsDefault=SaveAsDefaultButton Begin Object class=GUIButton Name=RestoreDefaultButton Caption="Load Default" Hint="Restore the default profile." StyleName="SquareButton" OnClick=RestoreDefaultButtonClick WinWidth=0.169772 WinHeight=0.034616 WinLeft=0.332629 WinTop=0.655141 End Object b_RestoreDefault=RestoreDefaultButton Begin Object class=GUIButton Name=SubmitButton Caption="Finish/Accept" Hint="Accept current settings and implement changes." StyleName="SquareButton" OnClick=SubmitButtonClick WinWidth=0.176277 WinHeight=0.034616 WinLeft=0.712919 WinTop=0.655141 bVisible=false End Object b_SubmitButton=SubmitButton Begin Object class=GUIButton Name=SaveButton Caption="Save/Send" Hint="Click to save the changes to the selected option and send the new setting to the server." StyleName="SquareButton" OnClick=SaveButtonClick WinWidth=0.178750 WinHeight=0.034565 WinLeft=0.517007 WinTop=0.655055 End Object b_SaveButton=SaveButton Begin Object Class=moCheckbox Name=CheckBox WinWidth=0.037733 WinHeight=0.048437 WinLeft=0.671131 WinTop=0.212656 bVisible=false CaptionWidth=0 ComponentWidth=1 //Hint="This is a checkbox" End Object ch_CheckBox = CheckBox Begin Object Class=moComboBox Name=ComboBox WinWidth=0.313359 WinHeight=0.038750 WinLeft=0.539885 WinTop=0.196822 bAutoSizeCaption=True bVisible=false CaptionWidth=0 ComponentWidth=1 End Object co_ComboBox = ComboBox Begin Object Class=moFloatEdit Name=FloatEdit WinWidth=0.120545 WinHeight=0.043750 WinLeft=0.636444 WinTop=0.200155 bVisible=false CaptionWidth=0 ComponentWidth=1 End Object fl_FloatEdit = FloatEdit Begin Object Class=moNumericEdit Name=NumericEdit WinWidth=0.120545 WinHeight=0.043750 WinLeft=0.636444 WinTop=0.200155 bVisible=false CaptionWidth=0 ComponentWidth=1 End Object nu_NumericEdit = NumericEdit Begin Object Class=moEditBox Name=EditBox WinWidth=0.358984 WinHeight=0.037500 WinLeft=0.518946 WinTop=0.198488 bVisible=false CaptionWidth=0 ComponentWidth=1 End Object ed_EditBox = EditBox OnOpen=InternalOnOpen; GameTypesCaption="Game Type" MapNameCaption="Map Cycle List" MutatorsCaption="Mutators" ParametersCaption="Parameters" TournamentModeCaption="Tournament Mode" DemoRecCaption="Record Demo(FileName)" MiscCaption="Miscellaneous" lmsgMustBeAdmin="You must be logged in as an Admin to perform this." lmsgMatchSetupDisabled="Match Setup has been disabled by the server administrator." lmsgNotPermitted="Not Permitted" lmsgMutator="Mutator" } */ `.class MatchSetupLoginPage extends LargeWindow; var automated GUILabel l_Title; var automated moEditBox ed_UserID; var automated moEditBox ed_Password; var automated GUIButton b_LogIn; var automated GUIButton b_Cancel; var VotingReplicationInfo VRI; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { local VotingReplicationInfo RI; Super.InitComponent(Mycontroller, MyOwner); ed_Password.MyEditBox.bConvertSpaces = true; // find the VotingReplicationInfo foreach AllObjects(class 'VotingReplicationInfo', RI) { if( RI.PlayerOwner != None && RI.PlayerOwner == PlayerOwner()) { VRI = RI; break; } } if(VRI == None) Controller.CloseAll(false); ed_Password.MyEditBox.bMaskText=true; ed_UserID.SetComponentValue(PlayerOwner().PlayerReplicationInfo.PlayerName); } //------------------------------------------------------------------------------------------------ function bool InternalOnClick(GUIComponent Sender) { if(Sender==b_Login && Len(ed_UserID.GetText())>0 && len(ed_Password.GetText())>0 ) { VRI.MatchSetupLogin(ed_UserID.GetText(), ed_Password.GetText()); setTimer(1, true); } if(Sender==b_Cancel) Controller.CloseAll(false); return true; } //------------------------------------------------------------------------------------------------ function timer() { Super.timer(); if(VRI != None && VRI.bMatchSetupPermitted) Controller.CloseMenu(false); } //------------------------------------------------------------------------------------------------ function bool UserIDKeyPress(out byte Key, out byte State, float delta) { if((Key == 13) && (State==1)) // Enter Key { ed_Password.SetFocus(none); return true; } if((Key == 40) && (State==1)) // Up Down { ed_Password.SetFocus(none); return true; } return false; } //------------------------------------------------------------------------------------------------ function bool PasswordKeyPress(out byte Key, out byte State, float delta) { if((Key == 13) && (State==1)) // Enter Key { if(Len(ed_UserID.GetText())>0 && len(ed_Password.GetText())>0 ) { VRI.MatchSetupLogin(ed_UserID.GetText(), ed_Password.GetText()); setTimer(1, true); } return true; } if((Key == 38) && (State==1)) // Up Key { ed_UserID.SetFocus(none); return true; } return false; } //------------------------------------------------------------------------------------------------ function Closed(GUIComponent Sender, bool bCancelled) { VRI = None; Super.Closed(Sender, bCancelled); } //------------------------------------------------------------------------------------------------ event bool NotifyLevelChange() { VRI = None; return Super.NotifyLevelChange(); } //------------------------------------------------------------------------------------------------ `U// ==================================================================== // Class: xVoting.MatchConfig // // MatchConfig is used to store/save the default server configuration // settings. When the Match is over this is used to restore the original // server settings. // // Written by Bruce Bickar (Uses some code from Ron Prestenback's Ladder mod) // (c) 2003 Epic Games, Inc. All Rights Reserved // ==================================================================== class MatchConfig extends Object Config(MatchConfig) PerObjectConfig; // used to save configuration settings from PlayInfo struct ProfileSetting { var string SettingName; var string SettingValue; }; // config var config array Settings; var config string DefaultGameClassString; var config string DefaultMutatorsString; var config string DefaultParameters; var config bool DefaultTournamentMode; var config string DefaultDemoRecFileName; var string GameClassString; var string MapIndexList; var string MutatorIndexList; var string Parameters; var bool bTournamentMode; var string DemoRecFileName; var MaplistManager MapHandler; var PlayInfo PInfo; var LevelInfo Level; var array GameTypes; var array Maps; var array Mutators; var transient int GameIndex, RecordIndex; // Localization var localized string lmsgLoadingMatchProfile, lmsgRestoringDefaultProfile, lmsgDefaultNotAvailable; //------------------------------------------------------------------------------------------------ function Init(LevelInfo Lv) { if (Lv==None) return; Level = Lv; PInfo = new(None) class'Engine.PlayInfo'; MapHandler = MaplistManager(Level.Game.MaplistHandler); class'CacheManager'.static.GetGameTypeList(GameTypes); class'CacheManager'.static.GetMutatorList(Mutators); LoadDefaults(); } function LoadDefaults() { // hack for defaults SetGameClassString(DefaultGameClassString); Parameters = DefaultParameters; bTournamentMode = DefaultTournamentMode; DemoRecFileName = DefaultDemoRecFileName; LoadDefaultMutators(); LoadDefaultMaps(); } function LoadDefaultMutators() { local array Classes; local int i, idx; MutatorIndexList = ""; if ( Mutators.Length == 0 ) class'CacheManager'.static.GetMutatorList(Mutators); Split(DefaultMutatorsString, ",", Classes); for ( i = 0; i < Classes.Length; i++ ) { idx = GetMutatorCacheIndex(Classes[i]); if ( idx != -1 ) { if ( MutatorIndexList != "" ) MutatorIndexList $= ","; MutatorIndexList $= idx; } } } function LoadCurrentMutators() { local int idx; local Mutator M; MutatorIndexList = ""; if ( Mutators.Length == 0 ) class'CacheManager'.static.GetMutatorList(Mutators); for(M = Level.Game.BaseMutator.NextMutator; M != None; M = M.NextMutator) { idx = GetMutatorCacheIndex(M.Class); if ( idx != -1 ) { if ( MutatorIndexList != "" ) MutatorIndexList $= ","; MutatorIndexList $= idx; } } } function LoadDefaultMaps() { local int i, MapIndex; local array MapArr; MapIndexList = ""; UpdateRecordIndex(); if ( RecordIndex != -1 ) { MapArr = MapHandler.GetMapList( GameIndex, RecordIndex ); for ( i = 0; i < MapArr.Length; i++ ) { MapIndex = GetMapCacheIndex(MapArr[i]); if ( MapIndex != -1 ) { if ( MapIndexList != "" ) MapIndexList $= ","; MapIndexList $= MapIndex; } } } } function SetGameClassString( string NewString ) { local int idx; if ( NewString == "" ) return; idx = MapHandler.GetGameIndex(NewString); if ( idx != -1 ) { GameClassString = NewString; GameIndex = idx; UpdateRecordIndex(); } } //------------------------------------------------------------------------------------------------ function LoadCurrentSettings() { local array ParamArray; local string URL,LeftPart,RightPart; local int x; SetGameClassString(string(Level.Game.Class)); LoadCurrentMutators(); URL = Caps(Level.GetLocalURL()); //Log("URL = " $ URL, 'MapVoteDebug'); // 0.0.0.0/DM-Morpheus3?Name=BDB?Class=Engine.Pawn?Character=Ophelia?team=255?Game=XGame.xDeathMatch? // ADMINNAME=BDB?ADMINPASSWORD=XXXX?mutator=?TOURNAMENT=1 Split(URL, "?", ParamArray); Parameters=""; for( x=1; x GameClass; local class ACClass; local array > PIClasses; local class MutClass; local array MutClassNames; PInfo.Clear(); GameClass = class(DynamicLoadObject( GameClassString, class'Class')); if(GameClass != None) { PIClasses[i++] = GameClass; ACClass = class(DynamicLoadObject(GameClass.default.AccessControlClass, class'Class')); if (ACClass != None) PIClasses[i++] = ACClass; MutClassNames = GetCurrentMutatorArray(); MutClassNames.Insert(0,1); MutClassNames[0] = GameClass.default.MutatorClass; for (j = 0; j < MutClassNames.Length; j++) { if ( MutClassNames[j] != "" ) MutClass = class(DynamicLoadObject(MutClassNames[j], class'Class')); if (MutClass != None) PIClasses[i++] = MutClass; } PInfo.Init(PIClasses); } } //------------------------------------------------------------------------------------------------ function LoadMapList() { local int i, MapIndex; local array MapArr; MapIndexList = ""; UpdateRecordIndex(); if ( RecordIndex != -1 ) { MapArr = MapHandler.GetMapList( GameIndex, RecordIndex ); for ( i = 0; i < MapArr.Length; i++ ) { MapIndex = GetMapCacheIndex(MapArr[i]); if ( MapIndexList != "" ) MapIndexList $= ","; MapIndexList $= MapIndex; } } } //------------------------------------------------------------------------------------------------ function bool ChangeSetting(string SettingName, string NewValue) { local xVotingHandler VH; local int i; local bool bFound; log("____ChangeSetting(" $ SettingName $ ", " $ NewValue $ ")",'MapVoteDebug'); VH = xVotingHandler(Level.Game.VotingHandler); switch( SettingName ) { case class'VotingReplicationInfo'.default.GameTypeID: if( !(NewValue ~= GameClassString) ) { // validate new GameType bFound = false; for (i = 0; i < GameTypes.Length; i++) { if( GameTypes[i].ClassName ~= NewValue ) { bFound = true; break; } } if( !bFound ) return false; SetGameClassString(NewValue); // Reload all since gametype changed ReLoad(true); VH.ReloadMatchConfig(true,false); } return true; case class'VotingReplicationInfo'.default.MapID: MapIndexList = NewValue; return true; case class'VotingReplicationInfo'.default.MutatorID: if( MutatorIndexList != NewValue ) { MutatorIndexList = NewValue; // Reload to pick up any new mutator settings ReLoad(false); VH.ReloadMatchConfig(false,false); } return true; case class'VotingReplicationInfo'.default.OptionID: Parameters = NewValue; return true; case class'VotingReplicationInfo'.default.TournamentID: bTournamentMode = bool(NewValue); return true; case class'VotingReplicationInfo'.default.DemoRecID: DemoRecFileName = NewValue; return true; default: i = PInfo.FindIndex(SettingName); if( i > -1 ) { PInfo.StoreSetting(i, NewValue); return true; } } return false; } //------------------------------------------------------------------------------------------------ function ReLoad(bool bReloadMapList) // call when GameClassString has been changed. { LoadPlayInfo(); if( bReloadMapList ) LoadMapList(); } //------------------------------------------------------------------------------------------------ function SaveDefault() { local int i; Log("Saving Default settings to MatchConfig.ini - [" $ Name $ "]"); DefaultGameClassString = GameClassString; DefaultMutatorsString = ConvertMutatorIndexes(); DefaultParameters = Parameters; DefaultTournamentMode = bTournamentMode; DefaultDemoRecFileName = DemoRecFileName; // log("DefaultMapNameList = " $ DefaultMapNameList, 'MapVoteDebug'); // copy all the PlayInfo setting to the Config Settings array // so that they can be saved to the ini file. Settings.Length = PInfo.Settings.Length; for(i = 0; i < PInfo.Settings.Length; i++) { if(ArrayProperty(PInfo.Settings[i].ThisProp) == None) { Settings[i].SettingName = PInfo.Settings[i].SettingName; Settings[i].SettingValue = PInfo.Settings[i].Value; } } SaveMaplist(); SaveConfig(); } //------------------------------------------------------------------------------------------------ function RestoreDefault(Actor Requestor) { local int i,j; local xVotingHandler VH; log("___RestoreDefault()", 'MapVoteDebug'); if( PlayerController(Requestor) == none ) return; LoadDefaults(); log("MapIndexList = " $ MapIndexList, 'MapVoteDebug'); if( GameClassString == "" || MapIndexList == "" ) { PlayerController(Requestor).ClientMessage(lmsgDefaultNotAvailable); return; } LoadPlayInfo(); for(i = 0; i < Settings.Length; i++) { for(j = 0; j < PInfo.Settings.Length; j++) { if(ArrayProperty(PInfo.Settings[i].ThisProp) == None) { if(Settings[i].SettingName ~= PInfo.Settings[j].SettingName) { PInfo.StoreSetting(j, Settings[i].SettingValue); break; } } } } //PInfo.SaveSettings(); Level.Game.Broadcast(Level.Game.VotingHandler,lmsgRestoringDefaultProfile); // force all match setup users to reload settings VH = xVotingHandler(Level.Game.VotingHandler); if ( VH != None ) VH.ReloadMatchConfig(true,true); } //------------------------------------------------------------------------------------------------ function StartMatch() { local string ServerTravelString, mutstring; local class GameClass; local int i; SaveDefault(); PInfo.SaveSettings(); Level.Game.Broadcast(Level.Game.VotingHandler,lmsgLoadingMatchProfile); xVotingHandler(Level.Game.VotingHandler).CloseAllVoteWindows(); mutstring = ConvertMutatorIndexes(); if ( mutstring != "" ) mutstring = "?mutator=" $ mutstring; ServerTravelString = MapHandler.GetActiveMapName(GameIndex,RecordIndex) $ "?Game=" $ GameClassString $ mutstring; ServerTravelString $= "?" $ Eval(bTournamentMode, "TOURNAMENT=1", "TOURNAMENT=0"); if( DemoRecFileName != "" ) ServerTravelString $= "?DemoRec=" $ DemoRecFileName; if( Parameters != "" ) ServerTravelString $= "?" $ Repl(Repl(Parameters,",","?")," ",""); // Append bot options // Note: this doesn't work anymore because bot options were disabled on servers. :( switch (class'UnrealMPGameInfo'.default.BotMode) { case 0: i = PInfo.FindIndex("MinPlayers"); if ( i >= 0 ) ServerTravelString $= "?NumBots="$PInfo.Settings[i].Value; break; case 1: ServerTravelString $= "?bAutoNumBots=True"; break; case 2: if( GameClass.default.bTeamGame ) { if( class'XGame.TeamRedConfigured'.default.Characters.Length > 0 ) ServerTravelString $= "?RedTeam=XGame.TeamRedConfigured"; if( class'XGame.TeamBlueConfigured'.default.Characters.Length > 0 ) ServerTravelString $= "?BlueTeam=XGame.TeamBlueConfigured"; } else { if( class'XGame.DMRosterConfigured'.default.Characters.Length > 0 ) ServerTravelString $= "?DMTeam=XGame.DMRosterConfigured"; } break; } Level.ServerTravel(ServerTravelString, false); // change the map } function SaveMaplist() { local int i; local array OldMaps, NewMaps; if ( MapHandler != None ) { OldMaps = MapHandler.GetMapList(GameIndex, RecordIndex); NewMaps = GetCurrentMapArray(); for ( i = 0; i < OldMaps.Length; i++ ) MapHandler.RemoveMap(GameIndex, RecordIndex, OldMaps[i]); for ( i = 0; i < NewMaps.Length; i++ ) MapHandler.AddMap(GameIndex, RecordIndex, NewMaps[i]); MapHandler.ApplyMapList(GameIndex, RecordIndex); } } //------------------------------------------------------------------------------------------------ function UpdateRecordIndex() { local array Dummy; if ( Level == None || Level.Game == None || MapHandler == None ) return; if ( GameIndex != -1 ) { RecordIndex = MapHandler.GetRecordIndex(GameIndex, string(Name)); if ( RecordIndex == -1 ) RecordIndex = MapHandler.AddList(GameClassString, string(Name), Dummy); } } function int GetGameCacheIndex( coerce string ClassName ) { local int i; if ( ClassName == "" ) return -1; if ( GameTypes.Length == 0 ) class'CacheManager'.static.GetGameTypeList(GameTypes); for ( i = 0; i < GameTypes.Length; i++ ) { if ( GameTypes[i].ClassName ~= ClassName ) return i; } log(Name@"GetGameCacheIndex() didn't find index for game class '"$ClassName$"'",'MapVoteDebug'); return -1; } function int GetMutatorCacheIndex( coerce string ClassName ) { local int i; if ( ClassName == "" ) return -1; if ( Mutators.Length == 0 ) class'CacheManager'.static.GetMutatorList(Mutators); for ( i = 0; i < Mutators.Length; i++ ) { if ( Mutators[i].ClassName ~= ClassName ) return i; } log(Name@"GetMutatorCacheIndex() didn't find index for mutator class '"$ClassName$"'",'MapVoteDebug'); return -1; } function int GetMapCacheIndex(string MapName) { local int i; if ( MapName == "" ) return -1; if ( Maps.Length == 0 ) class'CacheManager'.static.GetMaplist( Maps, GetPrefix() ); i = InStr(MapName, "?"); if ( i != -1 ) MapName = Left(MapName,i); for ( i = 0; i < Maps.Length; i++ ) { if ( MapName ~= Maps[i].MapName ) return i; } log(Name@"GetMapCacheIndex() didn't find index for map '"$MapName$"'",'MapVoteDebug'); return -1; } function string GetPrefix() { local int i; if ( GameClassString == "" ) SetGameClassString(string(Level.Game.Class)); i = GetGameCacheIndex(GameClassString); if ( i != -1 ) return GameTypes[i].MapPrefix; return ""; } function array GetCurrentMutatorArray() { local string s; local array Arr; s = ConvertMutatorIndexes(); Split(s, ",", Arr); return Arr; } function array GetCurrentMapArray() { local string s; local array Arr; s = ConvertMapIndexes(); Split(s, ",", Arr); return Arr; } function string ConvertMutatorIndexes() { local int i, idx; local string str; local array Indexes; Split(MutatorIndexList, ",", Indexes); for ( i = 0; i < Indexes.Length; i++ ) { idx = int(Indexes[i]); if ( idx >= 0 && idx < Mutators.Length ) { if ( str != "" ) str $= ","; str $= Mutators[idx].ClassName; } } return str; } // translate the comma separated string of map indexes into a comma separated string of mapnames for storing function string ConvertMapIndexes() { local int i, idx; local string str; local array Indexes; Split(MapIndexList, ",", Indexes); for ( i = 0; i < Indexes.Length; i++ ) { idx = int(Indexes[i]); if ( idx >= 0 && idx < Maps.Length ) { if ( str != "" ) str $= ","; str $= Maps[idx].MapName; } } return str; } `qV//==================================================================== // xVoting.MapVotingPage // Map Voting page. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapVotingPage extends VotingPage; var automated MapVoteMultiColumnListBox lb_MapListBox; var automated MapVoteCountMultiColumnListBox lb_VoteCountListBox; var automated moComboBox co_GameType; var automated GUILabel l_Mode; var automated GUIImage i_MapListBackground, i_MapCountListBackground; // Localization var localized string lmsgMapVotingDisabled, lmsgReplicationNotFinished, lmsgMapDisabled, lmsgTotalMaps, lmsgMode[8]; //------------------------------------------------------------------------------------------------ function InternalOnOpen() { local int i, d; if( MVRI == none || (MVRI != none && !MVRI.bMapVote) ) { Controller.OpenMenu("GUI2K4.GUI2K4QuestionPage"); GUIQuestionPage(Controller.TopPage()).SetupQuestion(lmsgMapVotingDisabled, QBTN_Ok, QBTN_Ok); GUIQuestionPage(Controller.TopPage()).OnButtonClick = OnOkButtonClick; return; } // check if all maps and gametypes have replicated if( MVRI.GameConfig.Length < MVRI.GameConfigCount || MVRI.MapList.Length < MVRI.MapCount ) { Controller.OpenMenu("GUI2K4.GUI2K4QuestionPage"); GUIQuestionPage(Controller.TopPage()).SetupQuestion(lmsgReplicationNotFinished, QBTN_Ok, QBTN_Ok); GUIQuestionPage(Controller.TopPage()).OnButtonClick = OnOkButtonClick; return; } for( i=0; i -1 ) co_GameType.SetIndex(d); } //------------------------------------------------------------------------------------------------ function Submit() { SendVote(none); } //------------------------------------------------------------------------------------------------ function GameTypeChanged(GUIComponent Sender) { local int GameTypeIndex; GameTypeIndex = int(co_GameType.GetExtra()); if( GameTypeIndex > -1 ) { lb_MapListBox.ChangeGameType( GameTypeIndex ); lb_MapListBox.List.OnDblClick = MapListDblClick; } } //------------------------------------------------------------------------------------------------ function OnOkButtonClick(byte bButton) // triggered by th GUIQuestionPage Ok Button { Controller.CloseMenu(true); } //------------------------------------------------------------------------------------------------ function UpdateMapVoteCount(int UpdatedIndex, bool bRemoved) { MapVoteCountMultiColumnList(lb_VoteCountListBox.List).UpdatedVoteCount(UpdatedIndex, bRemoved); } //------------------------------------------------------------------------------------------------ function bool MapListDblClick(GUIComponent Sender) { SendVote(Sender); return true; } //------------------------------------------------------------------------------------------------ function SendVote(GUIComponent Sender) { local int MapIndex,GameConfigIndex; if( Sender == lb_VoteCountListBox.List ) { MapIndex = MapVoteCountMultiColumnList(lb_VoteCountListBox.List).GetSelectedMapIndex(); if( MapIndex > -1) { GameConfigIndex = MapVoteCountMultiColumnList(lb_VoteCountListBox.List).GetSelectedGameConfigIndex(); if(MVRI.MapList[MapIndex].bEnabled || PlayerOwner().PlayerReplicationInfo.bAdmin) MVRI.SendMapVote(MapIndex,GameConfigIndex); else PlayerOwner().ClientMessage(lmsgMapDisabled); } } else { MapIndex = MapVoteMultiColumnList(lb_MapListBox.List).GetSelectedMapIndex(); if( MapIndex > -1) { GameConfigIndex = int(co_GameType.GetExtra()); if(MVRI.MapList[MapIndex].bEnabled || PlayerOwner().PlayerReplicationInfo.bAdmin) MVRI.SendMapVote(MapIndex,GameConfigIndex); else PlayerOwner().ClientMessage(lmsgMapDisabled); } } } function bool AlignBK(Canvas C) { i_MapCountListBackground.WinWidth = lb_VoteCountListbox.MyList.ActualWidth(); i_MapCountListBackground.WinHeight = lb_VoteCountListbox.MyList.ActualHeight(); i_MapCountListBackground.WinLeft = lb_VoteCountListbox.MyList.ActualLeft(); i_MapCountListBackground.WinTop = lb_VoteCountListbox.MyList.ActualTop(); i_MapListBackground.WinWidth = lb_MapListBox.MyList.ActualWidth(); i_MapListBackground.WinHeight = lb_MapListBox.MyList.ActualHeight(); i_MapListBackground.WinLeft = lb_MapListBox.MyList.ActualLeft(); i_MapListBackground.WinTop = lb_MapListBox.MyList.ActualTop(); return false; } //------------------------------------------------------------------------------------------------ qY C ^6 ]^ 0uq Z )X-̟ Z )X-̟ Z )X-̟ Z )X-̟ ] + ͑X-̟ ] + ͑X-̟ ] + ͑X-̟ ] + ͑X-̟Z )Z )d awZ )d awƛ uzVGBƛ u] + @{ezmƛ uzVGBƛ uZ )d awZzm] + ] + ͐Y]ƛZZ FZ FƛƛƛƛZZ FZ Fƛzmƛzmˆ='% mlpmlpƛ] + Z )d awZ )Y]Z )Y]] + ͐Y]] + ͐Y]Ͳzmp iȲzmˆ='% ƛzm^JBjujsZalYmVn]CASorry, Map Voting has been disabled by the server administrator.o]87Map data download in progress. Please try again later.p]The selected Map is disabled.q]%mapcount% Total Maps ]Majority Mode Majority & Elimination Mode  Score Mode Score & Elimination Mode Majority & Accumulation Mode ,+Majority & Accumulation & Elimination Mode Score & Accumulation Mode )(Score & Accumulation & Elimination Modeo = Map VotingH '^ G ``_t// ==================================================================== // Class: xVoting.MapVoteHistory_INI // // Used to save map stats/history data to an ini file. Subclasses // // Written by Bruce Bickar // (c) 2002, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapVoteHistory_INI extends MapVoteHistory DependsOn(VotingHandler) Config(MapVoteHistory) PerObjectConfig; var config array H; // array used to store map data var config int LastMapIndex; var bool bUpdated; //------------------------------------------------------------------------------------------------ function AddMap(VotingHandler.MapHistoryInfo MapInfo) { local int x; if(MapInfo.M == "") return; bUpdated = true; if(LastMapIndex == -1) // brand new list { H.Insert(0,1); H[0].M = MapInfo.M; // add new map H[0].P = 0; H[0].S = 0; H[0].G = MapInfo.G; H[0].U = MapInfo.U; LastMapIndex = 0; return; } // search list for map for(x=0; x<=LastMapIndex; x++) { if(MapInfo.M ~= H[x].M) // found map { H[x].G = MapInfo.G; H[x].U = MapInfo.U; return; } if(Caps(H[x].M) > Caps(MapInfo.M)) // MapName is not in array and should be inserted here { H.Insert(x,1); LastMapIndex++; H[x].M = MapInfo.M; H[x].P = 0; H[x].S = 0; H[x].G = MapInfo.G; H[x].U = MapInfo.U; return; } } // didnt find insertion point so add at end LastMapIndex++; H.Insert(LastMapIndex,1); H[LastMapIndex].M = MapInfo.M; H[LastMapIndex].P = 0; H[LastMapIndex].S = 0; H[LastMapIndex].G = MapInfo.G; H[LastMapIndex].U = MapInfo.U; return; } //------------------------------------------------------------------------------------------------ function VotingHandler.MapHistoryInfo PlayMap(string MapName) { local int x,y; local bool bFound; local VotingHandler.MapHistoryInfo MapInfo; if(MapName == "") return MapInfo; bUpdated = true; if(LastMapIndex > H.Length - 1) LastMapIndex = H.Length - 1; if(LastMapIndex == -1) // brand new list { H.Insert(0,1); H[0].M = MapName; // add new map H[0].P = 1; H[0].S = 1; H[0].G = ""; H[0].U = ""; LastMapIndex = 0; MapInfo = H[0]; return MapInfo; } bFound = false; for(x=0; x<=LastMapIndex; x++) { if(MapName ~= H[x].M) // found map { H[x].S=1; // Set sequence (last 1 map played) H[x].P++; // increment Play count MapInfo = H[x]; // save data to return to caller bFound=true; } else { if(H[x].S > 0) // -1 indicates not to every play this map, 0 is a map that has never been played H[x].S++; // increment the sequence of all maps to make room for # 1 } if(Caps(H[x].M) > Caps(MapName) && !bFound) // MapName is not in array and should be inserted here { H.Insert(x,1); LastMapIndex++; for(y=LastMapIndex; y>x; y--) { if(H[y].S > 0) H[y].S++; } H[x].M = MapName; // add new map H[x].P = 1; H[x].S = 1; H[x].G = ""; H[x].U = ""; MapInfo = H[x]; return MapInfo; } } if(!bFound) // didnt find insertion point so add at end { LastMapIndex++; H.Insert(LastMapIndex,1); H[LastMapIndex].M = MapName; H[LastMapIndex].P = 1; H[LastMapIndex].S = 1; H[LastMapIndex].G = ""; H[LastMapIndex].U = ""; MapInfo = H[LastMapIndex]; } return MapInfo; } //------------------------------------------------------------------------------------------------ function VotingHandler.MapHistoryInfo GetMapHistory(string MapName) { local int Index; local VotingHandler.MapHistoryInfo MapInfo; Index = FindIndex(MapName); if(Index > -1 && Index < H.Length) { MapInfo = H[Index]; } return MapInfo; } //------------------------------------------------------------------------------------------------ function Save() { if(bUpdated) SaveConfig(); bUpdated = false; } //------------------------------------------------------------------------------------------------ function RemoveOldestMap() { local int x,Lowest; bUpdated = true; // scan the list for the oldest played map Lowest = 1; for(x=2; x<=LastMapIndex; x++) { if(H[x].S < H[Lowest].S) Lowest = x; } RemoveMapByIndex(Lowest); } //------------------------------------------------------------------------------------------------ function RemoveMap(string MapName) { local int Index; bUpdated = true; Index = FindIndex(MapName); if(Index > 0) RemoveMapByIndex(Index); } //------------------------------------------------------------------------------------------------ function RemoveMapByIndex(int Index) { bUpdated = true; H.Remove(Index,1); LastMapIndex--; } //------------------------------------------------------------------------------------------------ function int FindIndex(string MapName) { local int a,b,i; // speedy way to find the map if it alread exists //a 7 b //12345678901234568901234567890123456789012345 //|----------|----------|----------|----------| //1 < too high //2---------------------b b = ((b - a)/2) + a //3 > too low //4 a----------b a = ((b - a)/2) + a //7 < too high //8 a----b b = ((b - a)/2) + a //9 > too low //10 a--b a = ((b - a)/2) + a //11 > too low //12 a-b //13 > too low //14 ab //15 > too low //16 b a==b if(LastMapIndex == -1) return(-1); a = 1; b = LastMapIndex+1; while(true) { i = ((b-a)/2)+a; if(H[i-1].M ~= MapName) // check for a match return(i-1); // found if(a == b) // Not found return(-1); if(Caps(H[i-1].M) > Caps(MapName)) //check mid-way b = i; // too high else { if(a == i) a = b; else a = i; // too low } } } //------------------------------------------------------------------------------------------------ function Swap(int a,int b) { local VotingHandler.MapHistoryInfo MapInfo; MapInfo = H[a]; H[a] = H[b]; H[b] = MapInfo; } //------------------------------------------------------------------------------------------------ `O'// ==================================================================== // Class: xVoting.MapVoteHistory // // Interface class used for saving map voting stats/history data. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== //class MapVoteHistory extends Info DependsOn(VotingHandler); class MapVoteHistory extends Object DependsOn(VotingHandler); // This class is used by the VotingHandler to keep track of stats about maps // that have been played on the server. The MapHistoryInfo data structure is // used to copy data in/out of this class. //struct MapHistoryInfo //{ // var string M; // MapName - Used short/single character var names to keep ini file smaller // var int P; // Play count. Number of times map has been played // var int S; // Sequence. The order in which the map was played // var string G; // per map game options // var string U; // per map mutators //}; // This class is meant to be inherited and functions implemented in the subclass. // You can create subclasses in separate packages and then // "plug-in" your subclass using the MapVoteHistoryType ini config setting in the VotingHandler. // Examples: MapVoteHistoryType=Engine.MapVoteHistoryA // default // MapVoteHistoryType=MyPackage.MapVoteHistory_ODBC // MapVoteHistoryType=MyOtherPackage.MapVoteHistory_XML function AddMap(VotingHandler.MapHistoryInfo MapInfo); // add (or update if already exists) map to // the history data store. function RemoveMap(string MapName); // remove a map from the history data store function VotingHandler.MapHistoryInfo GetMapHistory(string MapName); // retrieve map info by MapName function VotingHandler.MapHistoryInfo GetMapBySeq(int SeqNum); // retrieve map info by Sequence number function VotingHandler.MapHistoryInfo GetLeastPlayedMap(); // retrieve least played map info function VotingHandler.MapHistoryInfo GetMostPlayedMap(); // retrieve most played map info function VotingHandler.MapHistoryInfo PlayMap(string MapName); // increment maps playcount and set sequence to 1 // also returns map info to caller function Save(); // save data changes to history data store `L// ==================================================================== // Class: xVoting.MapListLoader // // MapListLoader is an interface to the object/class that is responsible // for loading the list of map names into the VotingHandler. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapListLoader extends Info; function LoadMapList(xVotingHandler VotingHandler); function Reset(); `p,//==================================================================== // xVoting.KickVotingPage // Kick Voting page. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class KickVotingPage extends VotingPage; var automated GUISectionBackground sb_List; var automated KickVoteMultiColumnListBox lb_PlayerListBox; var automated GUILabel l_PlayerListTitle; var automated GUIButton b_Info, b_Kick; // Localization var localized string lmsgKickVotingDisabled; function InitComponent(GUIController InController, GUIComponent InOwner) { Super.InitComponent(InController, InOwner); sb_List.ManageComponent(lb_PlayerListBox); sb_List.ImageOffset[1]=8; } //------------------------------------------------------------------------------------------------ function InternalOnOpen() { if( MVRI == none || (MVRI != none && !MVRI.bKickVote) ) { Controller.OpenMenu("GUI2K4.GUI2K4QuestionPage"); GUIQuestionPage(Controller.TopPage()).SetupQuestion(lmsgKickVotingDisabled, QBTN_Ok, QBTN_Ok); GUIQuestionPage(Controller.TopPage()).OnButtonClick = OnOkButtonClick; return; } lb_PlayerListBox.List.OnDblClick = PlayerListDblClick; KickVoteMultiColumnList(lb_PlayerListBox.List).LoadPlayerList(MVRI); f_Chat.OnSubmit = SendKickVote; f_Chat.WinTop = 0.561457; f_Chat.WinHeight=0.432031; } //------------------------------------------------------------------------------------------------ function OnOkButtonClick(byte bButton) // triggered by th GUIQuestionPage Ok Button { Controller.CloseAll(true,true); } //------------------------------------------------------------------------------------------------ function UpdateKickVoteCount(VotingHandler.KickVoteScore KVCData) { KickVoteMultiColumnList(lb_PlayerListBox.List).UpdatedVoteCount(KVCData.PlayerID, KVCData.KickVoteCount); } //------------------------------------------------------------------------------------------------ function bool PlayerListDblClick(GUIComponent Sender) { SendKickVote(); return true; } //------------------------------------------------------------------------------------------------ function SendKickVote() { local int PlayerID; PlayerID = KickVoteMultiColumnList(lb_PlayerListBox.List).GetSelectedPlayerID(); if( PlayerID > -1 ) MVRI.SendKickVote(PlayerID); } //------------------------------------------------------------------------------------------------ function bool InfoClick(GUIComponent Sender) { lb_PlayerListBox.InternalOnClick(lb_PlayerListBox.ContextMenu,1); return true; } function bool KickClick(GUIComponent Sender) { lb_PlayerListBox.InternalOnClick(lb_PlayerListBox.ContextMenu,0); return true; } ]Match Setup LoginE*] UT2SmallFont$33>$N >$>$Y=?$?``u^// ==================================================================== // Class: xVoting.DefaultMapListLoader // // The DefaultMapListLoader is used by the VotingHandler to // load the list of map names. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class DefaultMapListLoader extends MapListLoader; var() config bool bUseMapList; var() config array MapListTypeList; var() config string MapNamePrefixes; var localized string UseMapListPropsDisplayText; var localized string UserMapListPropDescription; //------------------------------------------------------------------------------------------------ function LoadMapList(xVotingHandler VotingHandler) { local int p, i; local array PrefixList; local class GameClass; if(bUseMapList) { log("Loading Maps from the following MapLists",'MapVote'); if(MapListTypeList.Length == 0) { // Use default MapLists from each of MapVotes GameConfig settings for(i=0; i < VotingHandler.GameConfig.Length; i++) { GameClass = class(DynamicLoadObject(VotingHandler.GameConfig[i].GameClass, class'Class')); if(GameClass != none) { log(GameClass.default.MapListType,'MapVote'); LoadFromMapList(GameClass.default.MapListType, VotingHandler); } } } else { // Use the listed MapList classes for(i=0; i 0) { for(i=0; i < PrefixList.Length; i++) LoadFromPrefix(PrefixList[i],VotingHandler); } } } //------------------------------------------------------------------------------------------------ function LoadFromPreFix(string Prefix, xVotingHandler VotingHandler) { local string FirstMap,NextMap,MapName,TestMap; local int z; FirstMap = Level.GetMapName(PreFix, "", 0); NextMap = FirstMap; while(!(FirstMap ~= TestMap)) { MapName = NextMap; z = InStr(Caps(MapName), ".UT2"); if(z != -1) MapName = Left(MapName, z); // remove ".UT2" VotingHandler.AddMap(MapName, "", ""); NextMap = Level.GetMapName(PreFix, NextMap, 1); TestMap = NextMap; } } //------------------------------------------------------------------------------------------------ function LoadFromMapList(string MapListType, xVotingHandler VotingHandler) { local string Mutators,GameOptions; local class MapListClass; local string MapName; local array Parts; local array Maps; local int z,x,p,i; MapListClass = class(DynamicLoadObject(MapListType, class'Class')); if(MapListClass == none) { Log("___Couldn't load maplist type:"$MaplistType,'MapVote'); return; } Maps = MapListClass.static.StaticGetMaps(); for(i=0;i 1) { MapName = Parts[0]; for(x=1;x$=$=?$?A""'WKZ'h h `]Cancel$?$G ?$=$=?$?A""'WKZ'i h ``R@``b @`U`q  l `n ``J`AIh 3 o P?f/ƛ u uzVGBnLJBN'o [ C 'o D ``r  p `Y l `F p `s  @n `@ @`}```x ``{@`w`m``@p l```C @`\`O@`]`@l T`m``v ``y@`|`r@`S`K``b@`[`J ``a @i `` @`u`J`XBI2 JH /nvY]ͩ u- =1J u- =1- =1zVGB- =1zVGB- =1zVGBJ- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGBƛƛƛ- =1- =1zVGB u- =1- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGB- =1zVGBJƛƛƛJBg Y Player NameTeamIDVotesj Y ?>>>x Yg Player NamePlayer's TeamPlayer's ID number5Number of kick votes registered against this player.z "] e ]BrowserListSelection]ServerBrowserGrid``|``Q@`h```I ````j``R @``o ``S``a @``T``X@h `Z `Kn 6 yV d\7*4u:4u:&'% &'% &'% &'% &'% zmddddddddZ&'% &'% &'% &'% ddddddddZ4u:4u:4u:zm4u:dd4u:dd4u:dd4u:dd4u:D'% Z4u:4u:&'% 4u:zm4u:dd4u:dd4u:dd4u:dd4u:D'% Z4u:4u:dddd&'% dddd&'% ddzm&'% &'% &'% &'% zm4u:dd4u:dd4u:dd4u:dd4u:Z4u:4u:D'% D'% D'% &'% ZZ4u:&'% 4u:&'% ڲzmڝh&'% &'% &'% &'% &'% &'% &'% &'% &hhhhhhhhhhhhh&'% &'% ^JBEsFwGNHTkWJ[K|LJMUGpg@UZy"y"O]NewP]Addo ]Map Voting Game ConfigurationM$X'=P$=R$j?h$Fb?H 'V G $=$X'=$j?$Fb?sS``{@`~P[2 X 곡ZaC7~JBd ]#"xVoting.PlayerInfoMultiColumnList``]@`Qs{2 Z )ZaY]͘ZY]͐Y]͐Y]͐Y]͐Y]^ 0ud awZJBu ]xVoting.MapInfoPaged ]%$xVoting.MapVoteCountMultiColumnList~ NJ 'Z x ``\ @M `f`HK_2 ] + ͡Za@{eY]͘ZY]͐Y]͐Y]͐Y]͐Y]?Y]?ƛƛ@{eƛ u- =1^ 0u@{eZJBu ]xVoting.MapInfoPaged ] xVoting.MapVoteMultiColumnList~ OJ '] x ``E  @i `j``U  ``{@``W@`W``Rc~2 d awY]ƛƛƛƛƛƛƛƛƛƛƛƛƛƛƛJBg Y GameTypeMapNameVotesj Y >>>x Y@ Game Type Map Name)Number of votes registered for this map.z "] e ]BrowserListSelection]ServerBrowserGrid````s``O@`Uo Egi 6 h  so P?ƛƛߢ(a ddddߢ(adddd dddd Zdd0 udddd udd uzVGBJvaaRzg{kKlZmc]?>In order to login to match setup, you must supply a username.d]?>In order to login to match setup, you must supply a password.e]65Login attempt failed - invalid username or password.t]:9Please wait while your login credentials are verified...w]'&Successfully logged into match setup!f]Loging]Logouth]32Complete data transfer will take a few seconds...N'h [ C 'h D T ]Login$m~>$>``X@`q`M ``O @n `r``k  @n `m  @n `b`Ljs 2 =p iX4nXZddddddddKGKG4J'KG4J'KG4J'KG4J'hhhhh ddhhddddddddKG4J'KG4J'Zu*F????ddh u u uJBL}ivMkPwKZOR] BindBoxrS``Fs u`O``n  @n `^  @i `| @] `` @O X `k ```o `F @`s`o``I``c@``Z@``@`IN`2 @{eY]ƛƛƛZZƛƛƛƛƛƛƛƛZJBg Y Map NamePlayedSeqj Y ?L>L>x Y Map Name)Number of times the map has been played.TSequence, The number of games that have been played since this map was last played.e ]BrowserListSelection]ServerBrowserGrid``v@``q@``Z@@i G`@`~`T }^ >}%;}7E}Da } G`ts `G````T @M ZZO 6 J@z;ZZ u- =1 u- =1zVGB u- =1zVGB ߢ(aX 곎zVGBX 곎zVGBX 곎zVGBX 곎zVGBX 8f8fX 8fX 곒 ^JBX XpPXSYYS]Pingw]ScoreZ] Player ID[= IP Address\]KillsD]Deaths]] Suicides^= MultiKills_]SpreesJ SH$>$EA>$K\?$ӣ>sS``@``M``U````c @n `}@`WjE2 QաZaY]͘ZY]͐Y]͐Y]͐Y]͐Y]Bm=H /nvZ uzVGBH /nvƛ uzVGBH /nv u uzVGBH /nv u u uzVGBRJwJBO ]xVoting.KickInfoPaged ]! xVoting.KickVoteMultiColumnList~ MJ 'Qx ``y @`q`````````o Col 2 [W4o P?ӊ'% '% '% X-̟X-̟X-̟'% '% '% '% '% '% &'% '% &'% '% '% '% '% '% '% '% &'% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% &&'% '% '% '% '% '% '% '% '% '% '% '% '% '% hh'% ƛƛ'% '% ƛJBn DUGVMw N@U{ Ogc dcbeZC 'WD T ] Maplist```h `O``L``I @M `[ @M `Z@``p@``N @``f @^```C``E @n `K @````m``[@`` @L`]``c````m@````` @^Z `i``r@``s@``L@``F @s `^``M``````````@`y`d``X``}  @l `@P 2 -`( G`x ``JD /W G`(@`k<U`````r @n `n``i  @n `B@``\``t``h``} @l `[````@````@``S@``Q@``Y @M ```@``u  @] `u````d @u `````@``````|h `l  @l `|@``]``q``E@`` @Xp `F@``Y``e@``L``n ``w  @Z `@``K````V``C``f````e``z``````^``````````@````r@``k``U``y@`J`W````I``` @s `@``]``P``E@`{`@````c@``]n `M``i``I@``L@````S````p  @p `@``g@``f``V @p `\````a``@`I`^````d``_````j@````@`B```@``K``````@`^`q```J`l``\``u``N``@`o BCp 2 Gtao P?ӊ'% '% X-̟X-̟X-̟'% '% &'% '% &'% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% '% &&'% '% '% '% '% '% '% '% '% '% '% '% hh'% '% '% ƛƛƛJBn gURVKw F@}{ Ag\ XT ] Mutators``p@``@````a @l `@````_@`N`_````x``@````w``@````m``H@``@``B``}````~[ ." G`o ``y``~P| 4\( G`c ``J@``~``C``j``H``I``@`U```F``F @`n`D@``[i `Di `Y``@`R`@`u`J``Q@``u @i `i@`c`o``{ ``s``w@i `p@i `|``^``m``````@`E`o@````Mf 6 G```y@``D@`A`{``v@``@````F``D``@`V`A@`{`m@``l``P``G ````]````[``x@`Z`Z ```H@`c`@`e`k@``o@``V@```@``@``````B@``P@``Q@``H @p `y  @p `N@``\@``B ````#@``[@````@``N@``|@``^@``Y``X@``c@``g@``e@``@``@`f`Z@``@`````@`J`c``n@``q``@``_``@`Q`i``q``U``X @l `k``L @l `f@``V``{@````@``````y``W @] `a``R@``Q @`d]2 C7~Y]ͩJBg Y--j Y 33>ff&?x Y] e ]BrowserListSelection^'C@ ]ServerBrowserGrid``E@``P@```J_] 6 +GQ\7*ZD'% DJDJDJZDJddDJZD'% D'% ڼZDJDJddDJDJD'% DJhhhh ^JBXEYWzVZMMap Cycle Listo ]Map Voting List ConfigurationM$L>P$=R$?h$L?$=$L>$?$L?sS``@`O`@`t`}````x@````@``J``L@``r``@``T``N``l``L ````v @l `t @l `````W``b``[````V``^``W``Y @`````f@@``g@``?@@``O``j@`e`Z``E@``l``o``````@i `f@i `@``@````r``t  @i `o@``u``@``pKa :1-`'CN G`~@@Z v`s@`B`z``E@@Z r`@````@``M@``m``@``D@``S @p `@``T @p `G@``I@``@``K@``S@``h@```` ``J``P``@`}```L@``X@``@``@`C`@``h@``o``f``l@``d``e````E@````n @u `A  @u `]@``U ``@``h@````_ `l`snmlkji```a``o` Wq ]ServerBrowserGrid$!&>$>$73>$>J 'qx ``G @n oY >>L> Ws $!X=$ ף<$u?$#e>k g J 'sx ```oY ?L>L> Wu ]ServerBrowserGrid$U>$ ף<$u?$>k g J 'ux ``@``g@i `G@``S``N``x@````V``K``Q````{@``@``Y``[@``Y@``a``U@``_@``a@````]``Y@``[~ @`O@``@``A@``R@``@``P@``U@``@``x``Z @p `S@``p``X@``W @p `h````_``I``a @s `b @s `b @s `q e  Gh$ #;f$? Wd $?$ܑ>$'k?$zT>ASg r``c_  G`a``eB[ @{BP7q %{7q &q BF7q Fq B~|B,cmd c,rB,zB&.c,tB&c, sB' G`Z@``e``@`g`F``m``A``c``p``|``@````r``F@``] MutatorsP$K$j$=\ $=$G ?$z>$= >$>?$H>z 'w} ``k``K``{ @O `| @O `v  @O `w``@@``A@``B@``C@``D@``E@``F@``G@``@``~``J``````\@``D@` WN ]0/Select a game configuration to edit or delete.$4$>$6s ?$,,>$jN:?A"``Abo @vL2 PY%-o P?ۣ&ۣ&ۣ&ۣ&ۣ&ƛۣ&ۣ&ƛƛJBlCT ]Rules`F~$ #=]TabBackground$<$Ndf<$x?$ 7?A"k g s_'Qk`]Close$Y?$'\?$ >$g_)>A"m"'p KZ'Rh ``P@`'$>7$?= Game Class WT P]76Select a game type for the select game configuration.$f >$ 3<$?$'f=A"^'V B ``S@``YU|'$>7$?= Game Title WW P]*)Enter a custom game configuration title.$]7e>$ 3<$?$=A"^'V B ``x @l `X @l ]Submit$Y?$\v4?$#>$g_)>A"m"'p KZ'Zh `'$>7$?] Abbreviation W[ P]NA short abbreviation, description, or acronym that identifies the game configuration. This will be appended to the map name in vote messages.$؜>$ 3<$?$'f=A"^'V B ``@``@``]@````_``h@``c@``@``c@``o@``J @^`e@``@``j@``k@`'$>]Say Wk $p\^?$;$ C3?$U=A"Z'p h ``v``@````|````\``q``q@i `s@i `t@i ih$ #;f$ Wv ]ServerBrowserGrid$(d>$і3=$Ak?$ ?A"k g r``C@i `y````Q@``| `'$>7$?] Map Prefixes W| P]76List of map name prefixes. Separate each with commas.$O>$ 3<$?$=A"^'V B ``ASt , Go DXM 2 ?~4Jo P?ӌƛzmƛZƛZddƛddddzmZZddZƛƛZƛZƛzmˆ='% zmzmˆ='% ƛddƛƛZƛZƛzmˆ='% zmzmˆ='% ƛddƛJBZooypCq~rqT ] General``z@``Bm * G`UA ({ G}'Pj $?_'Ck``b@````M``H````n@` WJ P]JHSelect each mutator that should be loaded with this game configuration.$7>$@e>$>$Zf>A" ^'V B ``I@````@``@``@`h`i@``j@``@``J@```'$>7$?= Parameters WU P]nl(Advanced) List of game parameters with values. Separated each with a comma. (ex. GoalScore=4,MinPlayers=4)$S?$L=$>A"^'V B ``T```= Remove All]#"Remove all mutators from the list$L?$E?$&D>$a=A" v "'tC Z'Xh ``r `7$L>] Default WZ P]ZXThe selected game configuration will be the default if all the players leave the server$S?$(?$G>A"^'V B ```]RemovefJ^ e$?a $`],+Remove the selected mutators from the list$L?$3 ?$&D>$a=A" K v "'tC Z'\h ``S ``_``````[``@````s``v````l'$=]UserID Wg $AHV>$k2>$u(?$=A"k g Z'h J``u@``Z @u W'$=] Password Wk $I>$k2>$u(?$=A"k g Z'h I`]Login$^>$4.?$L >$=?$?A"k g "'h KZ'lh `]Cancel$>$?$Ӣ>$:=?$?A"k g "'h KZ'mh ``e @u ] Game Type Wo ]10Select the gametype to use in the current match$>$ i<$a?$=A"`]New]"!Create a new game configuration.$i?$u=$j">A""'V QZ'ph `]Tournament Mode Wq ]IGAll players must be connected to the server before the match can start$>$I<$7>$=A"``s@``t@``R@``z``u``x```SR]$#Additional Command Line Parameters Wy ];:Specify any additional command line parameters (optional)$L;?$f3<$p|?$L>A"``M@``R@``{@`]Add]'&Add the selected mutators to the list$sf?$S >$ȲP>$9+=A"K v "'tC Z'}h `] Record Demo W~ ])(Record a server-side demo of this match$]>$98<$r´>$=A"^'a ``w@`]DeleteP])(Delete the selected game configuration.$i?$l>$\#>A""'V WZ'@h `] Add All]Add all mutators to the list$sf?$6X8=$-B>$9+=A"v "'tC Z'Ah ``z@`'$=] Filename WC P]@?Enter the name of the demo you'd like to record for this match$6>$>$?$=A"`t ]Inactive Maps\ $G=$1<$hc<$Y>$w?k g z 'D} `7$L>]Use Map Cycle List WE ]DBLoad map names from the specified maps lists or using the prefix.$)==$NBi>$' ?$=A"k g ^'Gd` @ WF $:=$?$>$Ϥ)?A"`t ] Active Maps\ $(\>$1<$?$>$w?k g z 'G} ``h@``Li^`B@` @ WK $Rd >$ =$>$Ϥ)?A"``lkb @ WM $Rd >$ =$>$Ϥ)?A"` WN $:=$?$>$Ϥ)?A"`] Add All]Add all maps to your map list$sf?$6X8=$-B>$9+=A"v "'Wy Z'Oh ``j```t ]Active Mutators\ $G=$1<$?$>$w?k g z 'R} ``T @n `s  @n ]Add]('Add the selected maps to your map list$sf?$S >$ȲP>$9+=A"K v "'Wy Z'Uh ` WV ]21Select each maplist type to load map names from.$>">$ #=$ ?$?A"k g ^'Gi`'$>7$?] Map Prefixes WW ]IGList of map name prefixes. If more than one separate each with commas.$O?$=$I?$=A"k g ^'Gi`]Close$?$U+?$=$=?$?A"Z'Xh ` WY ]ServerBrowserGrid$o>$.>$N>$U>`]Down]&%Move this map lower down in the list${P?$3 ?$&D>$9+=A"K v "'Wy Z'Zh `Uvu 6 ![YEhydߢ(a   ZZhh ߢ(a ߢ(aڌ/$1c1cKG޸ߢ(aߢ(a hhhhhhh^JB}z}dwHyazTx|]No information available!C]Authorx] players@]Level Preview UnavailableM$D3>P$!=R$>h$LM?H$!=$D3>$>$LM?``V@``U@``]@``^@``_`'$33>]Filter Game Type: Wa $*>$L>$A?$=g `-Up]%$Move this map higher up in the list${P?$E?$&D>$9+=A" K v "'Wy Z'bh `]RemovefJ^ e$?a $`]-,Remove the selected maps from your map list$sf?$3 ?$&D>$9+=A" K v "'Wy Z'ch `= Remove All]$#Remove all maps from your map list$sf?$E?$&D>$9+=A" v "'Wy Z'dh ``e@``v@`t ]Inactive Mutators\ $G=$1<$hc<$Y>$w?k g z 'g} ``@``j``e ``Si>*ije %se 7 s '6e  *9Se e s %r c$i e %e 7i s '/6e i *6e i e  c)X` h z>u== >7?s  m s s  m n s  m m s  m k s  m cs  m Os  m Gs  m rEs DV -\ (>OptionsS r s S ף;S ף; r G r s  r n  r m  r k  r cT r Ons %rs 5% G`H G w s 5% G`lL` ~uOL%rL7XO'6LX*6LXL G`@``mpV )Bs %s ] F N9Js @]s ` s !S6N ''n 86N 'm 86N 'k 86N 'c 86N 'G89T fN'6N ,IT%T7IOSTI('T-\ ( G`T``@````@``K PB E-\ 'rPs jk c%c7i z6ci n n 86ji 's n]6ji c*m 86ji 'k 86ji 'BBrPn B]s n]n  G`~QL O-QeL rZ*ZL wZ* G```w``|zQ!!qF hk s -(s |%** New ** -1's -'n 8** New **'m 86hi 'k 86hi 'c 8'G8False'` ]%N-\ 's n m k cOGr' G`{``h``u}F  -\ 'Nu 7 7 u &6u  s @6u  n :6u  m :6u  k :6u  c:6u  O@p9KG: fu  Nu s p]p9SNu N6u  s @6u  n :6u  m :6u  k :6u  c:6u  O@9KG: fu  -\ (' G`u ``Ixk m'' G`y@W$/N%A N& ]%o%os i9Js  @oiNs pop9Si&oAs  e]&N]s %rs 5n 8'm 8'k 8'c 8'G8False's n m k cOG-\ ( s 5%' G`A``o``~`` @] `KJk zJ~%A~7A 7z6~A J~~ G`|@``LOb o :|~O 1|OO|O G`Oby0zb $- bb bN k b{6N A 6N A b{6N A L.6N A ZLeL rL*ZL wL*n9S6N A -9S6N A t c!6N A {6jA 6N A .y{yXMaps{6N A | y{\w|*j%Yj7|2{_aB_|aB_j|jr_6N A z__rj c_{6N A dps:6N A d G`@``@``Qzf %yz G`Hv>yvu c${89T D-dl D-dWu Wu W8 DL[z%z7 DXu Sz DX('zh  #=>"> ?? r u -'|EDu -_( G`jw>YwxL (h D-=L1=j?i>-'-' r Zj r jj-'j-' c%A  G`@``@``P^[Au ^%~^7{u 3p6^{ MapList*6^{^ G`[\s h\%N\7w D\w -`\w P \|-E( G`TWdH N-_'59K:Wu KWu  G```VYiW] -_' G```XcF `E -_]u @],l7 DX7lc%c7lc DXclcS D-d9K: DLW: D-_( G`]Ul wl*wl*U%U7w rUw lUw -`'Uw P U: G```d\d h -E' G`@``Z`u pUF m(' G`a``````ba>^Aa[>c,-A,, G`ebf -(h' G`ibW  rcgZ&zb db:chah;gZghocb G `cRKwR*$CM RP P V%Sw.B*.Bk & .H w Qb c,-.H w ]  (,%c,- .H w c,rpADMIN KICK   ,c,- .H w c,rpADMIN KICKBAN  c,rpADMIN KICK BAN    G`z ``g@``m]| N]|]loginzNz %z 7w gw.h z w *.h z w Ez w Csm z $'z %z 7w wz w *z w C|A z '6|]logoutz %6z 7w ,wz w *z w Csm z |] |N fz %z 7w z w f z m'( G`fkx C k9D9?&ykk& 5k' G`l``k``nPQ A1W PKV\4| KV\ i%~i7w tiw | KV\ i; G`pNt 6g"w* t N G`MAKwA*$CM A@ @ W%Tw.^ *.^ W  &.d p QM  G`qLa 0w.o L*-E' G`]lG>r]]GHEfiDs EfbDl lfEDQ %Z7{7~x .o lT{ ~Pwx *7w w x x XEx DDt Ex Dd =x Sx C|A Px Csm g G`@``otx )*C9D9?&yCC& 5C' G`u``C``@```o `Q{W h8r{n| .d nc | I.d nY-6| Oc,-K| Ic, -k| .@ c | I9J`@s-6| Oc,-K| Ic, -k G``@`@xKwx*$CM xu u W%Tw.^ *.^ W  &r.@p Q@r  G`}xN [R +.d nv x-y G```@|\V m' G`zdH *;7z7dd{ %{ 7dd{ z @{ zH d{ |6{ ddc,o{ { K o G`k``AR L Zk9J`@Wk K kE DQ G`CS EJ W * G`~nK 7 ` nz G` dG Cr*w*-o!QGUI2K4.GUI2K4QuestionPage.}Gi$$E.}D\ `7dZ 7OZ!QGUI2K4.GUI2K4QuestionPage.}Gj$$E.}D\ d%d7d`'/6dd*9Sddg`pp(9:Km) H .d n H EnDQn-'E DQ -'E`DR EfbDS q`V9Sg@q` 5q G`B~` >P.~rP* Br~ w* c-(X'OP(PPOP(~ G`m@``i @^`DHx ] w9D9?&yww& 5w' G`I``w``F @^`GUQ g @U%7U7zUzD *U G`A Nk@! IN.H  jFN kN G``>L`_ G`Q[E 3O4.H  v 6[6[ G```M^!!.C^] G`RO\.%'' G`I G "r*w*-G!QGUI2K4.GUI2K4QuestionPage.}G\$$E.}D\ E DL.H   MEfbDkf?f+3> G`]Q M* G`````@``V``w VM/rV* w VL c,Ak %7k I %I 7L |I L WebAdmin2|I L DemoRecSpectatorI L -I L -I L -!I L -!I L -@k 7k &@b 7k &&7k &b I L 67k &k I L NwI L *67k &k I L e67k &k ,67k &k %|%|7w C 67k &k 6|w C 67k &k 6|w C |I Ac-@'ED@  G`[Xk M m'' G`]BV $xzB $- Q %Q 7c,zQ c,Bc Q c,Q +Nc YrN*N.PlayerPictures.cDefault {N|Bv 9Rc v @9Uc v C9Sc v D9Uc w.c *v E9S.c Q %&Q ,S9:Q .c Q v F9SSQ %Q ,T9:Q .c Q Hv G9ST G`@``_Lf nV L G`YHv FG hw%_w7k U6wk H6wk ~w_wI  G`zI>l'IJEzDk  G`@````^T Ak %7k % G`bdj[} 7.66k 4 G```cfw cv $b ! G`@``ehhkK66k  G```g Guu c,v %v 7 qv  wv  *mv  m,|v  WebAdmin2|v  DemoRecSpectatorv  -v  -v  -!v  -!v  --C(x %px 7k f6x k q-C'c{x b v  x b v  px -C@k 7k &@b 7k &&7k &b v  67k &k q67k &k m67k &k %x %x 7w C 67k &k 6x w C 67k &k 6x w C x v v %v 7k q6v k -C(x %=x 7 3qx  -C'=x -CAb v &Ak v &x %x 76x v Ax &Ax &x gI v  G`m@KEZ!r@bm''<r@aCbe 'Wr@`Ci_ ' G```k``nsh Q9:U, 9:s, LCj[ FF 8''9:U& 7q %9:s,&FVFq F%F&'9:s,(FVFq F7q &F&'( G`P qY s tqs`~s, s"e%s,  G`gl>3g=lmscs$v.wv*EvDY v-Avvv|A,say AA,|A,teamsay AA, F VAr r sEDs G`iE@ p/I76I7k  -V0E\h9?,Yp9?,NNo %LMNAELhMp$6Ib Uc,- 66Ik ,U66Ik  ]Uo &LMN0ELhMp$Uo ,LMNHELhMp$9S66Ik o ,LMNHELhMp$9S66Ik  G```s @s `rs `ss `@``pwf ?#h-'hV G`Jy[ 8)JhRh-' G`L``zTj 3?*CDt ppppT :T;U G`~Qm .hcQR G`@``J``p\l u!%Q\b ,&Q9S6\k ,,Qp00009S6\k ,,Qp00009S6\k ,pQWQ G`M@H| |HT ppppRULES HandleResponse Info '_' Data '^'!z_ ]^,J7J,hy%J&J,Jh-'z_ W ^,EDm ED'( G`Q@``Eh^ ET  E G`}I #W G`AQ #w * G`~DPP 3-`P%Pp ~R p @P~o{yaBy,aBy9S~PCDt ppT :y~ G`GFN !$Fw FT 3FXUr %S`Sp %TT G`~ ~H I~ ~K%;K7~ { KED@  G```IWC A'rWZ '.rWVO '@r.W*(.W mF  SZ|%'p q r r ' HO  TV|%'r q p p ' ( G"`Ehv C-|h:/h:hI  G`Jz`;N%N7y 6[Ny zp p6~ Ny r \6~ Ny 'r '6ZNy 6~ Ny p {  N G`Typ S%S7y 6[Sy yr p6~ Sy p \6~ Sy 'p '6ZSy 6~ Sy r {  S G`HLc M](66~ {  G```KNYR0(66~ {  G```MPp W QK666~ { ~ ON G`@``O_@ b  r~ * ]-C0_}V9?,Q9?,[h[o %uM[c_uVMQ$666J~ { ~ do &uM[c_uVMQ$666J~ { ~ Oo ,uM[Q_uVMQ$9S66J~ {  G`@``H``WSO p w (p -(]p s 'H%H7]p r H] 'r n H]HDp -'p { p 5p ' G`@``A``XV r w (r -(Ur s 'A%A7Ur r AU 'p n AUADr -'r { r 5r ' G`ZB>{$ YB@r Zp Vwr *r -'r -'Er DC r m F'Er DN r -(.wp *p -'p -'Ep DC p m H'Ep DN p -([ r ZW r V G`u``@\D s '@r p  G`v``^DR h Jv%Av7y 7|6~ vy Dvv G`Qol %}66o~ { ~ d,&}66o~ { ~ O,,}p00009S6o~ { ,p}m} G``Fr XYR a<YY7y 7y 7y &6[Yy F6~ Yy a6ZYy E G`}@``igt >` o~g,Ko[9Jgoggo&HandleResponse received weird mutator:g G(g,lnpHandleResponse received invalid mutator string:g M(r [lnr n l G`]I m G`aQ D~ * G`bdv' G`e````@``Y````MjI| #|IT ppppMUTATORS HandleResponse Info 'a' Data 'X'!{|a ]t X'|a W  {XX,fY%Y7fp 9JYfY'( G`EM^ ET  e G`D K>;K]J]SquareButton G`@`M`A@``k^H  D ^6_D d,^I%I7D OP%P7^|6ID O}P^P^i7J @J i&iJ IPUI5ED@  G`qyB "#DDy]y NDA~] A]p]Ay @D] G `x@``r^b  kx~^ 1x^^xx~^?bx^^x^ G `tlN ][;$lw lT 3lXUq %t`tl %vl w l %LLl l &}}L}8vL} G`f ``|ey G[rex!'.reau'@r.e*(.e mY! tx|%'l q q q ' Xu va|%'q q l (l ' LGl w 'f l sB l f %l qf f &l 5f &' S}l w 'f l sB l Qf a|&l qf f &l 5f &' ( G"`@``n3)AJ %7J % G`vxc : 6J  G```wzp ?C=66J D O@ G`@``yO@ Kx  rD * -p w*--w9:*2O%F,%9:9:$ @dO%&F&,%n-o0OkF9?,nc9?,zyz-66@J D Ou$uo %|XzUOu|FXc$66@J D Oo &|XzWOu|FXc$9S66@J D Oo ,|XzWOu|FXc$9S66@J D O G`~}~P ~%~l xR l N~vxf{FaBF,aBF9Sx~CDt ppT :F~ G`~f`a%a7} 6}a} fl i6Pa} q \6Pa} q 6Pa} l {  a G`Aix e%e7} 6}e} iq i6Pe} l \6Pe} l 6Pe} q {  e G`@``C``D@ul w (l -(Wl s 'C%C7Wl r CW 'q n CWCDl -'l { l 5l ' G`@``r``EC! q w (q -(fq s 'r%r7fq r rf 'l n rfrDq -'q { q 5q ' G`Gs>v srq xl awq *q -'q -'Eq Dy q m Y'Eq DN q -(Xwl *l -'l -'El Dy l m X'l m L'l m }'El DN l -(Y r xX r a G`o``ItR k< Jo%Ao7} 7|6Po} too G`{Ol x%G6OJ D O,&Gp0000009S6OJ D O,,Gp0000009S6OJ D O,pGQG G`KPy ZkR pPLCkk7} 7} 7} &6Uk} P6Sk} L6Pk} pPL6}k} x G`G@``Q`z FNr~`,KrQ9J`rN`r&HandleResponse received weird mapname:` O(y b NQq N G`HI Q G`LQ iD * G`MyD5@!-K wy*CxB,=-Cv G`@``S``MRM| +/|MT ppppMAPS HandleResponse Info 'D' Data 'E'!w|D ]z E'|D W E,HS%S7Hx 9JSHS'( G`@SD r'@q l  G`EV^  ET  i G`@`V`@`O`g aJ@g 7g &6A7g &g a6R7g &g h G`K@``Z\_ Xr\*KT \ ][ aBKppp: Q;[ @O TaBKppp: R;9TTU O IaBKp: SIU aBKp;[O L\aBKp: BI{\aBKp;\O K G`V^@ /[76[7g  o %TSF^TaSd$6A6[g o &TSF^TaSd$6R6[g  G`~[P  .{M[ @CDt _ [ ]-OTU CDt _ T-YIU CDt _ I{K\CDt _ \~ G`z__a s H:r_I/IU [:[z_ G`a``d``d``Mbb| 1}|bT ppppMAIN HandleResponse Info 'c' Data 'Y '!c,dereceived unknown general token'|d ]e  R-O9KY T89T-O' E S-Y9KY I89T-Y'7-Y[B[  QMY {M[ -([ SY '[ -'  BKY \ 8K' {{|d W e ` R-O9KY T89T-O'{  S-Y9KY I89T-Y'-Y[[{ D QMY A{M[ -([ SY '[ -'{ x BKY \ 8K'{ '( G`a``T``E[ ^ pET  H G`K@``Yel -p6A%g  G`f``@``phf pA f G`iEEE t ^ aA s^  G`@jD 62@E t ^ A  G`Jk[ {=JaA fpU Xn'' G`lF] G`mdGHt ^ aA qX2dc G`nD v :qE gE  dfE gE  fpE gE  E E w G`p} U  -w 6} t 6} ^ Tz6}  6} Z6} [cF 6} 6} cc7CcC} b G`D``rgF fD%]D7CSz6DCgz6DCeDD G`@``whA T vhD  G`@````@``t``}lIC PK9:l,+9:l, KE KK9:l,&t *'( G`e L C=X Oa e-{-fdgZ c  G`x{Z QR %7F % c)F K,{A%A7{wG A{w{R aBR ,aBR 9SwA; G```@``z``@mJv[ E@9:o,9:m,  9:m,(^ *'( G`yt\ i R %7F % c)F {0w{*tG 9V{t{R aBR ,aBR 9St{{K G`u``BnKFN rX*'rnE zE wut v^ zut A u'zv^ A t'GuvzE gF'rnam('' G`~Rc O y U mK a` U R%R7mjE Rmj{O aBO ,aBO 9SjRC G`Cpw>pD  G`Hr>Frq\c,^ -'Y\{YY:Z[ZY[7777DF Z[ Dt V6DC^ V6DC-6DCKE CCw\*t V\ G`v @i `@``AnX :Vzn oK nSo?n` oy  G`@``w@i `zQ AlX* G`@``````L@``M@``g zg Bz NAME CHARACTER )TEAM 2GAME @ADMINNAME RADMINPASSWORD ^MUTATOR hCLASS wTOURNAMENT NUMBOTS BAUTONUMBOTS DEMOREC( ' G`N@````i H0 sO y U zK a` U H%H7z}E Hz{O aBO ,aBO 9S}HC G`@````YTS$+| wX*X-" G`@``@``}``EW| 0H@c,w@*w@*@- G`@````^[_\ -H G```a]^\ -G G``` Go 2wK *GK a` U HDG%{G7GK u` U GGG=G%G7HK !` U GHGK D` U  G`d_WP\ -o G```@``G bu\ -" G`@```Oy 40r0*r0* rK * ` U K B` 9WU U K d?9WO G`jK\Y~n.Jq {wn*nv  JBKnv  JAI G0`@``fIv 16zI/7R% c$Rs%ps7Rf|6sRIss6pp9WGetGameCacheIndex() didn't find index for game class 'I'! G`lQ]Wxum -/a9 jts|jQ\jjt10 G``s``ngGVgm b k&BQg>9?&g?m P k&B$kk%ag>( G`iJG +7zJ/7F % c)F w%pw7F f|6wF Jww6pp9WGetMutatorCacheIndex() didn't find index for mutator class 'J'! G`I t^SSt,  t,<t&B!`m P t&B$t, em b , Be>9?&e?ae>(m P , B$k,  G`w``rRHMRW G`mqE ?9zq57y % c%y AH~q?fHqqHH%H7y |q6Hy HHmpp9WGetMapCacheIndex() didn't find index for map 'q'! G`tpaRIzp ppppppHandleCommand Type: 'p' Info: 'r' Data: 'L'!p i-"-f(-`n (spr_ e-"-f(-`n (spr_ \HY-"-f(r E %R VS-`n (srL _ -`n ~ prL G`H``wRb?}HrQPB&zR dR:QMaM;PBPMoQR G `qvAWh;b+z?X 9V0Xv ?\X6XR G`X@``{Sc7G2bSJIGaJIG G`uyCf<$Mi M,SS G`M@`z`@``Y Rj 'FZzR -{LaBRp:LL{KaBRp;KHR G`A`{ Z8r %fr 7C \6`6r C 6r C 6`-O'fr -Or 7C @C r &r C `-YWw.Bq *.Bq E r C  G`@``xDp5=$VTV,XX G`V@`@`@``BiI 3S %S 7{ 6i6S { 6i6S { v6i%A{ S &6S { 6i-T'S -TS 7{ @{ S &S { i-]Wwm *wm *Ww.^ q *.^ q N S 6i%w.[q *.^ q N S 6i% G`FWl2>7OOWp___Receiving - 6WW G`@``~Ei {=R ,j]%]7ja9J]ja%a7F n{daBd,aBd6aF ]d G`]@``GYu{W1>7ddYp___Receiving - 6YW G`Hxto/_n (pppTickedReplication_Mutators 9Sx, 6x_F 6i^6x_F 6h^6x_F j e]pppp9Sx,6i^,6h^-U-^ G`IbsdY-pppTickedReplication_Maps 9Sb, 6bn (y j i]pp9Sb,6bn (y -U-_ G`MirX+p___Sending KickVoteCountIndex 9Si^-`{ in @ '-U'7C C in @  G`@``DLT?O ,pm%m7pq9Jmpq%q7y n{uaBu,aBu6qy mu G`m@``NkqL,*p___Sending MapVoteCountIndex 9Sk]-cI kn t '-U'~7{ { kn t  G`Opo$$+Sp,fn (p Y%j HppW ,Qf?C ~&j iW fO C ,j eW fR C ,j HppW ,Bfa C ,j HppW ,R9Tf-{C @,j HppW ,SfdC -U-\(p___Sending 6p,n (mp,n ((6mj E]pppp6m,9V6m,6m-U-\ G`P^n"}sn a^ppp___Sending 9S^ - 6sh-dls-U'z7OOs G`S_m }vn $c_ppp___Sending 9S_ - 6vh-euv-U'z7ddv G`@`Ei `Q] TextLabel$J?$+>$+?$>?$?k g ``x f~ LI`@| %&6k%| f6_ %| %6j%| ` G```WTq wr9:9:$9:9:$rwm *wm *.m * G```XV}  rm * G`z J0-} -- r*am  G `| |;m .n . G`W @```````L``ldc:m76l76lm&6m6lMapVoting6m6l9T-Y76lm&6m6lKickVoting6m6l9T-l G```b_B] I*ppppMatchConfig,9V,9SG  G`T``cpY MT%T7wT*T-"-p-oTj Tw1Tn-p-oT G`d`~ ?U%U7U-"wU`U1j _UW pp^,]U-f(U G`ftE7qY -t-t G```ge~)64e GAMECONFIG7 .MAPLIST1  G`i\g\ GAMECONFIGHV%V7& `, ` l%6VV &6VV ,6VV ,6VV ,6VV ,6VV  MAPLIST  G```jHWH GAMECONFIG@7&67&XGame.xDeathMatch67&67&67&new67&67&7& MAPLIST  G`lBQs]B HGAMECONFIG:z%z7& Az& WMAPLISTZ  G`@``nh{Uh @GAMECONFIG4u, u%uO OMAPLISTR  G`@``@ D\e5D GAMECONFIG<b7& C,C h%pGAMETYPE;50;6b &pTEXT;50;6b ,pTEXT;20;6b ,pTEXT;50;6b ,pMUTATORS;255;6b ,pTEXT;255;6b 2 /MAPLIST2  G```C wutl (w (bMapVote 6bAutoOpen JScoreBoardDelay YbScoreMode obAccumulationMode bEliminationMode MinMapCount RepeatLimit VoteTimeLimit MidGameVotePercent bDefaultToCurrentGameType GameConfig MapListLoaderType' bKickVote 0KickPercent HbAnonymousKicking' ZbMatchSetup( w G(`O @E  @% G %G 7@ 6G @ @^%6G @ %u6G @ 6G @ %6G @ %-t'G  -t %G 7@ @@ G &6G @ @6G @ &J%J7wJ*wJm *G 7@ J{ G @ (J G`X ]u GB %B 7t 6B t b6B t ]6B t WOB t 6B t %At B &-h'B /-h W%B 7t @t B &6B t b6B t ]6B t WOB t K%K7wK*wKm *K I O(K6 G`u False$/?$]1<$Lv?$+3>A" ``{ TruePO$PU1>$;S>$j?$i>?$L>g `]No Preview AvailableE*]UT2HeaderFontKSi `$PU1>$;S>$j?$i>g `] MapAuthorE*]UT2ServerListFont$ >$?S/=$Qj?$,J=?$>g `] PlayersE*]UT2ServerListFont$ >$?S/=$Qj?$,J=?$>g `` True`````|// ==================================================================== // Class: xVoting.PlayerInfoMultiColumnListBox // // Multi-Column list box used to display Player Info. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class PlayerInfoMultiColumnListBox extends GUIMultiColumnListBox; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { super.InitComponent(MyController, MyOwner); // Header.Hide(); } //------------------------------------------------------------------------------------------------ function Add(string Label, string Value) { PlayerInfoMultiColumnList(List).Add(Label,Value); } //------------------------------------------------------------------------------------------------ `s// ==================================================================== // Class: xVoting.PlayerInfoMultiColumnList // // Multi-Column list box used to display player info. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class PlayerInfoMultiColumnList extends GUIMultiColumnList; struct PlayerInfoData { var string Label; var string Value; }; var array ListData; //------------------------------------------------------------------------------------------------ function Add(string Label, string Value) { ListData.Insert(ListData.Length,1); ListData[ListData.Length-1].Label = Label; ListData[ListData.Length-1].Value = Value; AddedItem(); } //------------------------------------------------------------------------------------------------ function DrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local float CellLeft, CellWidth; if( i >= SortData.Length || SortData[i].SortItem >= ListData.Length ) return; GetCellLeftWidth( 0, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, ListData[SortData[i].SortItem].Label, FontScale ); GetCellLeftWidth( 1, CellLeft, CellWidth ); Style.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, ListData[SortData[i].SortItem].Value, FontScale ); } //------------------------------------------------------------------------------------------------ function string GetSortString( int i ) { return ListData[0].Label; } //------------------------------------------------------------------------------------------------ `x//============================================================================== // Created on: 01/02/2004 // Configures match rules for match setup // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MatchSetupRules extends MatchSetupPanelBase; var automated RemotePlayInfoPanel p_Rules; function InitPanel() { Super.InitPanel(); Group = class'VotingReplicationInfo'.default.OptionID; } function bool HandleResponse(string Type, string Info, string Data) { local array Parts; local string str1, str2; if ( Type ~= Group ) { log("RULES HandleResponse Info '"$Info$"' Data '"$Data$"'",'MapVoteDebug'); if ( Info == class'VotingReplicationInfo'.default.AddID ) { Split(Data, Chr(27),Parts); Parts.Length = 3; p_Rules.ReceivedRule( Parts[0], Parts[1], Parts[2] ); p_Rules.bUpdate = True; } if ( Info == class'VotingReplicationInfo'.default.UpdateID && Divide(Data, Chr(27), str1, str2) ) ReceiveValue( str1, str2 ); return true; } return false; } function ReceiveValue( string SettingName, string NewValue ) { p_Rules.ReceivedValue( SettingName, NewValue ); } function SendValue( string SettingName, string NewValue ) { SendCommand( Group $ ":" $ SettingName $ ";" $ NewValue ); } function LoggedIn() { Super.LoggedIn(); p_Rules.ClearRules(); p_Rules.bRefresh = true; } function ReceiveComplete() { p_Rules.bUpdate = true; p_Rules.Refresh(); } `O//============================================================================== // Created on: 01/02/2004 // Base class for all match setup panels // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved // TODO: CONFLICTS!!! someone updates a setting that you've already changed...their change is replicated down // what to do about this? //============================================================================== class MatchSetupPanelBase extends UT2K4TabPanel abstract; var() string Group; var() editconst noexport VotingReplicationInfo VRI; var() bool bDirty; function InitPanel() { local int i; for ( i = 0; i < Controls.Length; i++ ) Controls[i].OnChange = InternalOnChange; } function bool IsAdmin() { local PlayerController PC; PC = PlayerOwner(); return PC != None && PC.PlayerReplicationInfo != None && PC.PlayerReplicationInfo.bAdmin; } function bool IsLoggedIn() { return IsAdmin() || VRI != None && VRI.bMatchSetupPermitted; } // Called when the player logs in, or when the voting replication info requests a full refresh delegate OnLogIn(); // Called when the player logs out delegate OnLogOut(); // Called by panels to send info the server delegate SendCommand( string Cmd ); function LoggedIn() { EnableComponent(MyButton); } function LoggedOut() { DisableComponent(MyButton); } // Called on the active panel when 'Submit' is clicked function SubmitChanges() { bDirty = false; } // Called when information is received from the server function bool HandleResponse(string Type, string Info, string Data) { return false; } // Called when data transfer from the server is completed function ReceiveComplete(); // Called when something has been changed on the panel function InternalOnChange(GUIComponent Sender) { bDirty = true; OnChange(Self); } event Free() { VRI = None; Super.Free(); } `Lq//============================================================================== // Created on: 01/03/2004 // Configure mutators in match setup // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MatchSetupMutator extends MatchSetupPanelBase; var automated GUISectionBackground sb_Avail, sb_Active; var automated GUIListBox lb_Avail, lb_Active; var() editconst noexport GUIList li_Active, li_Avail; var automated GUIButton b_Add, b_AddAll, b_Remove, b_RemoveAll; struct MutatorInfo { var string ClassName, FriendlyName; var int Index; }; var() array TrackedMutators; function InitPanel() { Super.InitPanel(); Group = class'VotingReplicationInfo'.default.MutatorID; } function bool HandleResponse(string Type, string Info, string Data) { local int i; local array Indexes; if ( Type ~= Group ) { log("MUTATORS HandleResponse Info '"$Info$"' Data '"$Data$"'",'MapVoteDebug'); if ( Info ~= class'VotingReplicationInfo'.default.AddID ) { ReceiveNewMutator(Data); return true; } if ( Info ~= class'VotingReplicationInfo'.default.UpdateID && Data != "" ) { Split(Data, ",", Indexes); for ( i = 0; i < Indexes.Length; i++ ) AddMutatorByIndex(int(Indexes[i])); } return true; } return false; } //MutatorID, AddID, Index $ "," $ M.ClassName $ Chr(27) $ M.FriendlyName function ReceiveNewMutator( string Data ) { local int Index, pos; local string ClassName, FriendlyName; pos = InStr(Data, ","); if ( pos != -1 ) { Index = int(Left(Data,pos)); Data = Mid(Data, pos+1); } else { log("HandleResponse received weird mutator:"@Data); assert(false); } if ( !Divide(Data, Chr(27), ClassName, FriendlyName) ) { log("HandleResponse received invalid mutator string:"$Data); assert(false); } TrackMutatorInfo(Index, ClassName, FriendlyName); li_Avail.Add(FriendlyName,,ClassName); } function TrackMutatorInfo( int Index, string ClassName, string FriendlyName ) { local int i; i = FindTrackingIndex(ClassName); if ( i == -1 ) { i = TrackedMutators.Length; TrackedMutators.Length = TrackedMutators.Length + 1; } TrackedMutators[i].Index = Index; TrackedMutators[i].ClassName = ClassName; TrackedMutators[i].FriendlyName = FriendlyName; } function int FindTrackingIndex( string ClassName ) { local int i; for ( i = 0; i < TrackedMutators.Length; i++ ) { if ( TrackedMutators[i].ClassName ~= ClassName ) return i; } return -1; } function LoggedOut() { Super.LoggedOut(); li_Avail.Clear(); li_Active.Clear(); } function InitComponent(GUIController InController, GUIComponent InOwner) { Super.InitComponent(InController, InOwner); li_Avail = lb_Avail.List; li_Active = lb_Active.List; if (li_Avail != None) { li_Avail.bDropSource = True; li_Avail.bDropTarget = True; li_Avail.OnDblClick = ModifyMutatorList; li_Avail.AddLinkObject( b_Add, True ); li_Avail.CheckLinkedObjects = InternalCheckLinkedObj; li_Avail.bInitializeList = False; } if (li_Active != None) { li_Active.bDropSource = True; li_Active.bDropTarget = True; li_Active.OnDblClick = ModifyMutatorList; li_Active.AddLinkObject( b_Remove, True ); li_Active.CheckLinkedObjects = InternalCheckLinkedObj; li_Active.bInitializeList = False; } sb_Avail.ManageComponent(lb_Avail); sb_Active.ManageComponent(lb_Active); } // Mapname has value only when initializing list function bool AddMutator() { local int i; local array PendingElements; if ( !li_Avail.IsValid() ) return false; li_Avail.bNotify = False; PendingElements = li_Avail.GetPendingElements(True); for ( i = 0; i < PendingElements.Length; i++ ) { li_Avail.RemoveElement(PendingElements[i],,True); li_Active.AddElement(PendingElements[i]); } li_Avail.bNotify = True; li_Avail.ClearPendingElements(); li_Avail.SetIndex(li_Avail.Index); return true; } function bool RemoveMutator() { local int i; local array PendingElements; if ( !li_Active.IsValid() ) return false; li_Active.bNotify = False; PendingElements = li_Active.GetPendingElements( True ); for ( i = 0; i < PendingElements.Length; i++ ) { li_Active.RemoveElement( PendingElements[i],,True ); li_Avail.AddElement( PendingElements[i] ); } li_Active.bNotify = True; li_Active.ClearPendingElements(); li_Active.SetIndex(li_Active.Index); return true; } function AddMutatorByIndex( int Index ) { local int i; for ( i = 0; i < TrackedMutators.Length; i++ ) { if ( TrackedMutators[i].Index == Index ) { li_Avail.RemoveExtra(TrackedMutators[i].ClassName); if ( li_Active.FindIndex(TrackedMutators[i].ClassName,,True) == -1 ) li_Active.Add(TrackedMutators[i].FriendlyName,,TrackedMutators[i].ClassName); li_Avail.ClearPendingElements(); return; } } } function RemoveMapByIndex( int Index ) { local int i; for ( i = 0; i < TrackedMutators.Length; i++ ) { if ( TrackedMutators[i].Index == Index ) { li_Active.RemoveExtra(TrackedMutators[i].ClassName); if ( li_Avail.FindIndex(TrackedMutators[i].ClassName,,True) == -1 ) li_Avail.Add(TrackedMutators[i].FriendlyName,,TrackedMutators[i].ClassName); li_Active.ClearPendingElements(); return; } } } // Called when one of the buttons between the maplists are clicked on singular function bool ModifyMutatorList(GUIComponent Sender) { if ( Sender == lb_Avail ) { AddMutator(); return true; } if ( Sender == lb_Active ) { RemoveMutator(); return true; } if ( GUIButton(Sender) == None ) return false; switch ( GUIButton(Sender).Caption ) { case b_Add.Caption: return AddMutator(); case b_AddAll.Caption: if (lb_Avail.ItemCount()==0) return true; li_Active.LoadFrom(li_Avail); li_Avail.Clear(); return true; case b_Remove.Caption: return RemoveMutator(); case b_RemoveAll.Caption: if ( lb_Active.ItemCount()==0 ) return true; li_Avail.LoadFrom(li_Active); li_Active.Clear(); return true; } return false; } // This function overrides GUIList default behavior because we only want to disable the AddAll and RemoveAll // if those lists are empty function InternalCheckLinkedObj( GUIListBase List ) { if ( List.IsValid() ) List.EnableLinkedObjects(); else List.DisableLinkedObjects(); if ( li_Avail.ItemCount > 0 ) EnableComponent(b_AddAll); else DisableComponent(b_AddAll); if ( li_Active.ItemCount > 0 ) EnableComponent(b_RemoveAll); else DisableComponent(b_RemoveAll); } function SubmitChanges() { local int i, idx; local string str; if ( bDirty ) { for ( i = 0; i < li_Active.ItemCount; i++ ) { idx = FindTrackingIndex(li_Active.GetExtraAtIndex(i)); if ( idx != -1 ) { if ( str != "" ) str $= ","; str $= idx; } } SendCommand( Group $ ":" $ str ); } Super.SubmitChanges(); } `F//============================================================================== // Created on: 01/02/2004 // Configures maplist for match setup // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MatchSetupMaps extends MatchSetupPanelBase; var automated GUISectionBackground sb_Avail, sb_Active; var automated GUIListBox lb_Avail, lb_Active; var() editconst noexport GUIList li_Active, li_Avail; var automated GUIButton b_Add, b_AddAll, b_Remove, b_RemoveAll, b_MoveUp, b_MoveDown; struct MapInfo { var string FriendlyName, Params, URL; var int Index; }; var() array TrackedMaps; function InitPanel() { Super.InitPanel(); Group = class'VotingReplicationInfo'.default.MapID; } function LoggedOut() { Super.LoggedOut(); li_Avail.Clear(); li_Active.Clear(); } function bool HandleResponse(string Type, string Info, string Data) { local int i; local array Indexes; if ( Type ~= Group ) { log("MAPS HandleResponse Info '"$Info$"' Data '"$Data$"'",'MapVoteDebug'); if ( Info ~= class'VotingReplicationInfo'.default.AddID ) { ReceiveNewMap(Data); return true; } if ( Info ~= class'VotingReplicationInfo'.default.UpdateID ) { Split(Data, ",", Indexes); for ( i = 0; i < Indexes.Length; i++ ) AddMapByIndex(int(Indexes[i])); } return true; } return false; } function ReceiveNewMap( string Data ) { local int Index, pos; local string MapName; pos = InStr(Data, ","); if ( pos != -1 ) { Index = int(Left(Data,pos)); MapName = Mid(Data, pos+1); } else { log("HandleResponse received weird mapname:"@Data); assert(false); } TrackMapInfo( StripMapName(MapName), "", Index ); li_Avail.Add(MapName); } function TrackMapInfo( string FriendlyName, string URL, int Index ) { local int i; i = FindTrackingIndex(FriendlyName $ URL); if ( i == -1 ) { i = TrackedMaps.Length; TrackedMaps.Length = TrackedMaps.Length + 1; } TrackedMaps[i].FriendlyName = FriendlyName; TrackedMaps[i].Params = URL; TrackedMaps[i].URL = FriendlyName $ URL; TrackedMaps[i].Index = Index; } function int FindTrackingIndex( string MapURL ) { local int i; for ( i = 0; i < TrackedMaps.Length; i++ ) { if ( TrackedMaps[i].URL ~= MapURL ) return i; } return -1; } function InitComponent(GUIController InController, GUIComponent InOwner) { Super.InitComponent(InController, InOwner); li_Avail = lb_Avail.List; li_Active = lb_Active.List; if (li_Avail != None) { li_Avail.bDropSource = True; li_Avail.bDropTarget = True; li_Avail.OnDblClick = ModifyMapList; li_Avail.AddLinkObject( b_Add, True ); li_Avail.CheckLinkedObjects = InternalCheckLinkedObj; li_Avail.bInitializeList = False; } if (li_Active != None) { li_Active.bDropSource = True; li_Active.bDropTarget = True; li_Active.OnDblClick = ModifyMapList; li_Active.AddLinkObject( b_Remove, True ); li_Active.AddLinkObject( b_MoveUp, True ); li_Active.AddLinkObject( b_MoveDown, True ); li_Active.CheckLinkedObjects = InternalCheckLinkedObj; li_Active.bInitializeList = False; } sb_Avail.ManageComponent(lb_Avail); sb_Active.ManageComponent(lb_Active); } // Mapname has value only when initializing list function bool AddMap() { local int i; local array PendingElements; if ( !li_Avail.IsValid() ) return false; li_Avail.bNotify = False; PendingElements = li_Avail.GetPendingElements(True); for ( i = 0; i < PendingElements.Length; i++ ) { li_Avail.RemoveElement(PendingElements[i],,True); li_Active.AddElement(PendingElements[i]); } li_Avail.bNotify = True; li_Avail.ClearPendingElements(); li_Avail.SetIndex(li_Avail.Index); return true; } function bool RemoveMap() { local int i; local array PendingElements; if ( !li_Active.IsValid() ) return false; li_Active.bNotify = False; PendingElements = li_Active.GetPendingElements( True ); for ( i = 0; i < PendingElements.Length; i++ ) { li_Active.RemoveElement( PendingElements[i],,True ); li_Avail.AddElement( PendingElements[i] ); } li_Active.bNotify = True; li_Active.ClearPendingElements(); li_Active.SetIndex(li_Active.Index); return true; } function AddMapByIndex( int Index ) { local int i; for ( i = 0; i < TrackedMaps.Length; i++ ) { if ( TrackedMaps[i].Index == Index ) { li_Avail.RemoveItem(TrackedMaps[i].URL); if ( li_Active.FindIndex(TrackedMaps[i].URL) == -1 ) li_Active.Add(TrackedMaps[i].URL); li_Avail.ClearPendingElements(); return; } } } function RemoveMapByIndex( int Index ) { local int i; for ( i = 0; i < TrackedMaps.Length; i++ ) { if ( TrackedMaps[i].Index == Index ) { li_Active.RemoveItem(TrackedMaps[i].URL); if ( li_Avail.FindIndex(TrackedMaps[i].URL) == -1 ) li_Avail.Add(TrackedMaps[i].URL); li_Active.ClearPendingElements(); return; } } } function SubmitChanges() { local int i, idx; local string str; for ( i = 0; i < li_Active.ItemCount; i++ ) { idx = FindTrackingIndex(li_Active.GetItemAtIndex(i)); if ( idx != -1 ) { if ( str != "" ) str $= ","; str $= idx; } } SendCommand( Group $ ":" $ str ); Super.SubmitChanges(); } // Called when one of the buttons between the maplists are clicked on singular function bool ModifyMapList(GUIComponent Sender) { local int Index; local string Str; if ( Sender == lb_Avail ) { AddMap(); return true; } if ( Sender == lb_Active ) { RemoveMap(); return true; } if ( GUIButton(Sender) == None ) return false; switch ( GUIButton(Sender).Caption ) { case b_Add.Caption: return AddMap(); case b_AddAll.Caption: if (lb_Avail.ItemCount()==0) return true; // for ( Index = 0; Index < li_Avail.ItemCount; Index++ ) // MapHandler.AddMap( GameIndex, RecordIndex, li_Avail.GetItemAtIndex(Index) ); li_Active.LoadFrom(li_Avail); li_Avail.Clear(); return true; case b_Remove.Caption: return RemoveMap(); case b_RemoveAll.Caption: if ( lb_Active.ItemCount()==0 ) return true; // for ( Index = 0; Index < li_Active.ItemCount; Index++ ) // MapHandler.RemoveMap( GameIndex, RecordIndex, li_Active.GetItemAtIndex(Index) ); li_Avail.LoadFrom(li_Active,false); li_Active.Clear(); return true; case b_MoveUp.Caption: if ( !li_Active.IsValid() ) return true; Index = li_Active.Index; Str = GetMapURL(li_Active, -1); if (index>0) { li_Active.Swap(index,index-1); li_Active.SetIndex(Index - 1); } // MapHandler.ShiftMap(GameIndex, RecordIndex, Str, -1); return true; case b_MoveDown.Caption: if ( !li_Active.IsValid() ) return true; Index = li_Active.Index; Str = GetMapURL(li_Active, -1); if (index 0 ) EnableComponent(b_AddAll); else DisableComponent(b_AddAll); if ( li_Active.ItemCount > 0 ) { EnableComponent(b_RemoveAll); if ( li_Active.IsValid() ) { if ( li_Active.Index == 0 ) DisableComponent(b_MoveUp); else { EnableComponent(b_MoveUp); if ( li_Active.Index == li_Active.ItemCount -1 ) DisableComponent(b_MoveDown); else EnableComponent(b_MoveDown); } } else { DisableComponent(b_MoveUp); DisableComponent(b_MoveDown); } } else { DisableComponent(b_RemoveAll); DisableComponent(b_MoveUp); DisableComponent(b_MoveDown); } } // Remove any additional text from the map's name // Used for getting just the mapname static function string StripMapName( string FullMapName ) { local int pos; pos = InStr(FullMapName, " "); if ( pos != -1 ) FullMapName = Left(FullMapName, pos); pos = InStr(FullMapName, "?"); if ( pos != -1 ) FullMapName = Left(FullMapName, pos); return FullMapName; } // Remove the additional text, and append the extra string data from the list // Used when passing in a URL for the selected map static function string GetMapURL( GUIList List, int Index ) { local int pos; local string s; if ( Index == -1 ) Index = List.Index; s = List.GetItemAtIndex(Index); pos = InStr(s, " "); // extra text in the mapname - get additional parameters from extra info if ( pos != -1 ) s = Left(s, pos) $ List.GetExtraAtIndex(Index); return s; } `[E//============================================================================== // Created on: 01/02/2004 // Configure general match setup options // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MatchSetupMain extends MatchSetupPanelBase; var automated moComboBox co_GameType; var automated moEditBox ed_Params, ed_DemoRec; var automated moCheckbox ch_DemoRec, ch_Tournament; var bool bDemoRec, bTournament; var string GameClass, DemoFilename, Params; function InitPanel() { Super.InitPanel(); Group = class'VotingReplicationInfo'.default.GeneralID; } function bool HandleResponse(string Type, string Info, string Data) { local string InfoStr, SubType; if ( Type ~= Group ) { log("MAIN HandleResponse Info '"$Info$"' Data '"$Data$"'",'MapVoteDebug'); if ( !Divide(Info, Chr(27), InfoStr, SubType) ) { log("received unknown general token"); return true; } if ( InfoStr ~= class'VotingReplicationInfo'.default.AddID ) { switch ( SubType ) { case class'VotingReplicationInfo'.default.TournamentID: bTournament = bool(Data); ch_Tournament.SetComponentValue(bTournament,True); break; case class'VotingReplicationInfo'.default.DemoRecID: bDemoRec = bool(Data); ch_DemoRec.SetComponentValue(bDemoRec,true); if ( bDemoRec ) EnableComponent(ed_DemoRec); else DisableComponent(ed_DemoRec); break; case class'VotingReplicationInfo'.default.GameTypeID: GameClass = Data; if ( GameClass != "" ) { co_GameType.MyComboBox.List.bNotify = false; co_GameType.Find(Data, ,true); co_Gametype.MyComboBox.List.bNotify = true; } break; case class'VotingReplicationInfo'.default.URLID: Params = Data; ed_Params.SetComponentValue(Params,true); break; } } else if ( InfoStr ~= class'VotingReplicationInfo'.default.UpdateID ) { // this setting was changed by someone else switch ( SubType ) { case class'VotingReplicationInfo'.default.TournamentID: bTournament = bool(Data); ch_Tournament.SetComponentValue(bTournament,True); break; case class'VotingReplicationInfo'.default.DemoRecID: bDemoRec = bool(Data); ch_DemoRec.SetComponentValue(bDemoRec,true); if ( bDemoRec ) EnableComponent(ed_DemoRec); else DisableComponent(ed_DemoRec); break; case class'VotingReplicationInfo'.default.GameTypeID: GameClass = Data; if ( GameClass != "" ) { co_GameType.MyComboBox.List.bNotify = false; co_GameType.Find(Data, ,true); co_Gametype.MyComboBox.List.bNotify = true; } break; case class'VotingReplicationInfo'.default.URLID: Params = Data; ed_Params.SetComponentValue(Params,true); break; } } return true; } return false; } function InternalOnChange( GUIComponent Sender ) { if ( Sender == ch_DemoRec ) { if ( ch_DemoRec.IsChecked() ) EnableComponent(ed_DemoRec); else DisableComponent(ed_DemoRec); } Super.InternalOnChange(Sender); } function SubmitChanges() { if ( GameClass != co_GameType.GetExtra() ) SendCommand( GetCommandString(co_GameType) ); if ( bTournament != ch_Tournament.IsChecked() ) SendCommand( GetCommandString(ch_Tournament) ); if ( bDemoRec != ch_DemoRec.IsChecked() ) SendCommand( GetCommandString(ch_DemoRec) ); if ( Params != ed_Params.GetText() ) SendCommand( GetCommandString(ed_Params) ); Super.SubmitChanges(); } function string GetCommandString( GUIComponent Comp ) { local string str; if ( Comp == None ) return ""; str = Group; switch ( Comp ) { case co_Gametype: str $= ":" $ class'VotingReplicationInfo'.default.GametypeID $ ";" $ co_GameType.GetExtra(); break; case ch_Tournament: str $= ":" $ class'VotingReplicationInfo'.default.TournamentID $ ";" $ ch_Tournament.IsChecked(); break; case ch_DemoRec: str $= ":" $ class'VotingReplicationInfo'.default.DemoRecID; if ( ch_DemoRec.IsChecked() ) str $= ";" $ ed_DemoRec.GetText(); break; case ed_Params: str $= ":" $ class'VotingReplicationInfo'.default.URLID; if ( ed_Params.GetText() != "" ) str $= ";" $ ed_Params.GetText(); break; } return str; } `GT//============================================================================== // Created on: 01/02/2004 // Login panel for Match Setup // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MatchSetupLoginPanel extends MatchSetupPanelBase config(LoginCache); var() config bool bAutoLogin, bKeepHistory; var() config array LoginHistory; var() editconst noexport string CurrentIP, CurrentPort; var automated GUILabel l_Title, l_Status; var automated moEditBox ed_LoginName; var automated moEditBox ed_LoginPassword; var automated GUIButton b_Submit, b_Cancel; var() localized string NoUsernameSpecified, NoPasswordSpecified, InvalidLoginText, WaitingForLoginText, LoggedText, ButtonLoginText, ButtonLogoutText, PleaseWaitText; function InitComponent( GUIController C, GUIComponent O ) { local PlayerController PC; local string str; local int i; Super.InitComponent(C, O); PC = PlayerOwner(); ed_LoginPassword.MyEditBox.bConvertSpaces = True; str = PC.GetServerNetworkAddress(); if ( str != "" ) { if ( !Divide(str, ":", CurrentIP, CurrentPort) ) { CurrentIP = str; CurrentPort = "7777"; } } i = FindCredentials(CurrentIP, CurrentPort); if ( i != -1 ) { ed_Loginname.SetText(LoginHistory[i].Username); ed_LoginPassword.SetText(LoginHistory[i].Password); if ( LoginHistory[i].bAutoLogin ) InternalOnClick(b_Submit); } else if ( PC.PlayerReplicationInfo != None ) ed_LoginName.SetText(PC.PlayerReplicationInfo.PlayerName); } function Opened(GUIComponent Sender) { Super.Opened(Sender); UpdateSubmitButton(); } function bool InternalOnClick(GUIComponent Sender) { local string uname, upass; if ( VRI == None ) return true; if ( Sender == b_Submit ) { if ( b_Submit.Caption == ButtonLoginText ) { uname = ed_LoginName.GetText(); upass = ed_LoginPassword.GetText(); if ( uname == "" ) { SetFocus(ed_LoginName); UpdateStatus(NoUsernameSpecified); return true; } if ( upass == "" ) { SetFocus(ed_LoginPassword); UpdateStatus(NoPasswordSpecified); return true; } SendLogin(uname,upass); } else if ( b_Submit.Caption == ButtonLogoutText ) { SendLogout(); } return true; } if ( Sender == b_Cancel ) { Controller.CloseMenu(false); return true; } return true; } function bool UserNameKeyEvent( out byte Key, out byte State, float Delta ) { if ( State == 3 && (Key == 0x0D || Key == 0x28) ) // enter or down { ed_LoginPassword.SetFocus(none); return true; } return false; } function bool PasswordKeyEvent( out byte Key, out byte State, float Delta ) { if ( State == 3 ) { if ( Key == 0x0D ) // enter return InternalOnClick(b_Submit); else if ( Key == 0x26 ) // up { ed_LoginName.SetFocus(none); return true; } } return false; } protected function UpdateStatus(string NewStatusMsg ) { l_Status.Caption = NewStatusMsg; UpdateSubmitButton(); } protected function int FindCredentials( coerce string IP, coerce string Port ) { local int i; for ( i = 0; i < LoginHistory.Length; i++ ) if ( LoginHistory[i].IP == IP && LoginHistory[i].Port == Port ) return i; return -1; } protected function SaveCredentials() { local AutoLoginInfo NewInfo; local int i; if ( !bKeepHistory ) return; NewInfo.UserName = ed_LoginName.GetText(); NewInfo.Password = ed_LoginPassword.GetText(); if ( NewInfo.Password == "" ) return; NewInfo.IP = CurrentIP; NewInfo.Port = CurrentPort; i = FindCredentials(NewInfo.IP, NewInfo.Port); if ( i == -1 ) i = LoginHistory.Length; LoginHistory[i] = NewInfo; SaveConfig(); } function UpdateSubmitButton() { switch( l_Status.Caption ) { case WaitingForLoginText: b_Submit.Caption = ButtonLogoutText; DisableComponent(b_Submit); break; case LoggedText: b_Submit.Caption = ButtonLogoutText; EnableComponent(b_Submit); break; case LoggedText @ PleaseWaitText: b_Submit.Caption = ButtonLogoutText; DisableComponent(b_Submit); break; default: EnableComponent(b_Submit); b_Submit.Caption = ButtonLoginText; break; } } function SendLogin( string UserName, string Password ) { DisableComponent(ed_LoginName); DisableComponent(ed_LoginPassword); EnableComponent(b_Cancel); UpdateStatus(WaitingForLoginText); VRI.MatchSetupLogin(UserName, Password); } function SendLogout(); function LoggedIn() { Super.LoggedIn(); DisableComponent(b_Cancel); UpdateStatus(LoggedText @ PleaseWaitText); SaveCredentials(); VRI.RequestMatchSettings(True,True); } function LoggedOut() { Super.LoggedOut(); EnableComponent(b_Submit); EnableComponent(ed_LoginName); EnableComponent(ed_LoginPassword); UpdateStatus(""); } function LoginFailed() { EnableComponent(b_Submit); EnableComponent(ed_LoginName); EnableComponent(ed_LoginPassword); DisableComponent(b_Cancel); UpdateStatus(InvalidLoginText); SetFocus(ed_LoginPassword); } function ReceiveComplete() { Super.ReceiveComplete(); UpdateStatus(LoggedText); } `W://============================================================================== // Created on: 12/30/2003 // Description // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MatchConfigPage extends VotingPage; var automated GUITabControl c_Groups; var array Panels; var() config array PanelClass, PanelHint; var() bool bDirty; function InitComponent(GUIController InController, GUIComponent InOwner) { local int i; local MatchSetupPanelBase Panel; Super.InitComponent(InController, InOwner); f_Chat.OnAccept = AcceptAndSave; f_Chat.OnSubmit = SubmitActive; c_Groups.MyFooter = f_Chat; MVRI.ProcessResponse = OnResponse; for ( i = 0; i < PanelClass.Length && i < PanelHint.Length; i++ ) { Panel = MatchSetupPanelBase(c_Groups.AddTab("", PanelClass[i],,PanelHint[i])); if ( Panel != None ) { Panels[Panels.Length] = Panel; Panel.VRI = MVRI; Panel.SendCommand = SendCommand; Panel.OnChange = PanelChanged; if ( Panel.IsLoggedIn() ) Panel.OnLogIn(); else Panel.OnLogOut(); } } } function InternalOnChange( GUIComponent Sender ) { if ( MatchSetupPanelBase(Sender) != None ) bDirty = true; } function SendCommand( string Command ) { if ( MVRI != None ) MVRI.SendCommand(Command); } function OnResponse( string Response ) { local int i; local string Type, Info, Data; // log("Received response from MVRI:"@Response); DecodeResponse(Response, Type, Info, Data); if ( HandleResponse(Type, Info, Data) ) return; for ( i = 0; i < Panels.Length; i++ ) if ( Panels[i].HandleResponse(Type, Info, Data) ) return; } function bool HandleResponse(string Type, string Info, string Data) { local int i; if ( Type ~= "login" ) { if ( Info == "" ) { for ( i = 0; i < Panels.Length; i++ ) { if ( MatchSetupLoginPanel(Panels[i]) != None ) MatchSetupLoginPanel(Panels[i]).LoginFailed(); else Panels[i].OnLogout(); } return true; } for ( i = 0; i < Panels.Length; i++ ) { if ( Panels[i] != None ) Panels[i].OnLogIn(); } return true; } if ( Type ~= "logout" ) { for ( i = 0; i < Panels.Length; i++ ) if ( Panels[i] != None ) Panels[i].OnLogOut(); } if ( Type ~= class'VotingReplicationInfo'.default.StatusID ) { if ( Info ~= class'VotingReplicationInfo'.default.CompleteID ) { for ( i = 0; i < Panels.Length; i++ ) Panels[i].ReceiveComplete(); return true; } } return false; } static function DecodeResponse( string Response, out string Type, out string Info, out string Data ) { local string str; Type = ""; Info = ""; Data = ""; if ( Response == "" ) return; if ( Divide(Response, ":", Type, str) ) { if ( !Divide(str, ";", Info, Data) ) Info = str; } else Type = Response; } event bool NotifyLevelChange() { bPersistent = false; LevelChanged(); return true; } function PanelChanged( GUIComponent Sender ) { bDirty = true; } function SubmitActive() { local int i; if ( c_Groups.ActiveTab != None && c_Groups.ActiveTab.MyPanel != None ) { for ( i = 0; i < Panels.Length; i++ ) { if ( Panels[i] == c_Groups.ActiveTab.MyPanel ) { if ( Panels[i].bDirty == true ) Panels[i].SubmitChanges(); break; } } } } function AcceptAndSave() { local int i; for ( i = 0; i < Panels.Length; i++ ) { if ( Panels[i].bDirty ) Panels[i].SubmitChanges(); } MVRI.MatchSettingsSubmit(); bDirty = false; } qFUZ 6 "Gqo P?o P?ƛ=W=Wo P?o P?h so P?o P?o P?ӌƛƛo P?o P?ƛp ip iƛo P?o P?o P?o P?o P?o P?^JByQCYxVoting.MatchSetupLoginPanelxVoting.MatchSetupMainxVoting.MatchSetupMapsxVoting.MatchSetupMutatorxVoting.MatchSetupRulesxY-Enter your match setup username and passwordGeneral match parameters7Select the maps that should be played during the match;Select the mutators that should be active during the match0Select the rules that will be used in the match|l``l2// ==================================================================== // Class: xVoting.MapVoteMultiColumnListBox // // Multi-Column list box used to display maps and game types. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapVoteMultiColumnListBox extends GUIMultiColumnListBox; var string MapInfoPage; var array ListArray; //------------------------------------------------------------------------------------------------ function InternalOnClick(GUIContextMenu Sender, int Index) { local string MapName; if (Sender != None) { if ( NotifyContextSelect(Sender, Index) ) return; switch (Index) { case 0: if( MapVotingPage(MenuOwner) != none ) MapVotingPage(MenuOwner).SendVote(self); break; case 1: MapName = MapVoteMultiColumnList(List).GetSelectedMapName(); Controller.OpenMenu( MapInfoPage, MapName ); break; } } } //------------------------------------------------------------------------------------------------ function LoadList(VotingReplicationInfo LoadVRI) { local int i,g; ListArray.Length = LoadVRI.GameConfig.Length; for( i=0; i= List.ItemCount ) NewIndex = List.ItemCount - 1; List.SetIndex(NewIndex); return true; } //------------------------------------------------------------------------------------------------ function Free() { local int i; for( i=0; i < ListArray.Length; i++ ) ListArray[i].VRI = none; super.Free(); } //------------------------------------------------------------------------------------------------ `}N// ==================================================================== // Class: xVoting.MapVoteMultiColumnList // // Multi-Column list box used to display maps and game types. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapVoteMultiColumnList extends GUIMultiColumnList; var VotingReplicationInfo VRI; var array MapVoteData; var int PrevSortColumn; var GUIStyles SelStyle; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.InitComponent(MyController, MyOwner); SelStyle = Controller.GetStyle("SquareButton",FontScale); } //------------------------------------------------------------------------------------------------ function LoadList(VotingReplicationInfo LoadVRI, int GameTypeIndex) { local int m,p,l; local array PrefixList; VRI = LoadVRI; Split(VRI.GameConfig[GameTypeIndex].Prefix, ",", PrefixList); for( m=0; m -1 ) return VRI.MapList[MapVoteData[SortData[Index].SortItem]].MapName; else return ""; } //------------------------------------------------------------------------------------------------ function DrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local float CellLeft, CellWidth; local eMenuState MState; local GUIStyles DrawStyle; if( VRI == none ) return; // Draw the drag-n-drop outline if (bPending && OutlineStyle != None && (bDropSource || bDropTarget) ) { if ( OutlineStyle.Images[MenuState] != None ) { OutlineStyle.Draw(Canvas, MenuState, ClientBounds[0], Y, ClientBounds[2] - ClientBounds[0], ItemHeight); if (DropState == DRP_Source && i != DropIndex) OutlineStyle.Draw(Canvas, MenuState, Controller.MouseX - MouseOffset[0], Controller.MouseY - MouseOffset[1] + Y - ClientBounds[1], MouseOffset[2] + MouseOffset[0], ItemHeight); } } // Draw the selection border if( bSelected ) { SelectedStyle.Draw(Canvas,MenuState, X, Y-2, W, H+2 ); DrawStyle = SelectedStyle; } else DrawStyle = Style; if( !VRI.MapList[MapVoteData[SortData[i].SortItem]].bEnabled ) MState = MSAT_Disabled; else MState = MenuState; GetCellLeftWidth( 0, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MState, CellLeft, Y, CellWidth, H, TXTA_Left, VRI.MapList[MapVoteData[SortData[i].SortItem]].MapName, FontScale ); GetCellLeftWidth( 1, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MState, CellLeft, Y, CellWidth, H, TXTA_Left, string(VRI.MapList[MapVoteData[SortData[i].SortItem]].PlayCount), FontScale ); GetCellLeftWidth( 2, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MState, CellLeft, Y, CellWidth, H, TXTA_Left, string(VRI.MapList[MapVoteData[SortData[i].SortItem]].Sequence), FontScale ); } //------------------------------------------------------------------------------------------------ function string GetSortString( int i ) { local string ColumnData[5]; ColumnData[0] = left(Caps(VRI.MapList[MapVoteData[i]].MapName),20); ColumnData[1] = right("000000" $ VRI.MapList[MapVoteData[i]].PlayCount,6); ColumnData[2] = right("000000" $ VRI.MapList[MapVoteData[i]].Sequence,6); return ColumnData[SortColumn] $ ColumnData[PrevSortColumn]; } //------------------------------------------------------------------------------------------------ event OnSortChanged() { Super.OnSortChanged(); PrevSortColumn = SortColumn; } //------------------------------------------------------------------------------------------------ function Free() { VRI = none; super.Free(); } //------------------------------------------------------------------------------------------------ function InternalOnEndDrag(GUIComponent Accepting, bool bAccepted) { if (bAccepted && Accepting != None) OnDblClick(Self); SetOutlineAlpha(255); if ( bNotify ) CheckLinkedObjects(Self); } `^>// ==================================================================== // Class: xVoting.MapVoteMapListConfigPage // // this page allows modification of the DefaultMapListLoader // configuration variables that could not be // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapVoteMapListConfigPage extends GUICustomPropertyPage DependsOn(VotingHandler); var automated GUIButton b_Return; var automated moCheckBox ch_UseMapList; var automated moEditBox ed_MapListPrefix; var automated MultiSelectListBox lb_MapList; var localized string sbCaption; var array GameTypes; // autosave var bool bChanged; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); // load game types class'CacheManager'.static.GetGameTypeList(GameTypes); ch_UseMapList.SetComponentValue(string(class'xVoting.DefaultMapListLoader'.default.bUseMapList)); if( class'xVoting.DefaultMapListLoader'.default.bUseMapList ) { DisableComponent(ed_MapListPrefix); EnableComponent(lb_MapList); } else { EnableComponent(ed_MapListPrefix); DisableComponent(lb_MapList); } ed_MapListPrefix.SetComponentValue(class'xVoting.DefaultMapListLoader'.default.MapNamePrefixes); LoadMapLists(); for(i=0; i MapListArray; if( bChanged ) { SelectedMapLists = lb_MapList.List.GetExtra(); Split(SelectedMapLists, ",", MapListArray); class'xVoting.DefaultMapListLoader'.default.MapListTypeList.Length = MapListArray.Length; for(i=0; i GameTypes; var array Mutators; var() editconst noexport CacheManager.GameRecord CurrentGame; // autosave var() int SaveIndex, ListIndex; var bool bChanged; // localization var localized string lmsgNew; var localized string lmsgAdd; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { local int i; Super.Initcomponent(MyController, MyOwner); // load existing configuration for(i=0; i MutatorArray; if (lb_GameConfigList.List.ItemCount==0 || lb_GameConfigList.List.Index == ListIndex) return; SaveChange(); SaveIndex = int(lb_GameConfigList.List.GetExtra()); ListIndex = lb_GameConfigList.List.Index; LoadMutators(); co_GameClass.Find(class'xVoting.xVotingHandler'.default.GameConfig[SaveIndex].GameClass, true, True); ed_GameTitle.SetComponentValue(class'xVoting.xVotingHandler'.default.GameConfig[SaveIndex].GameName, True); ed_Acronym.SetComponentValue(class'xVoting.xVotingHandler'.default.GameConfig[SaveIndex].Acronym, True); ed_Prefix.SetComponentValue(class'xVoting.xVotingHandler'.default.GameConfig[SaveIndex].Prefix, True); ed_Parameter.SetComponentValue(class'xVoting.xVotingHandler'.default.GameConfig[SaveIndex].Options, True); ch_Default.SetComponentValue(string(class'xVoting.xVotingHandler'.default.DefaultGameConfig == SaveIndex), True); Split(class'xVoting.xVotingHandler'.default.GameConfig[SaveIndex].Mutators, ",", MutatorArray); for(i=0; i=0) { class'xVoting.xVotingHandler'.default.GameConfig.Remove(SaveIndex,1); class'xVoting.xVotingHandler'.static.StaticSaveConfig(); } if (ListIndex>=0) { for (i=0;i SaveIndex ) lb_GameconfigList.List.SetExtraAtIndex(i,""$(x-1)); } lb_GameConfigList.List.Remove(ListIndex,1); } SaveIndex = -1; ListIndex = -1; if (lb_GameConfigList.List.ItemCount==0) { DisableComponent(b_Delete); co_GameClass.SetIndex(-1); ed_GameTitle.SetComponentValue("", True); ed_Acronym.SetComponentValue("", True); ed_Prefix.SetComponentValue("", True); ed_Parameter.SetComponentValue("", True); ch_Default.SetComponentValue("False", True); DisableComponent(co_GameClass); DisableComponent(ed_GameTitle); DisableComponent(ed_Acronym); DisableComponent(ed_Prefix); DisableComponent(ed_Parameter); DisableComponent(lb_Mutator); DisableComponent(ch_Default); bChanged=false; } else lb_GameConfigList.List.SetIndex(0); return true; } `e@//============================================================================== // Created on: 01/02/2004 // Contains controls for participating in chat while mapvote menus are open // // Written by Ron Prestenback // 2003, Epic Games, Inc. All Rights Reserved //============================================================================== class MapVoteFooter extends GUIFooter; var() noexport array RecallQueue; var() noexport int RecallIdx; var() noexport int idxLastChatMsg; var() noexport float LastMsgTime; var automated GUISectionBackground sb_Background; var automated GUIScrollTextBox lb_Chat; var automated moEditBox ed_Chat; var automated GUIButton b_Accept, b_Submit, b_Close; delegate OnSubmit(); delegate OnAccept(); delegate bool OnSendChat( string Text ) { if ( Text != "" ) { if ( RecallQueue.Length == 0 || RecallQueue[RecallQueue.Length - 1] != Text ) { RecallIdx = RecallQueue.Length; RecallQueue[RecallIdx] = Text; } if ( Left(Text,4) ~= "cmd " ) PlayerOwner().ConsoleCommand( Mid(Text, 4) ); else { if ( Left(Text,1) == "." ) PlayerOwner().TeamSay( Mid(Text,1) ); else PlayerOwner().Say( Text ); } } return true; } function InitComponent(GUIController InController, GUIComponent InOwner) { local string str; local ExtendedConsole C; Super.InitComponent(InController, InOwner); lb_Chat.MyScrollText.SetContent(""); lb_Chat.MyScrollText.FontScale=FNS_Small; C = ExtendedConsole(Controller.ViewportOwner.Console); if ( C != None ) { C.OnChatMessage = ReceiveChat; if ( C.bTyping ) { str = C.TypedStr; C.TypingClose(); if ( Left(str,4) ~= "say " ) str = Mid(str, 5); else if ( Left(str,8) ~= "teamsay " ) str = Mid(str, 9); ed_Chat.SetText(str); } } sb_Background.Managecomponent(lb_Chat); OnDraw=MyOnDraw; } function bool MyOnDraw(canvas C) { local float l,t,w,xl,yl; local eFontScale fs; // Reposition everything t = sb_Background.ActualTop() + sb_Background.ActualHeight(); l = sb_Background.ActualLeft() + sb_Background.ActualWidth() - sb_Background.ImageOffset[3]; b_Close.Style.TextSize(C,MSAT_Blurry,b_Close.Caption, XL,YL,FS); w = XL; b_Submit.Style.TextSize(C,MSAT_Blurry,b_Close.Caption, XL,YL,FS); if (XL>w) w = XL; b_Accept.Style.TextSize(C,MSAT_Blurry,b_Close.Caption, XL,YL,FS); if (XL>w) w = XL; w = w*3; w = ActualWidth(w); l -= w; b_Close.WinWidth = w; b_Close.WinTop = t; b_Close.WinLeft = l; l -= w; b_Submit.WinWidth = w; b_Submit.WinTop = t; b_Submit.WinLeft = l; l -= w; b_Accept.WinWidth = w; b_Accept.WinTop = t; b_Accept.WinLeft = l; ed_Chat.WinLeft = sb_Background.ActualLeft() + sb_Background.ImageOffset[0]; ed_Chat.WinWidth = L - ed_Chat.WinLeft; ed_Chat.WinHeight = 25; ed_Chat.WinTop = t; return false; } function ReceiveChat(string Msg) { lb_Chat.AddText(Msg); lb_Chat.MyScrollText.End(); // remove top messages from list if there are more than 10 if( lb_Chat.MyScrollText.ItemCount > 10 ) lb_Chat.MyScrollText.Remove(0,lb_Chat.MyScrollText.ItemCount - 10); } function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) { if ( State == 3 && Key == 0x0D ) // enter { if ( OnSendChat(ed_Chat.GetText()) ) ed_Chat.SetComponentValue("", True); return true; } else if ( State == 1 && RecallQueue.Length > 0 ) { if ( Key == 0x26 ) // up { ed_Chat.SetText(RecallQueue[RecallIdx]); RecallIdx = Max(0, RecallIdx - 1); return true; } else if ( Key == 0x28 ) // down { ed_Chat.SetText(RecallQueue[RecallIdx]); RecallIdx = Min(RecallQueue.Length - 1, RecallIdx + 1); return true; } } return false; } function bool InternalOnClick(GUIComponent Sender) { if (Sender == b_Close ) { Controller.CloseMenu(true); return true; } if ( Sender == b_Submit ) { OnSubmit(); return true; } if ( Sender == b_Accept ) { OnAccept(); return true; } } } YcVote to Kick this PlayerView Player Details[Admin] Kick from Server[Admin] Ban from Server| 'QK]ServerListContextMenu`} Y5Vote for this Map View Screenshot and Description| 'Z K]ServerListContextMenu`} Y5Vote for this Map View Screenshot and Description| '] K`XPO$E>$S>$>$>``\// ==================================================================== // Class: xVoting.MapVoteCountMultiColumnListBox // // Multi-Column list box used to display maps with vote counts. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapVoteCountMultiColumnListBox extends GUIMultiColumnListBox; var string MapInfoPage; //------------------------------------------------------------------------------------------------ function InternalOnClick(GUIContextMenu Sender, int Index) { local string MapName; if (Sender != None) { if ( NotifyContextSelect(Sender, Index) ) return; switch (Index) { case 0: if( MapVotingPage(MenuOwner) != none ) MapVotingPage(MenuOwner).SendVote(self); break; case 1: MapName = MapVoteCountMultiColumnList(List).GetSelectedMapName(); Controller.OpenMenu( MapInfoPage, MapName ); break; } } } //------------------------------------------------------------------------------------------------ function bool InternalOnRightClick(GUIComponent Sender) { local int NewIndex; NewIndex = List.Top + ( (Controller.MouseY - List.ClientBounds[1]) / List.ItemHeight); if( NewIndex >= List.ItemCount ) NewIndex = List.ItemCount - 1; List.SetIndex(NewIndex); return true; } //------------------------------------------------------------------------------------------------ `yI// ==================================================================== // Class: xVoting.MapVoteCountMultiColumnList // // Multi-Column list box used to display maps and game types. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapVoteCountMultiColumnList extends GUIMultiColumnList; var VotingReplicationInfo VRI; var int PrevSortColumn; //------------------------------------------------------------------------------------------------ function LoadList(VotingReplicationInfo LoadVRI) { local int i; VRI = LoadVRI; for( i=0; i= ItemCount ) AddedItem(); else UpdatedItem(UpdatedIndex); } OnSortChanged(); } //------------------------------------------------------------------------------------------------ // TODO: move up to GUIMultiColumnList /* function RemovedItem(int RemovedIndex) { local int i; if( RemovedIndex >= 0 ) { for( i=0; i -1 ) return VRI.MapList[VRI.MapVoteCount[SortData[Index].SortItem].MapIndex].MapName; else return ""; } //------------------------------------------------------------------------------------------------ function DrawItem(Canvas Canvas, int i, float X, float Y, float W, float H, bool bSelected, bool bPending) { local float CellLeft, CellWidth; local GUIStyles DrawStyle; if( VRI == none ) return; // Draw the selection border if( bSelected ) { SelectedStyle.Draw(Canvas,MenuState, X, Y-2, W, H+2 ); DrawStyle = SelectedStyle; } else DrawStyle = Style; GetCellLeftWidth( 0, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, VRI.GameConfig[VRI.MapVoteCount[SortData[i].SortItem].GameConfigIndex].GameName, FontScale ); GetCellLeftWidth( 1, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, VRI.MapList[VRI.MapVoteCount[SortData[i].SortItem].MapIndex].MapName, FontScale ); GetCellLeftWidth( 2, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, string(VRI.MapVoteCount[SortData[i].SortItem].VoteCount), FontScale ); } //------------------------------------------------------------------------------------------------ function string GetSortString( int i ) { local string ColumnData[5]; ColumnData[0] = left(Caps(VRI.GameConfig[VRI.MapVoteCount[i].GameConfigIndex].GameName),15); ColumnData[1] = left(Caps(VRI.MapList[VRI.MapVoteCount[i].MapIndex].MapName),20); ColumnData[2] = right("0000" $ VRI.MapVoteCount[i].VoteCount,4); return ColumnData[SortColumn] $ ColumnData[PrevSortColumn]; } //------------------------------------------------------------------------------------------------ event OnSortChanged() { Super.OnSortChanged(); PrevSortColumn = SortColumn; } //------------------------------------------------------------------------------------------------ function Free() { VRI = none; super.Free(); } //------------------------------------------------------------------------------------------------ function bool InternalOnDragDrop(GUIComponent Sender) { return true; } //------------------------------------------------------------------------------------------------ = PlayerNameE*]UT2SmallHeaderFont$H>$G:>$:>$Q=?$>``@E//==================================================================== // xVoting.MapInfoPage // Map Information Page // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class MapInfoPage extends LockedFloatingWindow; var automated GUISectionBackground sb_Info; var automated GUIScrollTextBox lb_MapDesc; var automated GUIImage i_MapImage; var automated GUILabel l_MapAuthor, l_MapPlayers, l_NoPreview; var array Maps; var localized string MessageNoInfo, AuthorText, PlayerText, lmsgLevelPreviewUnavailable; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); b_Cancel.SetVisibility(false); sb_Main.SetPosition(0.042302,0.043286,0.917083,0.451979); sb_Main.bBoundToParent=true; sb_Main.bScaletoParent=true; sb_Main.ManageComponent(i_MapImage); sb_Info.Managecomponent(lb_MapDesc); sb_Info.bBoundToParent=true; sb_Info.bScaletoParent=true; class'CacheManager'.static.GetMapList( Maps ); } //------------------------------------------------------------------------------------------------ function HandleParameters(string Param1, string Param2) { ReadMapInfo(Param1); } //------------------------------------------------------------------------------------------------ function ReadMapInfo(string MapName) { local DecoText DText; local string mDesc; local int Index, i; local Material Screenie; local string Package, Item; if(MapName == "") return; if (!Controller.bCurMenuInitialized) return; MapName = StripMapName(MapName); Index = FindCacheRecordIndex(MapName); if (Maps[Index].FriendlyName != "") sb_Main.Caption = Maps[Index].FriendlyName; else sb_Main.Caption = MapName; if ( Maps[Index].ScreenshotRef != "" ) Screenie = Material(DynamicLoadObject(Maps[Index].ScreenshotRef, class'Material')); i_MapImage.Image = Screenie; l_NoPreview.SetVisibility( Screenie == None ); i_MapImage.SetVisibility( Screenie != None ); l_MapPlayers.Caption = Maps[Index].PlayerCountMin@"-"@Maps[Index].PlayerCountMax@PlayerText; if ( class'CacheManager'.static.Is2003Content(Maps[Index].MapName) ) { if ( Maps[i].TextName != "" ) { if ( !Divide(Maps[Index].TextName, ".", Package, Item) ) { Package = "XMaps"; Item = Maps[Index].TextName; } DText = class'xUtil'.static.LoadDecoText( Package, Item ); } } if (DText != None) { for (i = 0; i < DText.Rows.Length; i++) { if (mDesc != "") mDesc $= "|"; mDesc $= DText.Rows[i]; } } else mDesc = Maps[Index].Description; if (mDesc == "") mDesc = MessageNoInfo; lb_MapDesc.SetContent( mDesc ); if (Maps[Index].Author != "") l_MapAuthor.Caption = AuthorText$":"@Maps[Index].Author; else l_MapAuthor.Caption = ""; } //------------------------------------------------------------------------------------------------ // Remove any additional text from the map's name // Used for getting just the mapname function string StripMapName( string FullMapName ) { local int pos; pos = InStr(FullMapName, " "); if ( pos != -1 ) FullMapName = Left(FullMapName, pos); return FullMapName; } //------------------------------------------------------------------------------------------------ function int FindCacheRecordIndex(string MapName) { local int i; for (i = 0; i < Maps.Length; i++) if (Maps[i].MapName == MapName) return i; return -1; } //------------------------------------------------------------------------------------------------ function bool ReturnButtonOnClick(GUIComponent Sender) { Controller.CloseMenu(true); return true; } //------------------------------------------------------------------------------------------------ function SetVisibility(bool bIsVisible) { Super.SetVisibility(bIsVisible); l_NoPreview.SetVisibility( i_MapImage.Image == None ); i_MapImage.SetVisibility( i_MapImage.Image != None ); } XP$!X=$ #<$Hz?$#e>w'^ u``u*// ==================================================================== // Class: xVoting.KickVoteMultiColumnListBox // // Multi-Column list box used to display Players. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class KickVoteMultiColumnListBox extends GUIMultiColumnListBox; var string KickInfoPage; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { super.InitComponent(MyController, MyOwner); if( !PlayerOwner().PlayerReplicationInfo.bAdmin ) ContextMenu.ContextItems.Remove(2,2); } //------------------------------------------------------------------------------------------------ function InternalOnClick(GUIContextMenu Sender, int Index) { local string PlayerName; if (Sender != None) { if ( NotifyContextSelect(Sender, Index) ) return; switch (Index) { case 0: if( KickVotingPage(MenuOwner) != none ) KickVotingPage(MenuOwner).SendKickVote(); break; case 1: PlayerName = KickVoteMultiColumnList(List).GetSelectedPlayerName(); Controller.OpenMenu( KickInfoPage, PlayerName ); if( PlayerOwner().PlayerReplicationInfo.bAdmin ) KickVoteMultiColumnList(List).VRI.RequestPlayerIP( PlayerName ); break; case 2: if( PlayerOwner().PlayerReplicationInfo.bAdmin ) { PlayerName = KickVoteMultiColumnList(List).GetSelectedPlayerName(); PlayerOwner().ConsoleCommand("ADMIN KICK " $ PlayerName); } break; case 3: if( PlayerOwner().PlayerReplicationInfo.bAdmin ) { PlayerName = KickVoteMultiColumnList(List).GetSelectedPlayerName(); PlayerOwner().ConsoleCommand("ADMIN KICKBAN " $ PlayerName); PlayerOwner().ConsoleCommand("ADMIN KICK BAN " $ PlayerName); } break; } } } //------------------------------------------------------------------------------------------------ function bool InternalOnRightClick(GUIComponent Sender) { local int NewIndex; NewIndex = List.Top + ( (Controller.MouseY - List.ClientBounds[1]) / List.ItemHeight); if( NewIndex >= List.ItemCount ) NewIndex = List.ItemCount - 1; List.SetIndex(NewIndex); return true; } //------------------------------------------------------------------------------------------------ `U// ==================================================================== // Class: xVoting.KickVoteMultiColumnList // // Multi-Column list box used to display players. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class KickVoteMultiColumnList extends GUIMultiColumnList; var VotingReplicationInfo VRI; var array KickVoteData; var array PlayerName; var int PrevSortColumn; //------------------------------------------------------------------------------------------------ function LoadPlayerList(VotingReplicationInfo LoadVRI) { local GameReplicationInfo GRI; local int i,x; if( LoadVRI == none ) return; else VRI = LoadVRI; GRI = PlayerOwner().GameReplicationInfo; KickVoteData.Remove(0,KickVoteData.Length); for(i=0; i -1 ) return KickVoteData[SortData[Index].SortItem].PlayerID; else return -1; } //------------------------------------------------------------------------------------------------ function string GetSelectedPlayerName() { if( Index > -1 ) return PlayerName[Index]; else return ""; } //------------------------------------------------------------------------------------------------ function int GetSelectedTeam() { return KickVoteData[SortData[Index].SortItem].Team; } //------------------------------------------------------------------------------------------------ function timer() { local GameReplicationInfo GRI; local int i,x,TeamIndex; local int PlayerID; local bool bFound; Super.timer(); GRI = PlayerOwner().GameReplicationInfo; // Add new players to list for(i=0; i= SortData.Length || SortData[i].SortItem >= KickVoteData.Length ) return; // Draw the selection border if( bSelected ) { SelectedStyle.Draw(Canvas,MenuState, X, Y-2, W, H+2 ); DrawStyle = SelectedStyle; } else DrawStyle = Style; GetCellLeftWidth( 0, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, PlayerName[SortData[i].SortItem], FontScale ); if( PlayerOwner().GameReplicationInfo.bTeamGame && (KickVoteData[SortData[i].SortItem].Team < 4) ) TeamName = class'Engine.TeamInfo'.default.ColorNames[KickVoteData[SortData[i].SortItem].Team]; else TeamName = ""; GetCellLeftWidth( 1, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, TeamName, FontScale ); GetCellLeftWidth( 2, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, string(KickVoteData[SortData[i].SortItem].PlayerID), FontScale ); GetCellLeftWidth( 3, CellLeft, CellWidth ); DrawStyle.DrawText( Canvas, MenuState, CellLeft, Y, CellWidth, H, TXTA_Left, string(KickVoteData[SortData[i].SortItem].KickVoteCount), FontScale ); } //------------------------------------------------------------------------------------------------ function string GetSortString( int i ) { local string ColumnData[4]; ColumnData[0] = left(Caps(PlayerName[i]),20); ColumnData[1] = left(Caps(KickVoteData[i].Team),5); ColumnData[2] = right("0000" $ KickVoteData[i].PlayerID,4); ColumnData[3] = right("0000" $ KickVoteData[i].KickVoteCount,4); return ColumnData[SortColumn] $ ColumnData[PrevSortColumn]; } //------------------------------------------------------------------------------------------------ event OnSortChanged() { Super.OnSortChanged(); PrevSortColumn = SortColumn; } //------------------------------------------------------------------------------------------------ function Free() { VRI = none; super.Free(); } //------------------------------------------------------------------------------------------------ XP$U>$ #<$Hz?$>``v-//==================================================================== // xVoting.KickInfoPage // Player Information Page. // // Written by Bruce Bickar // (c) 2003, Epic Games, Inc. All Rights Reserved // ==================================================================== class KickInfoPage extends LargeWindow; var automated GUIButton b_ReturnButton; var automated GUIImage i_PlayerPortrait; var automated GUILabel l_PlayerName; var automated PlayerInfoMultiColumnListBox lb_PlayerInfoBox; var localized string PlayerText, PingText, ScoreText, IDText, IPText, KillsText, DeathsText, SuicidesText, MultiKillsText, SpreesText; //------------------------------------------------------------------------------------------------ function InitComponent(GUIController MyController, GUIComponent MyOwner) { Super.Initcomponent(MyController, MyOwner); b_ReturnButton.OnClick=ReturnButtonOnClick; } //------------------------------------------------------------------------------------------------ function HandleParameters(string Param1, string Param2) { LoadInfo(Param1); } //------------------------------------------------------------------------------------------------ function LoadInfo(string PlayerName) { local int i, MultiKills, Sprees; local Material Portrait; local PlayerReplicationInfo PRI; if(PlayerName == "") return; if (!Controller.bCurMenuInitialized) return; for( i=0; i$ A?z 's} `t $TU=$ <$t?$6>k g z 't} ``W ``u`]Accept]\ZClick once you are satisfied with all settings and wish to offer no further modifications$g?$ ?$&D>$x=A"~Sm"'p KZ'wh `]Info$E?$Z ?$#>A"m"'BqZ'xh ``Q @`t $@?$9=$'k?$ђ>z 'z} ``|```t ]ChatP$ #A"m"'BtZ'~h ````G A tO # K %' G`B ````xD u%Fnc4Fnc5Fnc6Fnc7J c4J c5J c6J c7( G`E ````Nn `LY qHM # K &' G`kpKc M'rpF m('Hrpm''( G`]n{>=]{|n r  &nA G```oL k _ls @b%Vb7i Lz6bi lbb G`l``\ @]`M  @]`_``ogsXarc7rc5_rc6rc4,rb*g$b^fe\^a*g$b^fe^\\^`*g$b^feF^\\^\\9?,\c4\_\b\bab__\a\aaa__\`\`a`_Frc6%rF_FFAFa( G`@``T yt&y bUseMapListq  G(```U mux@ (m .bUserMapList' m G(`p oj7@oo)bbUseMapListr$$Check '' G `@`````m vrEq6u,d`%l`7db|6v }`d`d'`!( G`````sZ SNZ -Y-l-m G z z Jz 9u nu Ru Vu mu Tu iu ~u p u u u j u l u Tu mu @u wu k u K@@u Eu d u f u @ @Ku m u Xu Nz ^u ` u ou Au WiF u o @Bu SiQiD u O@_iQil u z@RSio u Su Ju F XwRoVqVqu {u c Xfu |u I@~m[m|m~V@q Vi_@t u DmYu O z bmBO PmwTnVv@{@Vu GVJ VC Tw@kO QVxu Lz du NV\Xg Vku }u v@} R$u cmhu GT\ VyO E m^ u FRSu  u `u q@s Vh u Ym~VDu ld]@hu G u MmUYu u libie zu r mhVIzu OmviiXiim zku FmpT^TUVi]iG R>mz RCRI u zinu PzisVyu @u ^RQ u dVqRk>gIiqi{u A iQu a R>u BiOmBdTVyVf zyd^RFu uO p u ^@kz_z ni@RG@Yu Eu OR>Rz}Rl zVf iXVRuTYiyRsTjipu gV{ R|u GV[d^io mjzGu QVpVRV[dNRfiXu ZVBu du `u UVRRIVHiDz LcTZdGi~ u KRvmAu hu YmPXQH9i Kz OiZiA9j {TIu o u Vu Ku JTWTjRGR@i5bi| RuRKRjiARBu Uu iU T[ RtmFR>u XRjz}TlTfTeRHiHsVQTmXV\VR VR V{iDRQ VkVxRf Tk Tg RfiA V V_iO VN\VN[d"ROQ iOrVURQ RwRL XhR>iPViCVRim inRO^ VyTRdwVvzx iWiG T|iNV@ z mdRdmcV]R` ReO XR` RIR\V]TjTmWR{RQX} R_Tt R^zPzKzjz\ RWRuRWdMmIRgR~i EO KzJmzi RTRRSRDRvR`VxVRREX@Rdi@RkRJV}RbRTY{inmVRmRJzvR{TwVIif dxlO }W{z LhTQ Vb ire O zRWmwu B O /WTVR(q9j pX&r9j CX%ru C u i X$rVRu gRKUAl^mU}`PMN mM }qULV[jjK{JLs[`rlvj|```BfEumFeUM c`M r``q\cAM d``` s\BrS d rM AhP^ `to|```M N`w]\F y`teI`XK h|wEG```N W``egD u`k D``` RUb``````pZq``KB``eS`ab`Eq`e@wO]|mL|FKhZ_j``z```sIYeZ`pM ~N`l\GjexpqF`XrU`eG~U`w dU r``L A`p{Pq_`en_}`zL`D\`OkA {MM``e[ei````[wpEWT`kc~rcAg Pkafo``q>q@``L q_ cMg[^j`b{``dJM Xqqg`Yv`L EtnT`````edqs`k AeP`e^S me|L J`~YM haw`HF`lUGfFvw G`dVxfqg wIF```y U``^ cVKrQ }~NV]t\ntx````TO```e]`@k{`xJ`qY`_ hkwGHeWbfeupeC``@ QpJ c`Cr{ADO```pD^l m``G }``HMM[eiqJ w~ E```| TqPcVr```qA````^O_ ^K m```````~{`\IAY`H i`\ytI``AX`w h`````~v`````~E^ S```sb``|sdB`rQFaU pUzN`B ]tUlDzCHS WYfXtqkC|R`{ aX pqT ~``B M|\Dk|zpu Iv [DjCx`B GAVpUe|t`yCeUNdG s`dBI R`````S_`]mp}XL`````````````````qZ````````````````cibypnIpUYqnh`P xg0"G`````Ni`Zy``````[I`bW``cg```H w``GHUcd/!"s/u$U/e$y/;#]/C#@``BcCrtA```qPU_`qnH}~LBZG sG CRSPbq|@``~P`}_G nc ~JNK\LjixNFOTPbQpR~``````````H L````/Wf\``````q]JBc 9LgMgE`d ;l````````yg`Q-u`````````````````````````````````````````````AybAH pL*@````````````nj````````````````````````````````LZzoVHAk^`\Ie0wW````Q Ngb$\n@````[O`````>|_1[`ygLKUsstHy|GKJjrU|VG`u]ylltz``uny}f5KnF@[PFf/V2cE|hywqE{@SqSyb/M$qr Uyd/L$syW/K$fyJIaM?_t^Hpmd~M NI `h ^p4dNe^4enVG~uN<e_em||M M4[\ieluz~K]\dalZ|YL}]M nY}aNhK^DnM IKNeYnhSyZI[YL~gCveEeTDcer/zAPPn X_Cw[RF_X{KgZrVaB_dQh{u ~Ek TBcHqrHC~{R+eM~[qjo i G {V|BM SVKbhrVJAVkQwas v ppYf|ewVHFhzVzfYwHaHqiX}h`~eyx^ H.WWMf hfqw`JELOg[^hTm/b~/^ PNpU^`emqe|qJO MZLgEuxDeSVLaWrE\A|]ene|eJoXo l Kg/araBOQp`opG@\OLK^Zme}oKVMZFjeytG_Wlf~v5eF eU|cetjB?eSrjbqqqrc @piOe`EoN ~eNM\M j]uxEHEWef/P )vqe_/D )nf Wd_ s0eAVGOL _VUnO~eMe\ekczxJyYA h] yiHV}ert[eDNRY`xpeMy]UelwzTeHaV/Xdw sLqCZeReaQpqbEOL ^RmLe|IKyZnkB{eJN XBgevieEnuSobesmeA~Oe^yl>{M KiYIegQueDeSSbesCeBA PpMaiqeNZ]xn-e|xJVyYXhUw|F{_UxdEreA4w OZ__oe~4VMe]ele{JtZrPjP x~G.eVLdnZsZAlZQx_meojU~jIMZv[ekgtzMJ~YP h Mw|Fo p G UL\xkI{VILYPeg|uLVFeWeeMtYsC9eRNasIp~~PML\|jReyx~H/[ )VALsQ/| &bSHK\YehN wAeFeU/edZsL CH RVDbCLshmBhlQCs`Zp\@A P _ahZppN@N Q~t`H phw@hgO}^] mA^ |~KQYAOhFQxFP G/f #UcxpF/C U>P f@Zu@VD9P RP `QoRO9eO{ `I omTOB^Mm_ |UJp}YXjI x`ZG`tXif hmf wmjFr_UtLdBr~@tc Otj^tLm4{ |4 LH\mc khzueITWMR eM~tm_BijP__c n|g}c MeL\ejk_z^IeWec geLv~DeS~cf rFAR Pe^emB}DL\[{ k|{ JIZhiLz xoGLd UKMc~qP XNH ^rnq}]MLc Y_hQw] a Feg/CweGeV Wdes qAeO R ^ ~m[|zJYAhtxHmHgV@fsvgEGT^ dA sH D|SL bk qc @N O^@mA|_ JpMYBjpy7\H=\X@H h~C xhhFhtTzqcLq_ z~Mha\FlzH {WL/a 1[CL/N]R^ nx}oqNo~\oH kt_||K`Zyh4@ww_G4gUwc ewjt{_C{LQxw`ic o|_ ~f~Lm[fH jxx{_ K[Y~wh|w~xFzVe_f~uwDZwS~b~qd@f No]`HkT{HKfZ R k f y dH dVgdmz`CHDWQM @fVgfZ RCvOy] zYGVP`hfn`}~L~[fj|yM GtVG feuSDaSvcf rR A~P\_jnj}YLb[Uk4@zQTS cNq{ @NOI]{ lN{vI4UXBhG wzF4n UM ecttC~SpPbpKrpOBpe #R{=up_ #r~Up[ zdi^~mpL|M La[ekG {vJkYL hevaErU``V~Ud ~yfHX XphXx`hHSWwfZu[D\SDb]q^@_OB]blc|JKEYjhV]wbTo LomxQ\phf wVG 4]V` rQXDCVV yS/H Li|\`ylCzVB EHL ]M>yj>H xVQbH9H j9yzVF cI<ylk 1{VWSl?H ?yOIy^`````xmk Y}KyVb MeyG rOjy;|Gf ,W>pC>us@hA}v[~Fs nDdTrVH Fi*UXH F HNl jV]H @d *O,vyu 5G_H |_yLdyZ>Shf1{W wlKuciyXi_g| \vx ERjH WjygQ |vt 9rZKPka 6{]>XqxIZx EWsH \sylC{7|IW ~YuW]KPgN ?w}uv\/E]H mtH aR bqS (S]K /{G B j]` clqOm^]x EnH syClR]Q RbkUtX>-IE CvuyX5H\/}G wl`qQ ,c+pOy^bqlH zHM Jk 1IV MzjGf ,UHv kA>ObH@ @qgyqpLp] Op\ ^qYmpf <{J[ @wkwj AFm 5G Z|yJHl _YM| lxydE^ 5sHI /hHQ -W~4P dD4N GhdH VoyE4C ~Sdv QQ4`qb4p qSdc ;DydY;MyHdp [Vyqd@ W]ZVyf4O @uUZuyE4 @T4>ZTkn@4D <}yy4R YHdl qa4r zRyL4t ~[dI /YdQ -Hdv'uH \ylezyHJnWM4| \eE4^ 5A>Mv9[CySH MbB Joyyb rHN yzysy bB^\d4rc 1fyWp Qeyv@ D D~P ]H`dex dIZmy}u@L&ZLy\!k>xjybR Yql mJy RwyIz mXI /EQ -tDRaesyAM| LP@D <\E^ 5X=]Mgq]TmyA_ lP@ ||~P ixza TaM uyDG SM| G bvi kx E^ 5G `| l .K $ey $yH phf /V hEHE @hD @M Jh[ KM hF#X hGM{ hD eH hU km 0yX hF mg |T hA 6d y}Z 7yj FDx 7uH hIbW L Iy Z `B =yb {ep =u~ hJ[M \ uh @y] hKYl c eE hw0j h>LZ h[f mOv X `D Td hjt /Q -C Sp H ~ MyM M_[ Mc j g Iy MjB OyQ 0W_ gv UyD /SCR zOU Yyc yr /| YA }Z \yh _*v ^y` ^*n ayX o |f W*b dyL ZZ u+h tS y Sa \}t Kq v L ]{K iyF GWU G Rl ^S~ myQ H2` E mR aN qyM bw\ AgS uyz cAI C;J xyE yyV j id { QM x^ D;l ~yg yx I \F lQb xs i UA yV uRe tTw s\K rHg eo TU} yR!qGa!oh!n~g!me!ed!hzFr!~ Yx!yQ!q `!y_!} +m!JGX!|F_!Fe!CYt!;uC!<~R!dob!yQ!B]`!N}!Y aM!~ Xn!E1F!yw!~QE!gzV!yP!WI^!Qqg!yX!{mf!yS!\ba!yC!uCQ!E AT!u BU!] W!p qw!d!` E!`U ,Q!g`}!cS]!zQp!a A!@YL!4u[!X_ 4Hj!_ 4r!_ 4Dq!/_ 4[u"4_ 4XqP"_ 4Sh#_ 4gE{$h_ 4STb$_ 4c:u%qZ e X&]_ 4x2}&_ 4IOu&_ 4j>~'V_ 4Bh'p_ 4q@j(eJ[)Ze\e)]eBA)O 'C)Z_ 4hj)d_ 4EJR)NPW*`_ 4LEg*Q*s*_ 4A+]*H_ 4b^+S#@,_ 4B.c,`G e,Vyt,BC,] R,ea,Zp, e,5bM,\[,Lk,@{,N J,9e[,?M i,}w,FG, xU,Fd,Es,` B,H Q,{a,xo,V}3~,N-q,k ^,^ m,pM`|,C5\,UQ,J%`, aE, eU,pt2d,H5V,yK,t:Y,H S,yc,uBq,N s,yD,VDR,q:c,VK[],]>Mx,yE,Vk hS, y{,zJ,vZ,yj,psZy,yS,tDa,ye,uWs,jXJ,\b,yp,rq,H p,y@,S