Įƒ*žEÕ@o—DŠĮ?g²öŅ D‘˜W]˜ĻüˆoÕNone UTSendNoticeUTCheckPasswordParseDelimitedSendBufferedData GetTeamColorBroadcastReporterMessageGenTimeString JoinChannel PartChannelUTShowTeamInfo ProcessInputCore Reporter CTFScoreline GetFlagColorSystemEngineBeginUTSetScoreChnlEnable ChangeTimerUTMute SortScoresUTSetCommChnlEnableUTSetRedTeamNameUTSetBlueTeamNameUTSetGreenTeamName ChopLeftUTSetGoldTeamNameDoScoreEnabledUTIrcComEnabled UTGameAdvertUTMuteOnStartUTGameAdvertDurTimer UTSpecListTickConnectUTGameAdvertFreqTwoDigitStringUTShowGameInfoUTShowGameStartInfo UTShowScore DOMScorelineUTSetCommLevelUTSetReporterNickFormatMessage SendMessageUTChangeIRCCommand2DeathScorelineTeamGameDMScoreLine UTServerAddrUTChangeIRCCommand1UTResetTeamNamesUTSetCommChnlUTChangeReporterPassUTSetScoreChnlUTChangeAdminPassUTSetLeagueNameUTSetScorePeriod UTServerPortUTChangeIRCCommand3SendMessageToUTUTSendIRCCommand Validate UTShowConfigUpdateAdvertTimerStartBroadcast EndBroadcastUTReporterAddSpectatorClientMessage UTVersion SendText UTSendMsgQuery GetStringUWebAdvertQueryAdminMenuQueryAdminStartUTRGetClientVoiceMessageStringQueryReporterQueryReporterMenuQueryAdminGameQueryAdminBroadcastSetProgressMessageChopQueryReporterMisc NormalSpeccyIRCBoldToggleRemoveNickPrefixGetUTR DestroyLink DoSpecListGetTauntString QueryAdminQueryAdminServer GameHasEnded LoggingIn DisEngageEngage QueryMenu BaseIRCColor QueryRoot LoggedInQueryAdminStopUTR PreBeginPlay TakeDamage KilledBy FullNameSetProgressColorDiedColorPostBeginPlay PlayerPawnInit TeamMessageReceiveLocalizedMessageClearProgressMessagesOtherUserTauntSetProgressTimeOpen ChangeNameEventAllowsBroadcastAdminPasswordSuicide GameEndedClientVoiceMessage AUTOTAUNTDefaultAdvertColourDefaultAdvertDuration NoTeamColorDefaultInGameAdvertDefaultEnabledDefaultAdvertFreqUTRImageServerTeamRedDefaultReporterPasswordDefaultAdminPasswordDefaultCommentaryLevelTimeOutDefaultReporterNickDefaultScorelineChannelDefaultCommentaryChannelIpDrvScoreUpdatePeriodReporterPassword BindPortClosedOpened IsConnectedResolveFailed ResolvedUTReporterControllerResolveUTReporterIRCLink ReporterNickScorelineEnabledCommentaryLevelCommentaryEnabledCommentaryChannelFailAuthenticationScorelineChannelUTReporterSpectatorGetFFireString GetAckString TeamBlue TeamGreen TeamGoldDefaultServerPort UTRWebAdminDefaultServerAddr UBrowserDefaultEnableIRCComGetOtherString bTimeoutSendScoreLineMessageACKDoBufferQueueIO ResetBuffer GetCallSignReadBufferedLine FRIENDLYFIRE ServerPortUTReporterDeleteSpectator ServerAddrSendChannelAction TimeOutError GetUTRConfigUTReporterConfigVersionStringDisconnectReasonConnectedTextResolveFailedTextConnectingToTextInvalidAddressText CommaTextErrorBindingText AdminRealmInternalErrorText ControlPointCRLFPRI DelimiterUBrowserBufferedTCPLink RelatedPRI_1 ServerIPAddr Password TeamColorTeams MessageType TeamInfo MaxTeamsbWaitingPlayerGame TimeLimit RecipientGoalTeamScore nextPawn UsernameNickTemp2 TeamIndex bInitializedbBeepDeathMatchPlusChallengeVoicePack TeamGamePlus bToEndOfLineNavigationPointList bIsSpectator PacketLossCTFGame UserIdentOptionalObject DominationControlPointMessageNetModeTemp3 bAddModifier FragLimitWebApplicationHasFlagbMultiWeaponStayFirstBloodMessageTournamentGameReplicationInfoDeathMessagePlusDeathMatchMessage CTFMessageCPOrderedTGRITempPRIControllingTeam ControllerFriendlyFireScaleScoreTeamID PlayerNameURITcpLink GroupPage PRIArray PawnListnextNavigationPoint ImageServerText GetVariable ResponseRequestGRIHoursMinutesDeaths PlayerCount bTeamGameBotpackSeconds RepMsgTypePRI_1_PlayerNamePRI_2_PlayerName bGameOverCTFFlagReporterMsgTypeEventInstigatorInLinkDamage HitLocation MomentumNIsEndKillerP PlayerPRITeamS1TeamS2TeamS3Link RelatedPRI_2 TempSpecMsgResult temptimeNum DeltaTime BaseNick NickCounterIsRejoinTimer PointNameOwningController StartMsgSubstMute InController InConfigPing bIsScoreline ClearSubst TempNick OrigNick OrigNickAddr DestNick UTCommandUTParam UTPassword OrigChanneldisconnectmsg ServerName VoicePack bIsPlayer LocalMessageType GameNameTeam SpectatorMessagingSpectator DamageTypeCounterbHiddentempAji ScriptTextSV ReturnValueDynamicLoadObjectMaxBuild LevelInfo GameInfoNavigationPointsNickPlayerReplicationInfoGameReplicationInfo ViewTeamLevelActorPawnChannelCountMessageTitleClass NoticeMsgPackage ReqLevel IncludeUHTM tempClass WebRequest WebResponseIpAddrAddrPortAdminUsername InternetLink LeagueName RedTeamName BlueTeamNameGreenTeamName GoldTeamName IRCCommand1 IRCCommand2 IRCCommand3 MuteOnStart EnableIRCCom InGameAdvert AdvertFreq AdvertColourAdvertDuration FloodControl MsgPerMinutePage InMessageFoundDefaultCommentaryEnabled instigatedByDefaultScorelineEnabledLine VoiceTypeanActor MessageIDDefaultScoreUpdatePeriodDefaultLeagueNameDefaultRedTeamNameDefaultBlueTeamNameDefaultGreenTeamNameDefaultGoldTeamNameDefaultIRCCommand1DefaultIRCCommand2DefaultIRCCommand3DefaultMuteOnStartSenderRemainingTime PlayerID TeamNameCommand GameClass bChangedIRCLinkConfigbEnableSwitchaPawn TextBuffermsg2ObjectFreq Function InEntryLevelStateVector bSentToScore bIsAdminTeamS4StructsUpdatesDeletesAdd UnrealShare StrPropertyStructPropertyClassProperty NamePropertyIRCServerAddrIRCServerPort IRCComOn bChangesbServerChangeObjectProperty CommChnl ScoreChnlCommOnScoreOnMuteOn StartMuteOnCommLvlFloatPropertyAdvertColourRedAdvertColourBlueAdvertColourGreen BoolProperty IntProperty ByteProperty‹Q`A’’’’’’’’’’’’’’’’’’ó-NP‹œŌX   }]irc.gamesinferno.com{" d]#ut.reporter.commentarycÓf]#ut.reporter.scorelineaÓ`]UTRb"@]12345V]54321U"<o]b0rk.uk.quakenet.eu.orgm" S] #UTReporterR] #UTReporterQ= UTReporterO]0N]12345M]54321qÓIÓHÓJ"“F" E*q’’’L ‹n ~]’’’’’’’’’’’’’’’’’’;žĄŅ‹œŌXó-NP]Rī9ó-NPó-NPó-NPó-NP]Rī9]Rī9ó-NP]Rī9ó-NP]Rī9ó-NPó-NP]Rī9ó-NPó-NPó-NPó-NPó-NPó-NP‡Ž””©Ł«‡Ž”©žtČ©žtȧ> £Y§> £Y§> £Y§> £Yó-NP§> £Yó-NP©žtČó-NPó-NP#D0ı#D0ı‡Ž”#D0ı#D0ı‡Ž””©Ł«#D0ıžĄŅ]Rī9ó-NPó-NPó-NPó-NPó-NPó-NP‡Ž””©Ł«©žtČ©žtČó-NP   m›m d_’’’’’’’’’’’’’’’’’’>T]Rī9›¹xŪó-NPó-NPˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#U懎””©Ł«žĄŅ#D0ıó-NPó-NPžĄŅó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NP‡Ž””©Ł«‡Ž””©Ł«’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘‡Ž”‰}"›#’;¬ŗ(’;¬ŗ(ˆ{#Uæˆ{#Uæˆ{#UæžĄŅ#D0ı‡Ž”‰}"›#‘ōŖŖ‘–‰}"›#‡Ž”‰}"›#‘ōŖŖ‘ˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#UæžĄŅ#D0ıˆ{#Uæ­j\ŗ„žĄŅ#D0ıˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæó-NP‡Ž””©Ł«ó-NPó-NP—'n 6—'n 6‡Ž””©Ł«‡Ž”‰}"›#žĄŅ#D0ı’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘‡Ž”‰}"›#—'n 6—'n 6‡Ž”‡Ž””©Ł«‡Ž”‰}"›#‡Ž”¢-¤%n‡Ž”¢-¤%n‡Ž””©Ł«‡Ž”‰}"›#‡Ž”¢-¤%nó-NP‡Ž””©Ł«ó-NPó-NP—'n 6—'n 6‡Ž””©Ł«‡Ž”‰}"›#žĄŅ#D0ı’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘‡Ž”‰}"›#‡Ž””©Ł«‡Ž”‰}"›#‡Ž”¢-¤%n—'n 6‡Ž”žĄŅ#D0ıžĄŅ#D0ıó-NP‡Ž””©Ł«žĄŅ#D0ıó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NP–‰}"›#ó-NPó-NP‡Ž””©Ł«‡Ž”‰}"›#‘ōŖŖ‘–‰}"›#ó-NP–‰}"›#ó-NPó-NP‡Ž””©Ł«‡Ž”‰}"›#‘ōŖŖ‘–‰}"›#ó-NP–‰}"›#ó-NPó-NP‡Ž””©Ł«‡Ž”‰}"›#‘ōŖŖ‘–‰}"›#ó-NP–‰}"›#ó-NPó-NP‡Ž””©Ł«‡Ž”‰}"›#‘ōŖŖ‘–‰}"›#ó-NPó-NPó-NPó-NPó-NPó-NPžĄŅ#D0ıó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPžĄŅó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NP pT  P"n]geUT Reporter - Created by John (aka TheFury) hacked by WebSlinger ][ www.planetunreal.com/utreporter/G]#"Invalid server address, aborting.I]%$Error binding local port, aborting.E]-,Failed to resolve server address, aborting.D= Connected.F]Connecting to]Timeout connecting to server.K]54Internal error. Contact webslinger@planetunreal.comC] DisconnectedB]XVUT Reporter v222 - Visit http://www.planetunreal.com/utreporter/ for more informationg]99Z]sÓk@DQtT@K@@ @]@9@@o@]*@D| ˆ ˆ.@Dg@w€…l@jA€…[€…x@D#E@K€…j@äl wg’’’’’’’’ ų’’’’’’’’’’6m#D0ıäž o野””©Ł«‡Ž””©Ł«’;¬ŗ(’;¬ŗ(’;¬ŗ(‡Ž””©Ł«žĄŅó-NP‡Ž”‰}"›#‘ōŖŖ‘žĄŅó-NPžĄŅó-NP‡Ž”‰}"›#‘ōŖŖ‘žĄŅó-NPžĄŅó-NP‡Ž”‰}"›#‘ōŖŖ‘žĄŅó-NPžĄŅó-NP‡Ž”‰}"›#‘ōŖŖ‘žĄŅó-NP—'n 6ˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#U懎”¢-¤%n‡Ž”¢-¤%n‡Ž”¢-¤%n‡Ž””©Ł«žĄŅó-NP‡Ž””©Ł«—'n 6žĄŅó-NP‡Ž””©Ł«—'n 6‡Ž”‡Ž”‰}"›#’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘‡Ž”‰}"›#žĄŅžĄŅ]Rī9žĄŅó-NPžĄŅó-NPžĄŅ]Rī9žĄŅó-NPžĄŅó-NP½Ć'-œ½Ć'-œˆ{#UæžĄŅ‡Ž””©Ł«žĄŅó-NP‡Ž””©Ł«—'n 6žĄŅó-NP‡Ž””©Ł«—'n 6‡Ž”’;¬ŗ(‡Ž”‰}"›#‡Ž”‰}"›#‘ōŖŖ‘‡Ž”‰}"›#‘ōŖŖ‘‡Ž”‰}"›#‘ōŖŖ‘‡Ž”‰}"›#‘ōŖŖ‘‡Ž”‰}"›#’;¬ŗ(’;¬ŗ(ˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#UæžĄŅ‡Ž””©Ł«žĄŅó-NP‡Ž””©Ł«—'n 6žĄŅó-NP‡Ž””©Ł«—'n 6‡Ž”‡Ž”Ā©€'’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘‡Ž”Ā©€'‡Ž”‰}"›#‡Ž”‰}"›#žĄŅžĄŅ]Rī9žĄŅó-NPžĄŅó-NPžĄŅ]Rī9žĄŅó-NPžĄŅó-NP‡Ž””©Ł«žĄŅó-NP‡Ž””©Ł«—'n 6žĄŅó-NP‡Ž””©Ł«—'n 6‡Ž”‡Ž”ĮļŁL’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘’;¬ŗ(‘ōŖŖ‘‡Ž”ĮļŁL‡Ž”‰}"›#‡Ž”‰}"›#žĄŅ‡Ž”ÅwśĮ4ÅwśĮ4Æ'ł)LÆ'ł)L‘ōŖŖ‘Æ'ł)LÆ'ł)LÅwśĮ4žĄŅ‡Ž”ĮļŁLžĄŅ]Rī9žĄŅó-NPžĄŅó-NP‡Ž””©Ł«—'n 6žĄŅó-NPžĄŅó-NPˆ{#Uæˆ{#Uæ«nWM)‡Ž”ˆ{#Uæ«nWM)«nWM)«nWM)«nWM)«nWM)ßĀß4‡Ž””©Ł«‡Ž””©Ł«ˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæ­j\ŗ„ˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæ­j\ŗ„ˆ{#Uæˆ{#UæžĄŅ–ŠłēElžĄŅ–ŠłēElˆ{#Uæˆ{#U懎”Ā©€'’;¬ŗ(‘ōŖŖ‘‡Ž”‰}"›#‡Ž”‰}"›#žĄŅžĄŅžĄŅˆ{#Uæˆ{#Uæ­j\ŗ„ˆ{#Uæˆ{#Uæˆ{#Uæˆ{#Uæ   yH-, L]04k]03j]12l]14g]99G]04Z]'€Œ^€@S@DT€…@s@@M@Dˆ@-ˆ@ €@5R@j7|]@o@@>@€Œ€ŒF@a €@`€…:@–‰;@y©C@P@€Œ0߀…v@@@V@i@D€…T@DR@DO@D|€–ŠIR @n@y€ˆh@\@a@s@ZF@^@W@6u@D&@re@Dh@DQ’f@Dj2Å^—)@@H€ˆ_@vp@€@`€@z@i@€@/t’x@b’A@K@DnÆ @8@b@!€Œx’€@i €@D@C3w€~’c@MˆH’h¼p@4€@e €@’R—X €@c@BˆQ’_@J€P€@M€@Y€@–‰d€@€@€@j@L~@x@€@@k€@€…^€…iZ@S€…L€…@E@N@F €@½C €I—A€ˆm@N€ˆ@q@€@|€@V€@p€@K’€@N@@–‰z€@©–‰}€@r€@G€@@T€Z€@n€…–‰x€@—€@@D€@t€@o€@k€@g@]’€@r@df V64z€f,PING ppPONG f,ž e—X€ŒI€@B@€C@@O€@r€@V€@@}€€@e€@€@H€@ˆl€@d@~ @w€@N€d€]€ˆk€—P~€Y€@–‰s€@€@ @O€@@G€@–‰M€@w€@B€@H€@€@€@€@€@€@C€@X@~€@€@W—@€@z€@€@€@€—v€@m€P€@ˆi€@u€@S€@U@v€@[€@€@\€@€@c€@€@g€@y€@{€@€@{€@€@€@m€@e€@|€@F€@€@A€@c€@s€@€@E€@q€@b€@€€¼N@`@a€@B€J€@}€@g€@t€Œ@U@"@Y€@}@@ €@|@W€@n€ˆr@F€ˆI€@\@ę@b€@[€@E€…c€Œj€O€@i@u€ŒT@(@l€m€@A€@o€@w€\@€Œq€ŒI€@u€@U€@@@f€@€BX€@L €I€@j €@k €P€@€Df€@d€@p@y€@_€@€@I €M@. >L@F&EE &PEPbc%ppNICK ž TaÄ°Ba_at&¤„zc1 |cOn-*'bapUTR - Commentary channel enabled: _-*(bapUTR - Commentary channel disabled: K-.H{ _  OS! €įßSG&‰„|_on z_1-u'bSUTR - IRC broadcast start broadcast mute onß-u(bSUTR - IRC broadcast start broadcast mute off Nc)I`^ck&¤„zi1 |iOn-.'bcpUTR - Scoreline channel enabled: ^-.(bcpUTR - Scoreline channel disabled: J-*G{ ^  Kb9į»Esqbo&@z€v&#vv &azėvė & Ü-.½-*ŗ{ Ń vvbbpUTR - Scoreline channel changed to: qbUTR - Invalid channel name specified R`łż~˜–`D,e„|don zd1-I'`UTR - IRC broadcast mute on–-I(`UTR - IRC broadcast mute off €@Z4//============================================================================= // Reporter.UTReporterConfig // // Ver: 2.2.1 - Sep 5, 2001 // // ©2001 John Malia (aka TheFury) & WebSlinger // // Web: www.planetunreal.com/utreporter // Email: webslinger@planetunreal.com // // Description: // Static storage //============================================================================= class UTReporterConfig expands Actor; // Configuration information var globalconfig string ServerAddr; var globalconfig int ServerPort; var globalconfig string CommentaryChannel; var globalconfig bool CommentaryEnabled; var globalconfig string ScorelineChannel; var globalconfig bool ScorelineEnabled; var globalconfig string ReporterNick; var globalconfig int CommentaryLevel; var globalconfig string AdminPassword; var globalconfig string ReporterPassword; var globalconfig int ScoreUpdatePeriod; var globalconfig string LeagueName; var globalconfig string RedTeamName; var globalconfig string BlueTeamName; var globalconfig string GreenTeamName; var globalconfig string GoldTeamName; var globalconfig string IRCCommand1; var globalconfig string IRCCommand2; var globalconfig string IRCCommand3; var globalconfig bool MuteOnStart; var globalconfig bool EnableIRCCom; var globalconfig bool Enabled; var globalconfig bool InGameAdvert; var globalconfig int AdvertFreq; var globalconfig color AdvertColour; var globalconfig int AdvertDuration; var globalconfig bool FloodControl; var globalconfig int MsgPerMinute; // Default information var string DefaultServerAddr; var int DefaultServerPort; var string DefaultCommentaryChannel; var bool DefaultCommentaryEnabled; var string DefaultScorelineChannel; var bool DefaultScorelineEnabled; var string DefaultReporterNick; var string DefaultCommentaryLevel; var string DefaultAdminPassword; var string DefaultReporterPassword; var int DefaultScoreUpdatePeriod; var string DefaultLeagueName; var string DefaultRedTeamName; var string DefaultBlueTeamName; var string DefaultGreenTeamName; var string DefaultGoldTeamName; var string DefaultIRCCommand1; var string DefaultIRCCommand2; var string DefaultIRCCommand3; var bool DefaultMuteOnStart; var bool DefaultEnableIRCCom; var bool DefaultEnabled; var bool DefaultInGameAdvert; var int DefaultAdvertFreq; var int DefaultAdvertDuration; var color DefaultAdvertColour; function Validate() { local bool bChanged; local int i; bChanged = False; // Determine if server address incorporates the port, if it does then use it i = InStr(ServerAddr, ":"); if(i != -1) { ServerAddr = Left(ServerAddr, i); ServerPort = Int(Mid(ServerAddr, i + 1)); } if (ServerAddr == ""){ ServerAddr = DefaultServerAddr; bChanged = True; } if (ServerPort == 0){ ServerPort = DefaultServerPort; bChanged = True; } if (CommentaryChannel == ""){ CommentaryChannel = DefaultCommentaryChannel; bChanged = True; } if (ScorelineChannel ==""){ ScorelineChannel = DefaultScorelineChannel; bChanged = True; } if (ReporterNick == ""){ ReporterNick = DefaultReporterNick; bChanged = True; } if (bChanged == True) { //SaveConfig(); } } ZaHńN~&$a@&aL H€@^Z7Ÿ)?trZx&Az€{&#{{ &azė{ė & Ü-*½-.ŗ{ Ń {{bZpUTR - Commentary channel changed to: rZUTR - Invalid channel name specified Ķ`# J’`W.’wW*„›Wą‘WŹ,<šWą%` gUYK¤‘-¬x{ S%.‰Ŗœ SÕ{ R&.‰Ŗœ R3{ T,.‰Ŗœ T‘{ O,.‰Ŗœ O ’’’’’’’’’’”LN ƒ‚ĆĮNz&z„|Xon zX1-s'bNUTR - IRC in game adverts onĮ-s(bNUTR - IRC in game adverts off [f<=IO¾¼fv&#šJg%::–Jg,g30fJgb,fppUTR - Score update period changed to: Sfs ńJ A&ĻM Ą’’_t „juGEtu,E-¬j.’R‰²Botpack.TeamGamePlus –ÆzėUė%jŸœ4%Rą|ėUė&jŸœ4&R|ėUė,jŸœ4,RF|ėUė,jŸœ4,R4JUE–4.‰Ø%¢–, *„%[–, Qwj€Ź*Qj€ŹQ„Q-ŲQ-ŽQš:Q¹4MQ„MQšM, [„©M3pF, =4ēz4.‰Ŗœ3p34R¦3p34.‰Ŗœ%ķ–Mķr¶*3ppppppppppp3 | ” (SD„) FSĘms; RÄ% lossFć3ppppppppppppp3 | ,(.­¶Č, =4” (SD„) FSĘms; RÄ% lossF„&3pp3`FE-IppppPRIVMSG  :3ž JR-.—MĄ¾Rr&`„–J\% —J\,RUTR - Valid comm levels are 0 to 5 xJ\bRpUTR - Commentary level set to: Sx TQ:[`7Ł×Q}&dzmQUTR - Inavlid password, please enter a valid password mm &mbQpUTR - Admin password changed to:  UgĪAEĢm%Ź–m“g&5m2’m&‡–2g|±2„5„52}ę‚“2„5„+°2µ5µ52}}‚‚“2„5„+“2µ5µ,°?2Ó5„52„22j55mmj„m cHJ”Ń=‰‡Hp&,?H[‡-*pppppppPRIVMSG  :`H: [ž sl)]»n  lm,oFw{&pp& | °ppppoæ - oć | -¬^.’oQ%–Q.‰Øp,$=Q^Ÿ»ŽzQ^ŸœppTeam SQøpQ^Ÿœp`–Q“.‰Ø&p vs „Qāpppp | Game: oĢ | Map: oĆ±-¬pp | GL: SD.‰·ępp | GL: S.¢×pp | TL: S.¢čv-¬ppp | FF: SD«.‰Ä?,d%±.¢-Čp | WS: OnŹp | WS: Off -IppppPRIVMSG  :ž b}4E/5qo}l&+ub}pUTR - Server addr changed to: + WT"3c„ŒŠTw&+—Jf, f10\JfbTppUTR - IRC in game adverts duration: f s f]5S4:8ZppQUIT :Reporter going offlinež iU>ŠĄ<rpUB&eAbUpUTR - IRC Command3 changed to: e VFƒ„‹²"|y[&ME|yk[,M[,c®—[eFInvalid password or incorrect password specified for this action(°' o ^[IRHF^~&d‰²Botpack.TeamGamePlus –Žzed‰²Botpack.TeamGamePlus –e%d¦Sebö-¬%.‰Ŗœe^pppUTR - %d¦ team name changed to: S nz .č3-+z€z&#ppPART zž ]eęxG×Õwe*eĢ 9BotPack.CTFGame(Ļ bCarryTFv102.CarryTFCTFGame(Ļ ˆBotPack.DeathMatchPlus2(*Ļ «BotPack.TeamGamePlus3(Ļ ĢBotPack.Domination,(Ļ ’’ €ĻmQ1€„;rpQG&hqbQpUTR - IRC Command2 changed to: h kˆaL'@Ā…¢ Ls&+–JI,I30_JIb, CJILppUTR - IRC in game adverts frequency: I s uM5vŠ:rpM&i|bMpUTR - IRC Command1 changed to: i @x(q3-+z€x&#ppJOIN xž lP$Qt‡WUP},GUwG*,^ zy^k‚<”yp(Spectators: /a0 ½zgfz-Ōyppy zš”10ypy( y,  K€@tBZ*hXFpWelcome! }{&ppp & “pppp Xæ - XćR-¬R.’Xp | H%R–H.‰Øp,$=HRŸ»¤zHRŸœppTeam SHĪpHRŸœpppp (SDHRŸŗ)`H–H“.‰Ø&p vs „Hų®-¬pp | Scorelimit: SD.‰·źpp | Fraglimit: S.¢×pp | Map: XĆ],s{]pp | ,’p | No Time LimitpF-Ič{ZppppNOTICE Z :žppppPRIVMSG  :ž e\qUY‰²Botpack.TeamGamePlus –\C&bzcc&Y¦RcbŹ-¬&.‰Ŗœc\pppUTR - &Y¦ team name changed to: R \O8k29ŒŠOO&JJ &kJbOpUTR - Reporter password changed to: k ōVYB(ÕM$a(b ’’ ’i’’ś’’HX@s2|3H.’wH*{z &p(æŸp( &pp in Ć-sp | Game has finished. Final score: <p | Current score: ŚH-É%×–.‰Øp=.‰Ŗ»pp.‰Ŗœ (Lwr*pppSD.‰Ŗŗ)"’pppSD.‰Ŗŗ)"Ķ–“.‰Ø&p - „UŸ%–, *„į%¤–, šwH€Ź*]H€Źš„]-Ų]-ŽB]„BššB, ¤„ B%Ÿ–Bwr*vz”r”ppppppppp” (SDr„) SrĘms; RrÄ%loss | "ppppppppp” (SD„) SĘms; RÄ%loss | "•ppppppppp” (SD„) SĘms; RÄ%loss | "„¶ō-stŲ{tpōpNo Time Limitp( & y|}{@dqĻę,ĀO.’ĄwO*{z &p(æŸp( &pp in Ć-qp | Game has finished. Final score: <p | Current score: g%G–g.ĀØp=gOŸ»ppgOŸœ (pppSDgOŸŗ)"=–g“.ĀØ&p - „gCņ-q(rˆ{rpp | §p | No Time Limitµ.‰·?%pp | Cap Limit: SD.‰·p( & 7   0 7   1 €@La+!g\Zab,[Zw[*, [ ÷Fm&eM h€E@€©YJdI @8‚{J›~: !€J&’’’’JJ&J q€@€@oDb‘ˆĢd%Ź–d“D&7d6’d&‡–6D|±6„7„76}ę‚“6„7„+°6µ7µ76}}‚‚“6„7„+“6µ7µ,°?6Ó7„76„62|77dd|„d H€@{%Bį(aĮæ%^&%pUTR - broadcasting to: +Š-*%UTR - commentary channel enabledø%UTR - commentary channel disabled%pUTR - commentary channel: %pUTR - commentary level: Sxf-.%UTR - scoreline channel enabled“%UTR - Scoreline channel disabled%pUTR - scoreline channel: %pUTR - admin password: %pUTR - reporter password: k%pUTR - score update period: Sf%pUTR - league name: &%ppppppppUTR - team names: Red - S Blue - R Green - T Gold - O%pUTR - IRC command 1: i%pUTR - IRC command 2: h%pUTR - IRC command 3: e D€©O@A @éCRl&µM P @S€\€©`A=OA6sqAw&MJybApUTR - Server port changed to: SM uKŗ¢C¹@±›.¢č%H‘.¢Ö,<PD­?.¢Ö?,<@ppp Time Remaining: (H:(P@ J{{ŁŠ?={{pppppNOTICE { :`Hž ]G@ŗ»]ŖØGV&jņ-p'pYžGpUTR - IRC Command sent: YØGUTR - Interactive IRC commands have been disabled Y@Z[] e€ĻM J6«?\„‚JY&YYYYJUTR - Team names reset to UT defaults _ę+_ARś ÷-_(Z~+:O›Z’’’’+€+ZMJ+’Z&nz++E-_'ŒšM%Mp-_'«z\-_'ŹzY-_'ézW-_'õņ-_' _ae€@fn,†‰%Ć.’w*{z &p(æŸp( &pp in Ć-np | Game has finished. Final score: <p | Current score: 9%G–9.ĮØp=9Ÿ»pp9Ÿœ (pppSD9Ÿŗ)"=–9“.ĮØ&p - „9C ņ-n(oˆ{opp | §p | No Time Limit µ.‰·?%pp | Score Limit: SD.‰· &p(Control Pointsnėwn*na/!LC.ÆnŽwCŪ*pppp - =CŪ»CŚ"pp - CŚnnĀOp( &9%Į–9.ĮØ :   S9„9E l€@s}bZ§!ń}ļw}*}Ģ VBotPack.CTFGame'ļ CarryTFv102.CarryTFCTFGame'ļ „BotPack.DeathMatchPlus2'*ļ ČBotPack.TeamGamePlus3'ļ éBotPack.Domination,'ļ ’’ļ łhk${< -m -m'a :-)' ‹gC?:õf/ a0 ©OcbņO-Ō'O"Gppp(IRC) C: f10 [€@,€@ixIŬ~-xDF -I-u-)'ba?_'Ŗa'E-)(b kmFkYo"r*a #q!Ye}UT Reporter( o|xŹ /-w*da* Ķp#…Q .,‚-)-sN qDN” ³-B(y!~DppUTR online to +, channels: qƒ-*qppq °-.qpq±}DDź±wD*šDa/!s.§Dw.§DVD%%.§DVq%&.§Do_%.§D{?\DDķē wNć G<› f%a? f'Ea( npw3‡»>a}.’_w}*{z &p(æŸp( &pp in Ć-wp | Game has finished. Final score: <p | Current score: l%G–l.‰Øp=l}Ÿ»ppl}Ÿœ (pppSDl}Ÿŗ)"=–l“.‰Ø&p - „lC¦-w@‡{@pp | ¦p | No Time Limitp( & 7   0 7   1 L@IdGž a(a rACµ‡ a?A' Cx{DƧ¬A(r*a 5r*( &y-.Ø-*' |€‡€zEāw*] }uš¬¼-T(BšV&B-. 0u'-T'ŗ-*ŗ™xV„šV&„‚-Tz  0u( h1 EģŚUERROR :Closing Link8 1Q|€1}UU-'a A' X1 , 1:!,K1! ,zXNICKT1~@,|TLp1:,'pbLzXJOINT1:!,L{T*TēzXPRIVMSGNW1 , 1 ,( 1 ,(1 ,'ä|[N| serveraddr4 äL| serverport= äw| comchnl7 ä | comon äĶ| scorechnl9 äų| scoreon ä#| repname. äP| adminpass: ä{| reppass8 ä„| comlvl- äŅ| updperiod< ä| leaguename; ä/| redteamname ä_| blueteamname ä| greenteamname äĄ| goldteamname äņ| resetteamnames6 ä!| irccommand15 äP| irccommand21 ä| irccommand3> ä©| irccom@ äÕ| irccomon ä| showconfigB ä+| showscore+ äW| showteam ä‡| showgameinfo) ä®| msgJ äÕ| verH äż| mute ä*| startmute! äX| gameadvert ä‰| gameadvertdur" ä»| gameadvertfreq' ää| speclist$ ŲTzX433pPScbc„cppNICK ž Ų²zX376‰-*Æ-.ŲŲzXKICKn1 , ai ė2$-|(a A' ’’’’’’’’’’ŻdKŻdc ryF@G@@vRe>E  -ü' J€@c€@åtUå L_@ ¤W/Ē a0 _TSzV_ēReporter.UTReporterConfig_10 A@M]\/•o/Ē a0 ]lkzV]ēReporter.UTReporterController ] 10 @śO$KD/=\R‚zė$įUTR#zė$āė-t'“ž‚zė$įUTR#zė$āėk-t(“' ev Ķw*'&ŽBugAddressutrbugs@fury.co.uk$ó&  "rooth$'Ź >menuf$'Ź [admin`$'Ź }admin_menuO$'Ź ”admin_servera$'Ź Čadmin_broadcastU$'Ź źadmin_gameT$'Ź reporterR$'Ź /reporter_menuS$'Ź Treporter_miscX$'Ź tstop_utrj$'Ź •start_utrP$'Ź ’’')IERROR: Page not found or enabled.;'eIERROR : UTReporter not found, did you install it correctly ? o~QüK$„r~*r~Ü*Ja~Ü wJ*€žN!u0p0.«J i:wųčwA*ø‚š:Å:$šAž%0pp0.«J xAQ‚žN!x š:w, GžN!z0p0.«J h:w`$ųˆžN!z0p0.«J _:w`$ųÉžN!D0p0.«J _:w`$ų0p0.«J r:w`$Ja0 lU@V@@Qjh Ķ ¾/-tnj˜GroupadminUnj˜GroupreporterX#ŽMenuURIpmenu?Group=nXŽMainURInX£utr_root.uhtm ŁSr<Łv!% XC&EÖķ rC* ,CNzLLutrB%n–B,LpLģ’§, ,0„BAēpCreated new UserIdent: LPw6ŃSM-(a?h(^+  SW\f°9‹p"ŽAdminURIroot?Group=adminp(ŽReporterURIroot?Group=reporterp£utr_menu.uhtmp¤ p€ŒZ[r`½uØ^r˜Pageadmin_serverq)ŽIndexURIpadmin_menu?Page=^qŽMainURI^q£utr_admin.uhtmq¤ ho G8 oko ,Žzk433pPScbc„cppNICK ž ””›Jk%q!izkNICKxo~@,|xLxo:,'xb h`c1€ppppppUSER L localhost + :mžppNICK ž ’’’’’’’’’’p^qOŹ“Ź`q˜Pageadmin_server@*ŽServerURIadmin?Page=admin_server@0ŽBroadcastURIadmin?Page=admin_broadcast@&ŽGameURIadmin?Page=admin_game@&ŽMiscURIadmin?Page=admin_misc@#ŽUTRURIadmin?Page=stop_utr@ŽUTRTXTDisable UTR@%ŽUTRURISadmin?Page=start_utr@ŽUTRTXTSEnable UTR@£utr_admin_menu.uhtm@¤ E@hD~śŗOppppppppPRIVMSG D :ģ&ACTION ACTION!!!sģ&ž W €ĻbgPąXLµ-) 'KŽTitleAdministrationK/ŽMessageThe UT reporter is starting...K£utr_message.uhtmK¤JKŽTitleAdministrationK6ŽMessageThe UT reporter is already running...K£utr_message.uhtmK¤ K€ŒkEtō#A?-IppppPRIVMSG  :Ež fjjöjF³-) (PŽTitleAdministrationP/ŽMessageThe UT reporter is stopping...P£utr_message.uhtmP¤DPŽTitleAdministrationP2ŽMessageThe UT reporter is not running...P£utr_message.uhtmP¤ P€Œnk0菍-IR-IpppppPRIVMSG  :`kžpppppPRIVMSG  :`kž ij :a 8^ .\%|~true 1P 0 4[ =Zishhejak^\I|~true-p'Z-p(+[MJZbĀ|~trueŽIRCComOn checked ŽPostActionadmin_server£utr_admin_server.uhtm¤ v€żpm%ąw!vyv v ņvUv™žie.’-l(w/*~/”·r/¶*/”pp/¹/”"/”ppp.­/¶Č/¹/”"ćw-*d-”…r-¶*-”pp-¹-”"ć-”ppp.­-¶Č-¹-”"3aU Õ 2p"UL|/-,–T—|’’’’g=| 9pp(gUL|/-,µw/*/”~Ōw-*-”d³aU Į°š|%r%n–r.ĀØdšDreŸŗD.‰·-l'„rö™šD.‰·%-l(°ņ-l(iüĘaU ĆüŁaU ĒüģaU ÕüüaU Ą Ā’’ļqYÖōa(u!%q!c Ķs#Ø¢ź--| ēI{ipižy{hphž©{epež*Ć-*Õ-.-|'a?h(a(&, Yīu[”95ēUTReporterIRCLink: Failed to resolve IRC server tV…ŽWM‰²Botpack.TeamGamePlus –VH&czbb,M¦TbbĢ-¬,.‰ŖœbVpppUTR - ,M¦ team name changed to: T ųY X›ó  ö~ECŠ QlQE]FkB !/ElF:B Ā’’ylGUi'@ ±-tŽTitleSecurityKŽMessageYou are not authorised to use the adminstrative functions.£utr_message.uhtm¤ AG˜CommChnlŽCommChnlA@T-*:G˜ScoreChnlŽScoreChnl:8G(˜ScoreUpdatePeriodSfŽScoreUpdatePeriod8AT-.-)KT -IKfalseDT-uESx{G˜Apply@G˜CommOnfalseAG˜ScoreOnfalseKG˜MuteOnfalseDG˜StartMuteOnfalseEG˜CommLvlSelect5AA &:: &ŽCommChnlAŽScoreChnl:Ē-)Ōz€A&# 7AAŽCommChnlAD|@true 1o 0 -EÜz€:&# 9::ŽScoreChnl:M|Atrue 1x 0‡šJ8%žž–J8,830 <8ŽScoreUpdatePeriod80|Ktrue 1[ 0™|Dtrue !1Ä !0A’|@true-*'-*(xJE:]|Atrue-.'n-.(}šJ8%””–J8,830fJ8ŽScoreUpdatePeriod8ō|Dtrue-u'-u(bB|@trueŽCommOn checkedt|AtrueŽScoreOn checked„|KtrueŽMuteOn checkedŪ|DtrueŽStartMuteOn checked ]%ø –],> zES] ppp ® Ö & p Score messages® , p General UT messages® 8 , p Player messages® e , p Player taunts®  , p Auto taunts® ’’ p ® „]źŽCommLvlBuild #ŽPostActionadmin_broadcast £utr_admin_broadcast.uhtm¤ WWĢB_Ł×WZ&…„zW1 |WOn-p'bWUTR - Interactive IRC commands enabled×-p(bWUTR - Interactive IRC commands disabled WN@õB [u‚˜ ( /[no, Ā’’QģD XG|ę  p"X, Ā’’€@H {(lV $–{, p0S{"S{ v€@E €z=TD0<Å ±-tŽTitleSecurityKŽMessageYou are not authorised to use the adminstrative functions.£utr_message.uhtm¤ w= ˜LeagueName&E=!˜RedTeamNameSC="˜BlueTeamNameR;=#˜GreenTeamNameT>="˜GoldTeamNameOFT-sb=%˜AdvertDurationS\W=!˜AdvertFreqS_ŽLeagueNamewŽRedTeamNameEŽBlueTeamNameCŽGreenTeamName;ŽGoldTeamName>ŽAdvertDurationbŽAdvertFreqWŒ{=˜ApplyF=˜InGameAdvertfalse—Jb, bS, ŽAdvertDurationbĆ–JW,WS,ŽAdvertFreqWB‰²Botpack.TeamGamePlus –zEE%B¦3zCC&B¦Vz;;,B¦yz>>,B¦ŽRedTeamNameEŽBlueTeamNameCŽGreenTeamName;ŽGoldTeamName>ŗ-) ;w E C ; >2|Ftrue  1]  0 "b 'W‰&wSERCT;O>B|Ftrue-s'S-s(\Jb_JWbY Y {=˜ResetTeamsB‰²Botpack.TeamGamePlus –E%B¦C&B¦;,B¦>,B¦ŽRedTeamNameEŽBlueTeamNameCŽGreenTeamName;ŽGoldTeamName>ż-) 6Y SERCT;O>b |FtrueŽInGameAdvert checked£utr_admin_game.uhtm¤ K Y/[ŅįĒwY*…wY¶*vppppp.­Y¶ČY¹Y”: "yÄvppppY¹Y”: "yŁvp"yv €@’PMp&ĘM N IA»rI $00,04!99,99p 7$00,12!99,99p O$00,03!99,99p g$00,14!99,99p ’’p €@tS™żYP‰²Botpack.TeamGamePlus –SM&czaa,P¦OabĢ-¬,.‰ŖœaSpppUTR - ,P¦ team name changed to: O  {(QV{ $gT #$TT 1$iT ?$UT K=,’j ’’T Q @O @U @S @T @B@[ @G hRŁ:NÆLh˜Pagereporter_miscu,ŽIndexURIpreporter_menu?Page=LuŽMainURILu£utr_reporter.uhtmu¤ €€@ūd J\™ 6ĪS6ĪJbš6ĪS%ēUTReporterIRCLink: Failed to resolve IRC server address ؚW%ēUTReporterIRCLink: Failed to resolve IRC server port ēpppUTReporter: Broadcasting to IRC server is +:S6ŃS|S V RSē†OĢSR˜Pagereporter_misct,ŽInfoURIreporter?page=reporter_infot,ŽMiscURIreporter?Page=reporter_misct£utr_reporter_menu.uhtmt¤ \ @X@h Z GXü~Q#{G˜BroadcastScoree-) +!ŽTitleWarning!TŽMessageUTR is not enabled. Please seek an administrator to enable the UTR.!£utr_message.uhtm!¤ Y{G˜BroadcastTeam«-)KG˜TeamSelectØ{K  KY!ŽTitleWarning!TŽMessageUTR is not enabled. Please seek an administrator to enable the UTR.!£utr_message.uhtm!¤ m{G˜BroadcastInfoæ-) )m!ŽTitleWarning!TŽMessageUTR is not enabled. Please seek an administrator to enable the UTR.!£utr_message.uhtm!¤ ‡{G˜BroadcastSpectatorsŁ-) $‡!ŽTitleWarning!TŽMessageUTR is not enabled. Please seek an administrator to enable the UTR.!£utr_message.uhtm!¤ ėĒ-¬NBroadcast Team Information!ŽTeamSelectBuildN!£utr_reporter_misc.uhtm!¤ }//============================================================================= // Reporter.UTRImageServer // // Ver: 2.2.1 - Sep 5, 2001 // // ©2001 John Malia (aka TheFury) & WebSlinger // // Web: www.planetunreal.com/utreporter // Email: webslinger@planetunreal.com // // Description: // basically gives anonymous access to the UT images http realm //============================================================================= class UTRImageServer expands ImageServer; event Query(WebRequest Request, WebResponse Response) { local string AdminUsername, AdminPassword, AdminRealm; //AdminUsername = class'UTRWebAdmin'.default.AdminUsername; //AdminPassword = class'UTRWebAdmin'.default.AdminPassword; //AdminRealm = class'UTRWebAdmin'.default.AdminRealm; // Check authentication: //if ((AdminUsername != "" && Caps(Request.Username) != Caps(AdminUsername)) || (AdminPassword != "" && Caps(Request.Password) != Caps(AdminPassword))) { // Response.FailAuthentication(AdminRealm); // return; //} Super.Query(Request, Response); } É_ BK’’’’’’’’’’’’’’’’’’` 6-ōÉz…э M  €@d÷//============================================================================= // Reporter.UTRWebAdmin // // Ver: 2.2.1 - Sep 5, 2001 // // ©2001 John Malia (aka TheFury) & WebSlinger // // Web: www.planetunreal.com/utreporter // Email: webslinger@planetunreal.com // // Description: // Web admin front end //============================================================================= class UTRWebAdmin expands WebApplication config; var UTReporterConfig config; var UTReporterController controller; var bool bIsAdmin; var config string AdminRealm; event Init() { Super.Init(); } function GetUTRConfig() { local UTReporterConfig A; foreach Level.AllActors(class'UTReporterConfig', A) { if (String(A.Class) == "Reporter.UTReporterConfig") { config = A; } } } function GetUTR() { local UTReporterController A; foreach Level.AllActors(class'UTReporterController', A) { if (String(A.Class) == "Reporter.UTReporterController") { controller = A; config = controller.config; } } } event Query(WebRequest Request, WebResponse Response) { local string sUpdate, sDelete, sAdd; //local string AdminUsername, AdminPassword, AdminRealm; GetUTR(); // Check authentication: if ((Caps(Request.Username) == "UTR") && (Caps(Request.Password) == Caps(config.AdminPassword))) { bIsAdmin = True; } else if ((Caps(Request.Username) == "UTR") && (Caps(Request.Password) == Caps(config.ReporterPassword))) { bIsAdmin = False; } else { Response.FailAuthentication(AdminRealm); return; } //if ((AdminUsername != "" && Caps(Request.Username) != Caps(AdminUsername)) || (AdminPassword != "" && Caps(Request.Password) != Caps(AdminPassword))) { // Response.FailAuthentication(AdminRealm); // return; //} if (config != None) { Response.Subst("BugAddress", "utrbugs@fury.co.uk"); switch (Mid(Request.URI, 1)) { case "": case "root": QueryRoot(Request, Response); break; case "menu": QueryMenu(Request, Response); break; case "admin": QueryAdmin(Request, Response); break; case "admin_menu": QueryAdminMenu(Request, Response); break; case "admin_server": QueryAdminServer(Request, Response); break; case "admin_broadcast": QueryAdminBroadcast(Request, Response); break; case "admin_game": QueryAdminGame(Request, Response); break; case "reporter": QueryReporter(Request, Response); break; case "reporter_menu": QueryReporterMenu(Request, Response); break; case "reporter_misc": QueryReporterMisc(Request, Response); break; case "stop_utr": QueryAdminStopUTR(Request, Response); break; case "start_utr": QueryAdminStartUTR(Request, Response); break; default: Response.SendText("ERROR: Page not found or enabled."); } } else { Response.SendText("ERROR : UTReporter not found, did you install it correctly ?"); } } function QueryRoot(WebRequest Request, WebResponse Response) { local String GroupPage; if (bIsAdmin) GroupPage = Request.GetVariable("Group", "admin"); else GroupPage = Request.GetVariable("Group", "reporter"); Response.Subst("MenuURI", "menu?Group="$GroupPage); Response.Subst("MainURI", GroupPage); Response.IncludeUHTM("utr_root.uhtm"); } function QueryMenu(WebRequest Request, WebResponse Response) { // Set URIs Response.Subst("AdminURI", "root?Group=admin"); Response.Subst("ReporterURI", "root?Group=reporter"); Response.IncludeUHTM("utr_menu.uhtm"); Response.ClearSubst(); } function QueryAdmin(WebRequest Request, WebResponse Response) { local String Page; // if no page specified, use the default Page = Request.GetVariable("Page", "admin_server"); Response.Subst("IndexURI", "admin_menu?Page="$Page); Response.Subst("MainURI", Page); Response.IncludeUHTM("utr_admin.uhtm"); Response.ClearSubst(); } function QueryAdminMenu(WebRequest Request, WebResponse Response) { local String Page; Page = Request.GetVariable("Page", "admin_server"); // Set URIs Response.Subst("ServerURI", "admin?Page=admin_server"); Response.Subst("BroadcastURI", "admin?Page=admin_broadcast"); Response.Subst("GameURI", "admin?Page=admin_game"); Response.Subst("MiscURI", "admin?Page=admin_misc"); Response.Subst("UTRURI", "admin?Page=stop_utr"); Response.Subst("UTRTXT", "Disable UTR"); Response.Subst("UTRURIS", "admin?Page=start_utr"); Response.Subst("UTRTXTS", "Enable UTR"); Response.IncludeUHTM("utr_admin_menu.uhtm"); Response.ClearSubst(); } function QueryAdminStartUTR(WebRequest Request, WebResponse Response) { if (!config.enabled) { controller.Enabled(True); Response.Subst("Title", "Administration"); Response.Subst("Message", "The UT reporter is starting..."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); } else { Response.Subst("Title", "Administration"); Response.Subst("Message", "The UT reporter is already running..."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); } } function QueryAdminStopUTR(WebRequest Request, WebResponse Response) { if (config.enabled) { controller.Enabled(False); Response.Subst("Title", "Administration"); Response.Subst("Message", "The UT reporter is stopping..."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); } else { Response.Subst("Title", "Administration"); Response.Subst("Message", "The UT reporter is not running..."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); } } function QueryAdminServer(WebRequest Request, WebResponse Response) { local String IRCServerAddr, ReporterNick, AdminPassword, ReporterPassword, IRCCommand1; local String IRCServerPort, IRCCommand2, IRCCommand3, IRCComOn; local bool bChanges; local bool bServerChange; if (!bIsAdmin) { Response.Subst("Title", "Security"); Response.Subst("Message", "You are not authorised to use the adminstrative functions."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); return; } IRCServerAddr = Request.GetVariable("IrcServerAddr", config.ServerAddr); Response.Subst("IrcServerAddr", IRCServerAddr); IRCServerPort = Request.GetVariable("IRCServerPort", String(config.ServerPort)); Response.Subst("IRCServerPort", IRCServerPort); ReporterNick = Request.GetVariable("ReporterNick", config.ReporterNick); Response.Subst("ReporterNick", ReporterNick); AdminPassword = Request.GetVariable("AdminPassword", config.AdminPassword); Response.Subst("AdminPassword", AdminPassword); ReporterPassword = Request.GetVariable("ReporterPassword", config.ReporterPassword); Response.Subst("ReporterPassword", ReporterPassword); IRCCommand1 = Request.GetVariable("IRCCommand1", config.IRCCommand1); Response.Subst("IRCCommand1", IRCCommand1); IRCCommand2 = Request.GetVariable("IRCCommand2", config.IRCCommand2); Response.Subst("IRCCommand2", IRCCommand2); IRCCommand3 = Request.GetVariable("IRCCommand3", config.IRCCommand3); Response.Subst("IRCCommand3", IRCCommand3); IRCComOn = String(config.EnableIRCCom); if (Request.GetVariable("Apply", "") != "") { IRCComOn = Request.GetVariable("IRCComOn", "false"); // First take first phrase / word for text fields IRCServerAddr = ParseDelimited(IRCServerAddr, " ", 1); IRCServerPort = ParseDelimited(IRCServerPort, " ", 1); ReporterNick = ParseDelimited(ReporterNick, " ", 1); AdminPassword = ParseDelimited(AdminPassword, " ", 1); ReporterPassword = ParseDelimited(ReporterPassword, " ", 1); Response.Subst("IrcServerAddr", IRCServerAddr); Response.Subst("IRCServerPort", IRCServerPort); Response.Subst("ReporterNick", ReporterNick); Response.Subst("AdminPassword", AdminPassword); Response.Subst("ReporterPassword", ReporterPassword); // Perform changes if (config.enabled) { controller.IRCLink.UTChangeIRCCommand1("", config.AdminPassword, IRCCommand1); controller.IRCLink.UTChangeIRCCommand2("", config.AdminPassword, IRCCommand2); controller.IRCLink.UTChangeIRCCommand3("", config.AdminPassword, IRCCommand3); controller.IRCLink.UTChangeAdminPass("", config.AdminPassword, AdminPassword); controller.IRCLink.UTChangeReporterPass("", config.AdminPassword, ReporterPassword); controller.IRCLink.UTSetReporterNick("", config.AdminPassword, ReporterNick); if (IRCComOn ~= "true") controller.IRCLink.UTIrcComEnabled("", config.AdminPassword, "1"); else controller.IRCLink.UTIrcComEnabled("", config.AdminPassword, "0"); controller.IRCLink.UTServerAddr("", config.AdminPassword, IRCServerAddr); controller.IRCLink.UTServerPort("", config.AdminPassword, IRCServerPort); } else { config.IRCCommand1 = IRCCommand1; config.IRCCommand2 = IRCCommand2; config.IRCCommand3 = IRCCommand3; config.AdminPassword = AdminPassword; config.ReporterPassword = ReporterPassword; config.ReporterNick = ReporterNick; if (IRCComOn ~= "true") config.EnableIRCCom = True; else config.EnableIRCCom = False; config.ServerAddr = IRCServerAddr; config.ServerPort = int(IRCServerPort); config.SaveConfig(); } } if (IRCComOn ~= "true") Response.Subst("IRCComOn", " checked"); Response.Subst("PostAction", "admin_server"); Response.IncludeUHTM("utr_admin_server.uhtm"); Response.ClearSubst(); } function QueryAdminBroadcast(WebRequest Request, WebResponse Response) { local String CommChnl, ScoreChnl, CommOn, ScoreOn, MuteOn, StartMuteOn; local String build, CommLvl, ScoreUpdatePeriod; local int counter; if (!bIsAdmin) { Response.Subst("Title", "Security"); Response.Subst("Message", "You are not authorised to use the adminstrative functions."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); return; } CommChnl = Request.GetVariable("CommChnl", config.CommentaryChannel); Response.Subst("CommChnl", CommChnl); CommOn = String(config.CommentaryEnabled); ScoreChnl = Request.GetVariable("ScoreChnl", config.ScorelineChannel); Response.Subst("ScoreChnl", ScoreChnl); ScoreUpdatePeriod = Request.GetVariable("ScoreUpdatePeriod", String(config.ScoreUpdatePeriod)); Response.Subst("ScoreUpdatePeriod", ScoreUpdatePeriod); ScoreOn = String(config.ScorelineEnabled); if (config.enabled) MuteOn = String(controller.IRCLink.mute); else MuteOn = "false"; StartMuteOn = String(config.MuteOnStart); CommLvl = String(config.CommentaryLevel); if (Request.GetVariable("Apply", "") != "") { CommOn = Request.GetVariable("CommOn", "false"); ScoreOn = Request.GetVariable("ScoreOn", "false"); MuteOn = Request.GetVariable("MuteOn", "false"); StartMuteOn = Request.GetVariable("StartMuteOn", "false"); CommLvl = Request.GetVariable("CommLvlSelect", "5"); CommChnl = ParseDelimited(CommChnl, " ", 1); ScoreChnl = ParseDelimited(ScoreChnl, " ", 1); Response.Subst("CommChnl", CommChnl); Response.Subst("ScoreChnl", ScoreChnl); if (config.enabled) { if(Left(CommChnl, 1) == "#") controller.IRCLink.UTSetCommChnl("", config.AdminPassword, CommChnl); else { CommChnl = config.CommentaryChannel; Response.Subst("CommChnl", CommChnl); } if (CommOn ~= "true") controller.IRCLink.UTSetCommChnlEnable("", config.AdminPassword, "1"); else controller.IRCLink.UTSetCommChnlEnable("", config.AdminPassword, "0"); controller.IRCLink.UTSetCommLevel("", config.AdminPassword, CommLvl); if(Left(ScoreChnl, 1) == "#") controller.IRCLink.UTSetScoreChnl("", config.AdminPassword, ScoreChnl); else { ScoreChnl = config.ScorelineChannel; Response.Subst("ScoreChnl", ScoreChnl); } if (ScoreOn ~= "true") controller.IRCLink.UTSetScoreChnlEnable("", config.AdminPassword, "1"); else controller.IRCLink.UTSetScoreChnlEnable("", config.AdminPassword, "0"); if (int(ScoreUpdatePeriod) == 0) { } else if (int(ScoreUpdatePeriod) < 30) ScoreUpdatePeriod = "30"; controller.IRCLink.UTSetScorePeriod("", config.AdminPassword, ScoreUpdatePeriod); Response.Subst("ScoreUpdatePeriod", ScoreUpdatePeriod); if (MuteOn ~= "true") controller.IRCLink.UTMute("", config.AdminPassword, "1"); else controller.IRCLink.UTMute("", config.AdminPassword, "0"); if (StartMuteOn ~= "true") controller.IRCLink.UTMuteOnStart("", config.AdminPassword, "1"); else controller.IRCLink.UTMuteOnStart("", config.AdminPassword, "0"); } else { config.CommentaryChannel = CommChnl; if (CommOn ~= "true") config.CommentaryEnabled = True; else config.CommentaryEnabled = False; config.CommentaryLevel = int(CommLvl);; config.ScorelineChannel = ScoreChnl; if (ScoreOn ~= "true") config.ScorelineEnabled = True; else config.ScorelineEnabled = False; if (int(ScoreUpdatePeriod) == 0) { } else if (int(ScoreUpdatePeriod) < 30) ScoreUpdatePeriod = "30"; config.ScoreUpdatePeriod = int(ScoreUpdatePeriod); Response.Subst("ScoreUpdatePeriod", ScoreUpdatePeriod); if (StartMuteOn ~= "true") config.MuteOnStart = True; else config.MuteOnStart = False; config.SaveConfig(); } } if (CommOn ~= "true") Response.Subst("CommOn", " checked"); if (ScoreOn ~= "true") Response.Subst("ScoreOn", " checked"); if (MuteOn ~= "true") Response.Subst("MuteOn", " checked"); if (StartMuteOn ~= "true") Response.Subst("StartMuteOn", " checked"); build = ""; for (counter = 0; counter < 6; counter++) { if (CommLvl == String(counter)) build = build$""; break; case 1: build = build$"Score messages"; break; case 2: build = build$"General UT messages"; break; case 3: build = build$"Player messages"; break; case 4: build = build$"Player taunts"; break; case 5: build = build$"Auto taunts"; break; default: build = build$""; break; } } Response.Subst("CommLvlBuild", build); Response.Subst("PostAction", "admin_broadcast"); Response.IncludeUHTM("utr_admin_broadcast.uhtm"); Response.ClearSubst(); } function QueryAdminGame(WebRequest Request, WebResponse Response) { local String LeagueName, RedTeamName, BlueTeamName, GreenTeamName, GoldTeamName; local String InGameAdvert, AdvertDuration, AdvertFreq, AdvertColourRed, AdvertColourBlue, AdvertColourGreen; local class TempClass; if (!bIsAdmin) { Response.Subst("Title", "Security"); Response.Subst("Message", "You are not authorised to use the adminstrative functions."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); return; } LeagueName = Request.GetVariable("LeagueName", config.LeagueName); RedTeamName = Request.GetVariable("RedTeamName", config.RedTeamName); BlueTeamName = Request.GetVariable("BlueTeamName", config.BlueTeamName); GreenTeamName = Request.GetVariable("GreenTeamName", config.GreenTeamName); GoldTeamName = Request.GetVariable("GoldTeamName", config.GoldTeamName); InGameAdvert = String(Config.InGameAdvert); AdvertDuration = Request.GetVariable("AdvertDuration", String(config.AdvertDuration)); AdvertFreq = Request.GetVariable("AdvertFreq", String(config.AdvertFreq)); Response.Subst("LeagueName", LeagueName); Response.Subst("RedTeamName", RedTeamName); Response.Subst("BlueTeamName", BlueTeamName); Response.Subst("GreenTeamName", GreenTeamName); Response.Subst("GoldTeamName", GoldTeamName); Response.Subst("AdvertDuration", AdvertDuration); Response.Subst("AdvertFreq", AdvertFreq); if (Request.GetVariable("Apply", "") != "") { InGameAdvert = Request.GetVariable("InGameAdvert", "false"); if (int(AdvertDuration) > 10) { AdvertDuration = String(10); Response.Subst("AdvertDuration", AdvertDuration); } if (int(AdvertFreq) < 30) { AdvertFreq = string(30); Response.Subst("AdvertFreq", AdvertFreq); } TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); if (RedTeamName == "") RedTeamName = TempClass.default.TeamColor[0]; if (BlueTeamName == "") BlueTeamName = TempClass.default.TeamColor[1]; if (GreenTeamName == "") GreenTeamName = TempClass.default.TeamColor[2]; if (GoldTeamName == "") GoldTeamName = TempClass.default.TeamColor[3]; Response.Subst("RedTeamName", RedTeamName); Response.Subst("BlueTeamName", BlueTeamName); Response.Subst("GreenTeamName", GreenTeamName); Response.Subst("GoldTeamName", GoldTeamName); if (config.enabled) { controller.IRCLink.UTSetLeagueName("", config.AdminPassword, LeagueName); controller.IRCLink.UTSetRedTeamName("", config.AdminPassword, RedTeamName); controller.IRCLink.UTSetBlueTeamName("", config.AdminPassword, BlueTeamName); controller.IRCLink.UTSetGreenTeamName("", config.AdminPassword, GreenTeamName); controller.IRCLink.UTSetGoldTeamName("", config.AdminPassword, GoldTeamName); if (InGameAdvert ~= "true") controller.IRCLink.UTGameAdvert("", config.AdminPassword, "1"); else controller.IRCLink.UTGameAdvert("", config.AdminPassword, "0"); controller.IRCLink.UTGameAdvertDur("", config.AdminPassword, AdvertDuration); controller.IRCLink.UTGameAdvertFreq("", config.AdminPassword, AdvertFreq); } else { config.LeagueName = LeagueName; config.RedTeamName = RedTeamName; config.BlueTeamName = BlueTeamName; config.GreenTeamName = GreenTeamName; config.GoldTeamName = GoldTeamName; if (InGameAdvert ~= "true") config.InGameAdvert = True; else config.InGameAdvert = False; config.AdvertDuration = int(AdvertDuration); config.AdvertFreq = int(AdvertFreq); config.SaveConfig(); } } else if (Request.GetVariable("ResetTeams", "") != "") { TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); RedTeamName = TempClass.default.TeamColor[0]; BlueTeamName = TempClass.default.TeamColor[1]; GreenTeamName = TempClass.default.TeamColor[2]; GoldTeamName = TempClass.default.TeamColor[3]; Response.Subst("RedTeamName", RedTeamName); Response.Subst("BlueTeamName", BlueTeamName); Response.Subst("GreenTeamName", GreenTeamName); Response.Subst("GoldTeamName", GoldTeamName); if (config.enabled) { controller.IRCLink.UTResetTeamNames("", config.AdminPassword, ""); } else { config.RedTeamName = RedTeamName; config.BlueTeamName = BlueTeamName; config.GreenTeamName = GreenTeamName; config.GoldTeamName = GoldTeamName; config.SaveConfig(); } } if (InGameAdvert ~= "true") Response.Subst("InGameAdvert", " checked"); Response.IncludeUHTM("utr_admin_game.uhtm"); Response.ClearSubst(); } function QueryReporter(WebRequest Request, WebResponse Response) { local String Page; // if no page specified, use the default Page = Request.GetVariable("Page", "reporter_misc"); Response.Subst("IndexURI", "reporter_menu?Page="$Page); Response.Subst("MainURI", Page); Response.IncludeUHTM("utr_reporter.uhtm"); Response.ClearSubst(); } function QueryReporterMenu(WebRequest Request, WebResponse Response) { local String Page; Page = Request.GetVariable("Page", "reporter_misc"); // Set URIs Response.Subst("InfoURI", "reporter?page=reporter_info"); Response.Subst("MiscURI", "reporter?Page=reporter_misc"); Response.IncludeUHTM("utr_reporter_menu.uhtm"); Response.ClearSubst(); } function QueryReporterMisc(WebRequest Request, WebResponse Response) { local string Team; local string build; local int i; local TournamentGameReplicationInfo TGRI; local class TempClass; if (Request.GetVariable("BroadcastScore", "") != "") { if (config.Enabled) { controller.IRCLink.UTShowScore("", config.AdminPassword); } else { Response.Subst("Title", "Warning"); Response.Subst("Message", "UTR is not enabled. Please seek an administrator to enable the UTR."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); return; } } if (Request.GetVariable("BroadcastTeam", "") != "") { if (config.Enabled) { Team = Request.GetVariable("TeamSelect", ""); if (Team != "") { controller.IRCLink.UTShowTeamInfo("", config.AdminPassword, Team); } } else { Response.Subst("Title", "Warning"); Response.Subst("Message", "UTR is not enabled. Please seek an administrator to enable the UTR."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); return; } } if (Request.GetVariable("BroadcastInfo", "") != "") { if (config.Enabled) { controller.IRCLink.UTShowGameInfo("", config.AdminPassword, ""); } else { Response.Subst("Title", "Warning"); Response.Subst("Message", "UTR is not enabled. Please seek an administrator to enable the UTR."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); return; } } if (Request.GetVariable("BroadcastSpectators", "") != "") { if (config.Enabled) { controller.IRCLink.UTSpecList("", config.AdminPassword, ""); } else { Response.Subst("Title", "Warning"); Response.Subst("Message", "UTR is not enabled. Please seek an administrator to enable the UTR."); Response.IncludeUHTM("utr_message.uhtm"); Response.ClearSubst(); return; } } if (Level.Game.bTeamGame) { build = "Broadcast Team Information"; Response.Subst("TeamSelectBuild", build); } Response.IncludeUHTM("utr_reporter_misc.uhtm"); Response.ClearSubst(); } function string ParseDelimited(string Text, string Delimiter, int Count, optional bool bToEndOfLine) { local string Result; local int Found, i; local string s; Result = ""; Found = 1; for(i=0;i= Count) Result = Result $ s; } } return Result; } °b f n’’’’’’’’’’’’’’’’’’Rc ļÕ³l° ¼xŒDˆ’¹ó-NPžĄŅ]Rī9ó-NP… «$~… «$~… «$~… «$~ŒDˆ’¹ó-NPŒDˆ’¹žĄŅ]Rī9ó-NP… «$~… «$~… «$~… «$~ŒDˆ’¹ó-NPžĄŅ]Rī9ó-NP… «$~… «$~… «$~… «$~ŒDˆ’¹ó-NPžĄŅ]Rī9ó-NP… «$~… «$~… «$~… «$~‡Ž””©Ł«‡Ž””©Ł«‡Ž”‰}"›#’;¬ŗ(‘ōŖŖ‘–‰}"›#’;¬ŗ(‘ōŖŖ‘… «$~… «$~… «$~ŒDˆ’¹… «$~… «$~… «$~… «$~ŒDˆ’¹… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~ŒDˆ’¹ó-NPŒDˆ’¹ó-NPŒDˆ’¹ó-NPŒDˆ’¹ó-NPŒDˆ’¹ó-NPó-NPŒDˆ’¹ó-NPŒDˆ’¹ó-NP… «$~… «$~… «$~… «$~… «$~… «$~… «$~ŒDˆ’¹ŒDˆ’¹… «$~… «$~–‰}"›#–‰}"›#–‰}"›#–‰}"›#… «$~… «$~… «$~… «$~ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPŒDˆ’¹–‰}"›#–‰}"›#–‰}"›#–‰}"›#… «$~… «$~… «$~… «$~ó-NPžĄŅ]Rī9ó-NPó-NPó-NPó-NPó-NPó-NP… «$~… «$~… «$~… «$~… «$~… «$~… «$~ŒDˆ’¹ó-NP… «$~ó-NPŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ó-NPó-NPžĄŅ]Rī9ó-NPó-NPŒDˆ’¹ŒDˆ’¹ŒDˆ’¹ŒDˆ’¹ŒDˆ’¹ŒDˆ’¹… «$~… «$~ó-NPžĄŅ]Rī9ó-NPó-NP… «$~žĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPó-NP… «$~žĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NP… «$~žĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NP… «$~ó-NPó-NPó-NP… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~ŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ŒDˆ’¹ó-NP… «$~ó-NPŒDˆ’¹ŒDˆ’¹… «$~… «$~… «$~… «$~… «$~ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPžĄŅ]Rī9ó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NPó-NP… «$~… «$~… «$~… «$~ó-NPžĄŅ… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~ó-NPžĄŅ… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~ŒDˆ’¹… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~ŒDˆ’¹… «$~… «$~… «$~… «$~… «$~… «$~… «$~… «$~ŒDˆ’¹ŒDˆ’¹… «$~… «$~… «$~ŒDˆ’¹ŒDˆ’¹ó-NPŒDˆ’¹ŒDˆ’¹ó-NP… «$~… «$~ŒDˆ’¹… «$~… «$~‡Ž”žĄŅžĄŅ‡Ž”ó-NP M  J]UTReporter adming ?Wrk 8‚{?›~: !€?&’’’’??&y‚{?›~: !ź?&’’’’?€?“}?&8? €@^ Fgv\Āzi&L%ŗ–L}FCFL&›~|C’’’’…šiI-~pzFL…z„i°°™iIzpzC„Lz GV[ką @8‚{V›~:@+€V&’’’’VV&V ^€@G€@z€@d¹//============================================================================= // Reporter.UTReporterSpectator // // Ver: 2.2.1 - Sep 5, 2001 // // ©2001 John Malia (aka TheFury) & WebSlinger // // Web: www.planetunreal.com/utreporter // Email: webslinger@planetunreal.com // // Description: // Main spectator which resides server side and receives in game messages. //============================================================================= class UTReporterSpectator expands MessagingSpectator; // Our master controller var UTReporterController Link; // Literal and colour information var localized string CommaText; var string TeamRed; var string TeamGreen; var string TeamBlue; var string TeamGold; var string BaseIRCColor; var string NoTeamColor; var string IRCBoldToggle; var PlayerReplicationInfo Ordered[32]; //============================================================================= // Message formating routines //============================================================================= function string GetTeamColor(byte Team) { switch(Team) { case 0: return TeamRed; break; case 1: return TeamBlue; break; case 2: return TeamGreen; break; case 3: return TeamGold; break; case 255: return NoTeamColor; default: return ""; break; } } function string GetFlagColor(byte Team) { switch(Team) { case 0: return "00,04!99,99"; break; case 1: return "00,12!99,99"; break; case 2: return "00,03!99,99"; break; case 3: return "00,14!99,99"; break; default: return ""; break; } } function String FormatMessage(PlayerReplicationInfo PRI, coerce String Text, name Type) { local String Message; // Where a player name is present on a Say message type, prefix message with "PlayerName: " in persons team color if (PRI != None) { if (PRI.HasFlag != None) { Message = GetFlagColor(CTFFlag(PRI.HasFlag).Team)$GetTeamColor(PRI.Team)$PRI.PlayerName$": "$BaseIRCColor$Text; } else { Message = GetTeamColor(PRI.Team)$PRI.PlayerName$": "$BaseIRCColor$Text; } } else { Message = BaseIRCColor$Text; } return Message; } function string TwoDigitString(int Num) { if ( Num < 10 ) return "0"$Num; else return string(Num); } //============================================================================= // Received message functions //============================================================================= function ClientMessage( coerce string S, optional name Type, optional bool bBeep ) { // System messages, joins etc etc etc Link.BroadcastReporterMessage(BaseIRCColor$S, 2); } function TeamMessage( PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { // Say messages Link.BroadcastReporterMessage(FormatMessage(PRI, S, Type), 3); } function ClientVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { local String S; local byte RepMsgType; S = GetClientVoiceMessageString(Sender, Recipient, messagetype, messageID, RepMsgType); Link.BroadcastReporterMessage(FormatMessage(Sender, S, messagetype), RepMsgType); } function ReceiveLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string PRI_1_PlayerName; local string PRI_2_PlayerName; local string S; local int i; local GameReplicationInfo GRI; local TournamentGameReplicationInfo TGRI; local int Hours, Minutes, Seconds; local bool bGameOver; GRI = Level.Game.GameReplicationInfo; TGRI = TournamentGameReplicationInfo(Level.Game.GameReplicationInfo); bGameOver = False; if (RelatedPRI_1 != None) { PRI_1_PlayerName = RelatedPRI_1.PlayerName; //PRI_1 = RelatedPRI_1; if (RelatedPRI_1.HasFlag == None) { RelatedPRI_1.PlayerName = GetTeamColor(RelatedPRI_1.Team)$RelatedPRI_1.PlayerName$BaseIRCColor; } else { RelatedPRI_1.PlayerName = GetFlagColor(CTFFlag(RelatedPRI_1.HasFlag).Team)$GetTeamColor(RelatedPRI_1.Team)$RelatedPRI_1.PlayerName$BaseIRCColor; } } if (RelatedPRI_2 != None) { PRI_2_PlayerName = RelatedPRI_2.PlayerName; //PRI_2 = RelatedPRI_2; //RelatedPRI_2.PlayerName = GetTeamColor(RelatedPRI_2.Team)$RelatedPRI_2.PlayerName$BaseIRCColor; if (RelatedPRI_2.HasFlag == None) { RelatedPRI_2.PlayerName = GetTeamColor(RelatedPRI_2.Team)$RelatedPRI_2.PlayerName$BaseIRCColor; } else { RelatedPRI_2.PlayerName = GetFlagColor(CTFFlag(RelatedPRI_2.HasFlag).Team)$GetTeamColor(RelatedPRI_2.Team)$RelatedPRI_2.PlayerName$BaseIRCColor; } } if (!ClassIsChildOf(Message, class'BotPack.ControlPointMessage')) { Link.BroadcastReporterMessage(BaseIRCColor$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject), 2); } else { if (Switch > -1) { S = GetTeamColor(Switch); } Link.BroadcastReporterMessage(IRCBoldToggle$S$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject), 2); } if (RelatedPRI_1 != None) { RelatedPRI_1.PlayerName = PRI_1_PlayerName; } if (RelatedPRI_2 != None) { RelatedPRI_2.PlayerName = PRI_2_PlayerName; } // Now interpret message and identify any special game specific information that may need broadcasting if (ClassIsChildOf(Message, class'BotPack.CTFMessage')) { if (Switch == 0) { for ( i=0; i Ordered[Max].Score ) Max = J; else if ((Ordered[J].Score == Ordered[Max].Score) && (Ordered[J].Deaths < Ordered[Max].Deaths)) Max = J; else if ((Ordered[J].Score == Ordered[Max].Score) && (Ordered[J].Deaths == Ordered[Max].Deaths) && (Ordered[J].PlayerID < Ordered[Max].Score)) Max = J; } TempPRI = Ordered[Max]; Ordered[Max] = Ordered[I]; Ordered[I] = TempPRI; } } function DoScore(GameReplicationInfo GRI) { if (GRI != None) { // Determine the game type switch(GRI.GameClass) { case "BotPack.CTFGame": CTFScoreLine(False); break; case "CarryTFv102.CarryTFCTFGame": CTFScoreLine(False); break; case "BotPack.DeathMatchPlus": DeathScoreline(False, None); break; case "BotPack.TeamGamePlus": TeamGameDMScoreLine(False); break; case "BotPack.Domination": DOMScoreline(False); break; } ChangeTimer(); } } state NormalSpeccy { function Timer() { local GameReplicationInfo GRI; local TournamentGameReplicationInfo TGRI; // Do timed score updates GRI = Level.Game.GameReplicationInfo; TGRI = TournamentGameReplicationInfo(Level.Game.GameReplicationInfo); if (TGRI != None) { if((TGRI.TimeLimit != TGRI.RemainingTime/60) || (TGRI.TimeLimit == 0)) { DoScore(GRI); } } } Begin: if (Level.Game.bTeamGame) { if (Link.Config.RedTeamName != "") TeamGamePlus(Level.Game).Teams[0].TeamName = Link.Config.RedTeamName; if (Link.Config.BlueTeamName != "") TeamGamePlus(Level.Game).Teams[1].TeamName = Link.Config.BlueTeamName; if (Link.Config.GreenTeamName != "") TeamGamePlus(Level.Game).Teams[2].TeamName = Link.Config.GreenTeamName; if (Link.Config.GoldTeamName != "") TeamGamePlus(Level.Game).Teams[3].TeamName = Link.Config.GoldTeamName; } } state GameEnded { ignores SeePlayer, HearNoise, KilledBy, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, Falling, TakeDamage, PainTimer, Died, Suicide; Begin: SetTimer(0, False); GameHasEnded(); //Link.IRCLink.DisconnectReason = "Game has finished"; //Link.IRCLink.DestroyLink(); } ^³//============================================================================= // Reporter.UTReporterIRCLink // // Ver: 2.2.1 - Sep 5, 2001 // // ©2001 John Malia (aka TheFury) & WebSlinger // // Web: www.planetunreal.com/utreporter // Email: webslinger@planetunreal.com // // Description: // Link between UT and IRC. Note that a lot of this code has been pasted from // the existing UBrowserBufferedIRCLinkclass. However, that classes penchant to // report information back to the GUI just doesn't fit our requirement. So the // code has been chopped about a little :) // //============================================================================= class UTReporterIRCLink expands UBrowserBufferedTCPLink; var IpAddr ServerIpAddr; var int Timeout; var string BaseNick; var int NickCounter; var bool IsRejoinTimer; var localized string FullName; var localized string InvalidAddressText; var localized string ErrorBindingText; var localized string ResolveFailedText; var localized string ConnectedText; var localized string ConnectingToText; var localized string TimeOutError; var localized string InternalErrorText; var UTReporterController OwningController; var UTReporterConfig Config; var config string UserIdent; var string DisconnectReason; var string VersionString; var string BaseIRCColor; var string IRCBoldToggle; var string StartMsg; var PlayerReplicationInfo Ordered[32]; var bool bTimeout; var bool Mute; function PostBeginPlay() { Super.PostBeginPlay(); Disable('Tick'); } // *** Connect - Open IRC connection using specified parameters function Connect(UTReporterController InController, UTReporterConfig InConfig) { local int i; if (InController == None) { return; } // Save reference to the owning ReporterController OwningController = InController; Config = InConfig; // Generate an Ident if(UserIdent == "") { UserIdent = "utr"; for(i = 0; i < 4; i++) UserIdent = UserIdent $ Chr((Rand(10) + 48)); Log("Created new UserIdent: "$UserIdent); } BaseNick = Config.ReporterNick; ResetBuffer(); ServerIpAddr.Port = Config.ServerPort; IsRejoinTimer = False; SetTimer(Timeout, False); Resolve(Config.ServerAddr); return; } // *** Misc string functions function string ChopLeft(string Text) { while(Text != "" && InStr(": !", Left(Text, 1)) != -1) Text = Mid(Text, 1); return Text; } function string RemoveNickPrefix(string Nick) { while(Nick != "" && InStr(":@+", Left(Nick, 1)) != -1) Nick = Mid(Nick, 1); return Nick; } function string Chop(string Text) { while(Text != "" && InStr(": !", Left(Text, 1)) != -1) Text = Mid(Text, 1); while(Text != "" && InStr(": !", Right(Text, 1)) != -1) Text = Left(Text, Len(Text)-1); return Text; } // *** Receive server IP / DNS resolve message function Resolved(IpAddr Addr) { // Set the address ServerIpAddr.Addr = Addr.Addr; // Handle failure. if(ServerIpAddr.Addr == 0) { Log("UTReporterIRCLink: Failed to resolve IRC server address"); return; } // Bind the local port. if(BindPort() == 0) { Log("UTReporterIRCLink: Failed to resolve IRC server port"); return; } // Display success message. Log( "UTReporter: Broadcasting to IRC server is "$Config.ServerAddr$":"$ServerIpAddr.Port ); Open( ServerIpAddr ); } // *** Received a close message event Closed() { //if (OwningController != None) // OwningController.ReporterIRCStateChange(False); } // *** Host resolution failure function ResolveFailed() { Log("UTReporterIRCLink: Failed to resolve IRC server"); } // *** Timeout timer event Timer() { if (!IsRejoinTimer) { if (bTimeOut) { // Do reconnect // how ?!?!?! argh return; } else { // Send IRC commands of connect if (Config.IRCCommand1 != "") SendBufferedData(Config.IRCCommand1$CRLF); if (Config.IRCCommand2 != "") SendBufferedData(Config.IRCCommand2$CRLF); if (Config.IRCCommand3 != "") SendBufferedData(Config.IRCCommand3$CRLF); UTShowGameStartInfo(""); if (Config.CommentaryEnabled) { //SendBufferedData("PRIVMSG "$Config.CommentaryChannel$" :"$IRCBoldToggle$"UT Reporter broadcasting for: "$Level.Game.GameReplicationInfo.ServerName$BaseIRCColor$IRCBoldToggle$CRLF); } if (Config.ScorelineEnabled) { //SendBufferedData("PRIVMSG "$Config.ScorelineChannel$" :"$IRCBoldToggle$"UT Reporter broadcasting for: "$Level.Game.GameReplicationInfo.ServerName$BaseIRCColor$IRCBoldToggle$CRLF); } bTimeOut = True; SetTimer(Timeout, False); } } else { SetTimer(0, False); Connect(OwningController, Config); } } // *** IRC link open event Opened() { SetTimer(0, False); Enable('Tick'); GotoState('LoggingIn'); } function Tick(float DeltaTime) { local string Line; DoBufferQueueIO(); if(ReadBufferedLine(Line)) ProcessInput(Line); } function SendMessage(string Text, bool bIsScoreline) { if (!Mute) { if (bIsScoreline) SendBufferedData("PRIVMSG "$Config.ScorelineChannel$" :"$BaseIRCColor$Text$CRLF); else SendBufferedData("PRIVMSG "$Config.CommentaryChannel$" :"$BaseIRCColor$Text$CRLF); } } function SendScoreLineMessage(string Text) { if (!Mute) SendBufferedData("PRIVMSG "$Config.ScorelineChannel$" :"$Text$CRLF); } function SendChannelAction(string Channel, string Text) { SendBufferedData("PRIVMSG "$Channel$" :"$Chr(1)$"ACTION "$"ACTION!!!"$Text$Chr(1)$CRLF); } function ProcessInput(string Line) { // Respond to PING if(Left(Line, 5) == "PING ") SendBufferedData("PONG "$Mid(Line, 5)$CRLF); } state LoggingIn { function ProcessInput(string Line) { local string Temp; local string Temp2; local string TempNick; local int i; Global.ProcessInput(Line); Temp = ParseDelimited(Line, " ", 2); //if(ParseDelimited(Line, " ", 1)== "ERROR") // DoSomething???? // Handle nick already in use on connect... if(Temp == "433") { Config.ReporterNick = BaseNick$string(NickCounter); Config.SaveConfig(); NickCounter = NickCounter++; SendBufferedData("NICK "$Config.ReporterNick$CRLF); return; } else if(Int(Temp) != 0) { GotoState('LoggedIn'); } if(Temp == "NICK") { Temp2 = ParseDelimited(Line, "~@", 2); if (Temp2 ~= UserIdent) { Temp2 = ParseDelimited(Line, ":", 3, True); Config.ReporterNick = Temp2; Config.SaveConfig(); } } } Begin: SendBufferedData("USER "$UserIdent$" localhost "$Config.ServerAddr$" :"$FullName$CRLF); SendBufferedData("NICK "$Config.ReporterNick$CRLF); } state LoggedIn { function ProcessInput(string Line) { local string OrigNick, OrigNickAddr, DestNick, UTCommand, UTParam, UTPassword; local string Temp, Temp2, Temp3; local bool bAddModifier; local int i; local string Command; local string OrigChannel; local string disconnectmsg; disconnectmsg = "ERROR :Closing Link"; Global.ProcessInput(Line); // Check to see if this was a disconnect if (Left(Line, Len(disconnectmsg)) ~= disconnectmsg) { // Delay for 10 seconds... ensure we dont flood and get k-lined. IsRejoinTimer = True; SetTimer(20, True); return; } Command = ParseDelimited(Line, " ", 2); OrigNick = ParseDelimited(Line, ":!", 2); OrigNickAddr = ParseDelimited(Line, "! ", 2); if(Command == "NICK") { Temp = ParseDelimited(Line, "~@", 2); if (Temp ~= UserIdent) { Temp2 = ParseDelimited(Line, ":", 3, True); Config.ReporterNick = Temp2; Config.SaveConfig(); } } if(Command == "JOIN") { Temp = ParseDelimited(Line, ":!", 2); if(Temp != Config.ReporterNick) { UTShowGameStartInfo(Temp); //SendBufferedData("NOTICE "$Temp$" :Welcome "$Temp$"!"$CRLF); } } // Check msgs that are targetted for the reporter if (Command == "PRIVMSG") { DestNick = Chop(ParseDelimited(Line, " ", 3)); UTPassword = ChopLeft(ParseDelimited(Line, " ", 4, False)); UTCommand = ChopLeft(ParseDelimited(Line, " ", 5, False)); UTParam = ChopLeft(ParseDelimited(Line, " ", 6, True)); if (RemoveNickPrefix(DestNick) ~= Config.ReporterNick) { // This message was directed to the reporter if (UTCommand ~= "serveraddr") { UTServerAddr(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "serverport") { UTServerPort(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "comchnl") { UTSetCommChnl(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "comon") { UTSetCommChnlEnable(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "scorechnl") { UTSetScoreChnl(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "scoreon") { UTSetScoreChnlEnable(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "repname") { UTSetReporterNick(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "adminpass") { UTChangeAdminPass(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "reppass") { UTChangeReporterPass(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "comlvl") { UTSetCommLevel(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "updperiod") { UTSetScorePeriod(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "leaguename") { UTSetLeagueName(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "redteamname") { UTSetRedTeamName(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "blueteamname") { UTSetBlueTeamName(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "greenteamname") { UTSetGreenTeamName(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "goldteamname") { UTSetGoldTeamName(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "resetteamnames") { UTResetTeamNames(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "irccommand1") { UTChangeIRCCommand1(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "irccommand2") { UTChangeIRCCommand2(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "irccommand3") { UTChangeIRCCommand3(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "irccom") { UTSendIRCCommand(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "irccomon") { UTIrcComEnabled(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "showconfig") { UTShowConfig(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "showscore") { UTShowScore(OrigNick, UTPassword); } else if (UTCommand ~= "showteam") { UTShowTeamInfo(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "showgameinfo") { UTShowGameInfo(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "msg") { UTSendMsg(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "ver") { UTVersion(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "mute") { UTMute(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "startmute") { UTMuteOnStart(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "gameadvert") { UTGameAdvert(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "gameadvertdur") { UTGameAdvertDur(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "gameadvertfreq") { UTGameAdvertFreq(OrigNick, UTPassword, UTParam); } else if (UTCommand ~= "speclist") { UTSpecList(OrigNick, UTPassword, UTParam); } } } else if(Command == "433") { Config.ReporterNick = BaseNick$string(NickCounter); Config.SaveConfig(); NickCounter = NickCounter++; SendBufferedData("NICK "$Config.ReporterNick$CRLF); return; } else if (Command == "376") { if (Config.CommentaryEnabled) { JoinChannel(Config.CommentaryChannel); } if (Config.ScorelineEnabled) { JoinChannel(Config.ScorelineChannel); } } else if(Command == "KICK") { OrigChannel = ParseDelimited(Line, " ", 3); // FIXME: handle multiple kicks in a single message //Log(Line); //Log("Param:"$UTParam); //SystemPage.KickUser(Chop(ParseDelimited(Line, " ", 3)), Chop(ParseDelimited(Line, " ", 4)), ParseDelimited(Line, ":!", 2), ChopLeft(ParseDelimited(Line, ":", 3, True))); } } Begin: // Alter functionality of timer bTimeOut = False; SetTimer(10, True); } function JoinChannel(string Channel) { if(Left(Channel, 1) == "#") SendBufferedData("JOIN "$Channel$CRLF); } function PartChannel(string Channel) { if(Left(Channel, 1) == "#") SendBufferedData("PART "$Channel$CRLF); } function DestroyLink() { if(IsConnected()) { SendBufferedData("QUIT :"$"Reporter going offline"$CRLF); //Close(); } //else // Destroy(); } function UTServerAddr(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { Config.ServerAddr = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Server addr changed to: "$Config.ServerAddr); } } function UTServerPort(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { Config.ServerPort = int(UTParam); Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Server port changed to: "$Config.ServerPort); } } function UTChangeAdminPass(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if (UTParam == "") { UTSendNotice(OrigNick, "UTR - Inavlid password, please enter a valid password"); return; } UTParam = ParseDelimited(UTParam, " ", 1); Config.AdminPassword = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Admin password changed to: "$Config.AdminPassword); } } function UTChangeReporterPass(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { UTParam = ParseDelimited(UTParam, " ", 1); Config.ReporterPassword = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Reporter password changed to: "$Config.ReporterPassword); } } function UTChangeIRCCommand1(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { Config.IRCCommand1 = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - IRC Command1 changed to: "$Config.IRCCommand1); } } function UTChangeIRCCommand2(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { Config.IRCCommand2 = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - IRC Command2 changed to: "$Config.IRCCommand2); } } function UTChangeIRCCommand3(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { Config.IRCCommand3 = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - IRC Command3 changed to: "$Config.IRCCommand3); } } function UTSendMsg(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { OwningController.SendMessageToUT(OrigNick, UTParam); if (Config.CommentaryEnabled) SendBufferedData("PRIVMSG "$Config.CommentaryChannel$" :"$BaseIRCColor$OrigNick$": "$UTParam$CRLF); } } function UTSetCommChnl(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if(Left(UTParam, 1) == "#") { UTParam = ParseDelimited(UTParam, " ", 1); if (Caps(UTParam) == Caps(ParseDelimited(Config.CommentaryChannel, " ", 1))) { return; } if (Config.CommentaryEnabled) { if (Config.ScorelineEnabled) { if (Config.CommentaryChannel != Config.ScorelineChannel) { PartChannel(Config.CommentaryChannel); } } else PartChannel(Config.CommentaryChannel); JoinChannel(UTParam); } Config.CommentaryChannel = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Commentary channel changed to: "$Config.CommentaryChannel); } else UTSendNotice(OrigNick, "UTR - Invalid channel name specified"); } } function UTSetCommChnlEnable(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if ((UTParam == "1") || (UTParam ~= "On")) { Config.CommentaryEnabled = True; Config.SaveConfig(); JoinChannel(Config.CommentaryChannel); UTSendNotice(OrigNick, "UTR - Commentary channel enabled: "$Config.CommentaryChannel); } else { Config.CommentaryEnabled = False; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Commentary channel disabled: "$Config.CommentaryChannel); if (Config.ScorelineEnabled) { if (Config.ScorelineChannel != Config.CommentaryChannel) PartChannel(Config.CommentaryChannel); } else PartChannel(Config.CommentaryChannel); } } } function UTSetScoreChnl(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if(Left(UTParam, 1) == "#") { UTParam = ParseDelimited(UTParam, " ", 1); if (Caps(UTParam) == Caps(ParseDelimited(Config.ScorelineChannel, " ", 1))) { return; } if (Config.ScorelineEnabled) { if (Config.CommentaryEnabled) { if (Config.CommentaryChannel != Config.ScorelineChannel) { PartChannel(Config.ScorelineChannel); } } else PartChannel(Config.ScorelineChannel); JoinChannel(UTParam); } Config.ScorelineChannel = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Scoreline channel changed to: "$Config.ScorelineChannel); } else UTSendNotice(OrigNick, "UTR - Invalid channel name specified"); } } function UTSetScoreChnlEnable(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if ((UTParam == "1") || (UTParam ~= "On")) { Config.ScorelineEnabled = True; Config.SaveConfig(); JoinChannel(Config.ScorelineChannel); UTSendNotice(OrigNick, "UTR - Scoreline channel enabled: "$Config.ScorelineChannel); } else { Config.ScorelineEnabled = False; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Scoreline channel disabled: "$Config.ScorelineChannel); if (Config.CommentaryEnabled) { if (Config.ScorelineChannel != Config.CommentaryChannel) PartChannel(Config.ScorelineChannel); } else PartChannel(Config.ScorelineChannel); } } } function UTSetReporterNick(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { UTParam = ParseDelimited(UTParam, " ", 1); BaseNick = UTParam; Config.ReporterNick = BaseNick; Config.SaveConfig(); NickCounter = 0; SendBufferedData("NICK "$Config.ReporterNick$CRLF); } } function UTSetCommLevel(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if ((int(UTParam) < 0) || (int(UTParam) > 5)) { UTSendNotice(OrigNick, "UTR - Valid comm levels are 0 to 5"); return; } Config.CommentaryLevel = int(UTParam); Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Commentary level set to: "$Config.CommentaryLevel); } } function UTSetScorePeriod(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if (int(UTParam) == 0) { } else if (int(UTParam) < 30) UTParam = "30"; Config.ScoreUpdatePeriod = int(UTParam); Config.SaveConfig(); OwningController.Spectator.ChangeTimer(); UTSendNotice(OrigNick, "UTR - Score update period changed to: "$Config.ScoreUpdatePeriod$"s"); } } function UTSetLeagueName(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { Config.LeagueName = UTParam; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - League name changed to: "$Config.LeagueName); } } function UTSetRedTeamName(string OrigNick, string Password, string UTParam) { local class TempClass; if (UTCheckPassword(OrigNick, Password, 1)) { TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); if (UTParam == "") { TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); UTParam = TempClass.default.TeamColor[0]; } Config.RedTeamName = UTParam; Config.SaveConfig(); if (Level.Game.bTeamGame) TeamGamePlus(Level.Game).Teams[0].TeamName = UTParam; UTSendNotice(OrigNick, "UTR - "$TempClass.default.TeamColor[0]$" team name changed to: "$Config.RedTeamName); } } function UTSetBlueTeamName(string OrigNick, string Password, string UTParam) { local class TempClass; TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); if (UTCheckPassword(OrigNick, Password, 1)) { if (UTParam == "") { UTParam = TempClass.default.TeamColor[1]; } Config.BlueTeamName = UTParam; Config.SaveConfig(); if (Level.Game.bTeamGame) TeamGamePlus(Level.Game).Teams[1].TeamName = UTParam; UTSendNotice(OrigNick, "UTR - "$TempClass.default.TeamColor[1]$" team name changed to: "$Config.BlueTeamName); } } function UTSetGreenTeamName(string OrigNick, string Password, string UTParam) { local class TempClass; TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); if (UTCheckPassword(OrigNick, Password, 1)) { if (UTParam == "") { UTParam = TempClass.default.TeamColor[2]; } Config.GreenTeamName = UTParam; Config.SaveConfig(); if (Level.Game.bTeamGame) TeamGamePlus(Level.Game).Teams[2].TeamName = UTParam; UTSendNotice(OrigNick, "UTR - "$TempClass.default.TeamColor[2]$" team name changed to: "$Config.GreenTeamName); } } function UTSetGoldTeamName(string OrigNick, string Password, string UTParam) { local class TempClass; TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); if (UTCheckPassword(OrigNick, Password, 1)) { if (UTParam == "") { UTParam = TempClass.default.TeamColor[3]; } Config.GoldTeamName = UTParam; Config.SaveConfig(); if (Level.Game.bTeamGame) TeamGamePlus(Level.Game).Teams[3].TeamName = UTParam; UTSendNotice(OrigNick, "UTR - "$TempClass.default.TeamColor[3]$" team name changed to: "$Config.GoldTeamName); } } function UTResetTeamNames(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { UTSetRedTeamName("", Password, ""); UTSetBlueTeamName("", Password, ""); UTSetGreenTeamName("", Password, ""); UTSetGoldTeamName("", Password, ""); UTSendNotice(OrigNick, "UTR - Team names reset to UT defaults"); } } function UTSendIRCCommand(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if (Config.EnableIRCCom == True) { SendBufferedData(UTParam$CRLF); UTSendNotice(OrigNick, "UTR - IRC Command sent: "$UTParam); } else { UTSendNotice(OrigNick, "UTR - Interactive IRC commands have been disabled"); } } } function UTIrcComEnabled(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if ((UTParam == "1") || (UTParam ~= "On")) { Config.EnableIRCCom = True; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Interactive IRC commands enabled"); } else { Config.EnableIRCCom = False; Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - Interactive IRC commands disabled"); } } } function UTShowConfig(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { UTSendNotice(OrigNick, "UTR - broadcasting to: "$Config.ServerAddr); if (Config.CommentaryEnabled) UTSendNotice(OrigNick, "UTR - commentary channel enabled"); else UTSendNotice(OrigNick, "UTR - commentary channel disabled"); UTSendNotice(OrigNick, "UTR - commentary channel: "$Config.CommentaryChannel); UTSendNotice(OrigNick, "UTR - commentary level: "$Config.CommentaryLevel); if (Config.ScorelineEnabled) UTSendNotice(OrigNick, "UTR - scoreline channel enabled"); else UTSendNotice(OrigNick, "UTR - Scoreline channel disabled"); UTSendNotice(OrigNick, "UTR - scoreline channel: "$Config.ScorelineChannel); UTSendNotice(OrigNick, "UTR - admin password: "$Config.AdminPassword); UTSendNotice(OrigNick, "UTR - reporter password: "$Config.ReporterPassword); UTSendNotice(OrigNick, "UTR - score update period: "$Config.ScoreUpdatePeriod); UTSendNotice(OrigNick, "UTR - league name: "$Config.LeagueName); UTSendNotice(OrigNick, "UTR - team names: "$"Red - "$Config.RedTeamName$" Blue - "$Config.BlueTeamName$" Green - "$Config.GreenTeamName$" Gold - "$Config.GoldTeamName); UTSendNotice(OrigNick, "UTR - IRC command 1: "$Config.IRCCommand1); UTSendNotice(OrigNick, "UTR - IRC command 2: "$Config.IRCCommand2); UTSendNotice(OrigNick, "UTR - IRC command 3: "$Config.IRCCommand3); } } function UTShowScore(string OrigNick, string Password) { local GameReplicationInfo GRI; if (UTCheckPassword(OrigNick, Password, 2)) { GRI = Level.Game.GameReplicationInfo; if (GRI != None) { OwningController.Spectator.DoScore(GRI); } } } function UTShowGameStartInfo(string sNick) { local string S; local string temp; local GameReplicationInfo GRI; local TournamentGameReplicationInfo TGRI; local int i; GRI = Level.Game.GameReplicationInfo; S = IRCBoldToggle; S = S$"Welcome! "; // Determine if we have a custom league game if (Config.LeagueName != "") S = S$" "$Config.LeagueName$ " "; else S = S$" "$GRI.ServerName$" - "$GRI.GameName; if (Level.Game.bTeamGame) { TGRI = TournamentGameReplicationInfo(GRI); S = S$" | "; for ( i=0; i TempClass; if (UTCheckPassword(OrigNick, Password, 2)) { if (Level.Game.bTeamGame) { TGRI = TournamentGameReplicationInfo(Level.Game.GameReplicationInfo); TempClass = class(DynamicLoadObject("Botpack.TeamGamePlus", class'Class')); if (Caps(UTParam) == Caps(TGRI.Teams[0].TeamName)) ViewTeam = 0; else if (Caps(UTParam) ~= Caps(TGRI.Teams[1].TeamName)) ViewTeam = 1; else if (Caps(UTParam) ~= Caps(TGRI.Teams[2].TeamName)) ViewTeam = 2; else if (Caps(UTParam) ~= Caps(TGRI.Teams[3].TeamName)) ViewTeam = 3; else { ViewTeam = int(UTParam); } if (ViewTeam < TeamGamePlus(Level.Game).MaxTeams) { for (i = 0; i 10) UTParam = "10"; Config.AdvertDuration = int(UTParam); Config.SaveConfig(); UTSendNotice(OrigNick, "UTR - IRC in game adverts duration: "$UTParam$" s"); } } function UTGameAdvertFreq(string OrigNick, string Password, string UTParam) { if (UTCheckPassword(OrigNick, Password, 1)) { if (int(UTParam) < 30) UTParam = "30"; Config.AdvertFreq = int(UTParam); Config.SaveConfig(); OwningController.UpdateAdvertTimer(int(UTParam)); UTSendNotice(OrigNick, "UTR - IRC in game adverts frequency: "$UTParam$" s"); } } function UTSpecList(string OrigNick, string Password, string UTParam) { local GameReplicationInfo GRI; if (UTCheckPassword(OrigNick, Password, 2)) { GRI = Level.Game.GameReplicationInfo; if (GRI != None) { OwningController.Spectator.DoSpecList(); } } } function SortScores(int N) { local int I, J, Max; local PlayerReplicationInfo TempPRI; for ( I=0; I Ordered[Max].Score ) Max = J; else if ((Ordered[J].Score == Ordered[Max].Score) && (Ordered[J].Deaths < Ordered[Max].Deaths)) Max = J; else if ((Ordered[J].Score == Ordered[Max].Score) && (Ordered[J].Deaths == Ordered[Max].Deaths) && (Ordered[J].PlayerID < Ordered[Max].Score)) Max = J; } TempPRI = Ordered[Max]; Ordered[Max] = Ordered[I]; Ordered[I] = TempPRI; } } function UTSendNotice(string DestNick, string NoticeMsg) { if (DestNick != "") SendBufferedData("NOTICE "$DestNick$" :"$BaseIRCColor$NoticeMsg$CRLF); } function bool UTCheckPassword(string OrigNick, string Password, int ReqLevel) { local int Temp; if (Password ~= Config.AdminPassword) Temp = 1; else if (Password ~= Config.ReporterPassword) Temp = 2; else Temp = 99; if (Temp > ReqLevel) { UTSendNotice(OrigNick, "Invalid password or incorrect password specified for this action"); return False; } else return True; } GW//============================================================================= // Reporter.UTReporterController // // Ver: 2.2.1 - Sep 5, 2001 // // ©2001 John Malia (aka TheFury) & WebSlinger // // Web: www.planetunreal.com/utreporter // Email: webslinger@planetunreal.com // // Description: // Persistant Reporter controlling class. Acts as the interface between the config // screen and the Reporter spectator. // //============================================================================= class UTReporterController expands Actor; // IRC link var UTReporterIRCLink IRCLink; // Config and owner var UTReporterConfig Config; var bool bInitialized; // The reporter persistant link, level specific spectator and config var UTReporterSpectator Spectator; event PreBeginPlay() { //local UTReporterController AnActor; local Actor AnActor; if ( bInitialized ) return; bInitialized = True; // Get the reporter config Config = Spawn(class'Reporter.UTReporterConfig'); //Level.Game. if (Config.Enabled) { // No link present, spawn one on the entry level so it is persistant Enabled(True); } } function SendMessageToUT(string Nick, string Message) { local Pawn APawn; foreach Level.Game.AllActors(class'Pawn', APawn) { if (APawn.bIsPlayer == True) { APawn.ClientMessage("(IRC) "$Nick$": "$Message); } } } function Enabled(bool bEnable) { if (bEnable) { //if (Link == None) // Link = Level.Game.Spawn(class'Reporter.UTReporterController'); //if (Link == None) // return; // something is b0rked // Enable the link, let it connect to IRC StartBroadcast(Level); UTReporterAddSpectator(); Spectator.Link.IRCLink.Mute = Config.MuteOnStart; Config.Enabled = True; Config.SaveConfig(); SetTimer(Config.AdvertFreq,true); } else { SetTimer(0,true); EndBroadcast(); //UTReporterDeleteSpectator(); Config.Enabled = False; Config.SaveConfig(); } } function UTReporterAddSpectator() { if (Spectator == None) Spectator = Level.Spawn(class'Reporter.UTReporterSpectator'); Spectator.GotoState('NormalSpeccy'); Spectator.Engage(Self); Level.Game.ChangeName( Spectator, "UT Reporter", false ); //BroadcastMessage( P.PlayerReplicationInfo.PlayerName@"gave up administrator abilities." ); } function UTReporterDeleteSpectator() { if (Spectator != None) { Spectator.Disengage(); Spectator.Destroy(); Spectator = None; } } event Timer() { if ((Config.Enabled) && (Config.InGameAdvert)) { Advert(); } } event Advert() { local Pawn P; local name Type; local bool bBeep; local string msg; local string msg2; bBeep = False; Type = 'Event'; Msg = "UTR online to "$Config.ServerAddr$", channels: "; Msg2 = ""; if (Config.CommentaryEnabled) { Msg2 = Msg2$Config.CommentaryChannel$" "; } if (Config.ScorelineEnabled) { Msg2 = Msg2$Config.ScorelineChannel; } if ( Level.Game.AllowsBroadcast(self, Len(Msg)) ) { for( P=Level.PawnList; P!=None; P=P.nextPawn ) { if (P.IsA('PlayerPawn')) { PlayerPawn(P).ClearProgressMessages(); PlayerPawn(P).SetProgressMessage(Mid(Msg,0),0); PlayerPawn(P).SetProgressMessage(Mid(Msg2,0),1); PlayerPawn(P).SetProgressColor(Config.AdvertColour,0); PlayerPawn(P).SetProgressTime(Config.AdvertDuration); } } } } function UpdateAdvertTimer(int Freq) { SetTimer(Freq, True); } // ************************************************************************** // *** StartBroadcast - initiate the broadcast function bool StartBroadcast(LevelInfo InEntryLevel) { // Validate parameters // Now validate config items Config.Validate(); // Now create the IRCLink if (IRCLink == None) IRCLink = Spawn(class'Reporter.UTReporterIRCLink'); //IRCLink = InEntryLevel.Spawn(class'Reporter.UTReporterIRCLink'); if (IRCLink == None) return False; // Let the IRCLink form the connection to the IRC server IRCLink.Connect(Self, Config); if (Config.ScorelineEnabled) { IRCLink.JoinChannel(Config.ScorelineChannel); } if (Config.CommentaryEnabled) { IRCLink.JoinChannel(Config.CommentaryChannel); } return True; } // *** EndBroadcast - close down the broadcast function EndBroadcast() { if (IRCLink != None) { IRCLink.DestroyLink(); //IRClink.Destroy(); } } // *** BroadcastMessage - entry point for all messages that are to be broadcast to IRC. Note that there is also a message priority, // *** this is used to filter messages in case of IRC flooding. function BroadcastReporterMessage(string InMessage, int MessageType) { local bool bSentToScore; bSentToScore = False; if (MessageType == 1) { // For scores always broadcast to scoreline channel if on if (Config.ScorelineEnabled) { IRCLink.SendMessage(InMessage, True); bSentToScore = True; } } if (Config.CommentaryEnabled) { if (Config.CommentaryLevel >= MessageType) { if (MessageType == 1) { if ((bSentToScore) && (Config.CommentaryChannel == Config.ScorelineChannel)) return; } IRCLink.SendMessage(InMessage, False); } } } Xb;NQqobz&&{bbpUTR - League name changed to: &  r r rM rX pż’’’w p’’’’} pž’’’b pž’’’f pü’’’g p’’’’q pž’’’j pż’’’v Fõ’’’i qū’’’{ p’’’’F Fł’’’Z pķ’’’W pü’’’y r| pž’’’c p’’’’S p’’’’p pž’’’g qō’’’O p’’’’R rp pę’’’P }ļ’’’d Fģ’’’g }å’’’M Fī’’’U p’’’’o }ų’’’F pü’’’e qū’’’t qū’’’A Nų’’’D }÷’’’T pž’’’s S÷’’’X pž’’’k F÷’’’U pü’’’f Rģ’’’W pü’’’^ rT pü’’’L pż’’’u pŅ’’’| qą’’’_ p’’’’ p’’’’@ Nų’’’U Fų’’’v N÷’’’] p’’’’~ Tų’’’Q Nļ’’’D Sļ’’’b xĻ’’’x pž’’’R p’’’’T }é’’’K p’’’’m pü’’’o pü’’’l }ł’’’o Tų’’’k pž’’’d Sų’’’ FŠ’’’i TÓ’’’Q pż’’’M Fé’’’J p’’’’s }é’’’f qõ’’’# SÄ’’’y xą’’’t pž’’’N SÄ’’’z pŅ’’’H Sų’’’c R×’’’M pü’’’p SŽ’’’b SŽ’’’t Rų’’’j qõ’’’r }Ń’’’x FŃ’’’A ų’’’T q·’’’K Rų’’’Y pž’’’L Sī’’’[ }ō’’’_ }ō’’’S }é’’’P pž’’’S qŠ’’’t xą’’’q ą’’’p SŽ’’’[ qĆ’’’l Fł’’’K Fł’’’i qŁ’’’G F×’’’^ qĻ’’’[ q®’’’Y F×’’’f qĆ’’’A qŁ’’’v }ō’’’G sŁ’’’B qŁ’’’u qŁ’’’C qŁ’’’m q®’’’X qõ’’’k qŠ’’’K qĻ’’’\ Rõ’’’V qõ’’’% Sų’’’E qŁ’’’p pü’’’z pü’’’| F»’’’L pü’’’{ N÷’’’C Tł’’’q p’’’’N pü’’’x RŽ’’’w Ré’’’W Sé’’’b‹A|g}icƒci qƒ‹]Y ~ƒiWh e›_r8r†@ dʏ#mqʏcBʆ’H MĒ†’C ZĒ†’F gĒ†’G sĒ†³\ Ē†ä\ LȆŗ\ XȆŸ\ dČ•ŗZ qȆd ~ȏ~Jɏ#~ XɆf eɆĄ\ qɏGP~Ɇõ\ LŹ•šZ YŹ:PfŹ,PtŹ†` BĖR OĖ†:a \Ė^PiĖ†#g wĖägo,DĢQ sų†ĢC @ł†} MłPZł†#Z hł™ tł™c Aś†} Mśy Zś/ngś™a uś/Q Aū†\ Nū†’S Zū•Y fū†š\ rū•šh ū•` Kü•ŹY Xü•Ź` dü†:U qü•äZ ~ü†:H Kż†G@ Xż,Q dżGQ qż†GA ~ż†dN Kž"PXž†:G fž³Gurž†G @’ņhL’†G~ Z’†Z g’:Q t’•³Z A€™| M€]Y€&P g€†m t€•{ A†^a M†A Z)P g•ŸZ t† @‚†~ M‚†@ Z‚³/ng‚•^Z w‚†GH Dƒ†’e QƒHN^ƒ†,B lƒ†,A yƒ†,` F„•:U S„†,V _„™ąg l„†g y„†,@ F…†GJ S…•v `…•ŹZ m…†D y…•U F†•ĄZ R††C _††B l†šy††V G‡•õZ T‡•Z a‡äem‡ŸR{‡™F Iˆ†ņn Uˆŗiaˆ™G oˆ™cv |ˆ™E I‰†ŽG V‰¾Vb‰•b p‰†°\ |‰†fq IŠ†”G VŠ•/k bŠõnŠ†,C |ŠäI‹†:I W‹†:J d‹•ŗV q‹ä}~‹†:L LŒ†:M XŒ†GG dŒ^Q qŒŗ~Œ†¬G L†ĒN X†:K e•fZ r•šV “V KŽĄXŽ†u fŽšNsŽ³AøRO†’W ]†šG j†g` v• C³RP†ŻS ^•ąZ k•¤W w•J C‘ŗNP‘Ÿ^‘•H l‘¾_y‘†MG G’†4G T’†“G a’³„un’†„G |’†”G I“†˜G U“†,C a“•fO n“†,D {“† W H”™/] U”†œG a”†I m”† S y”P F•PS••/Z a•†,B n•ZP{•VPI–†Hn W–†G} c–† a p–†HN }–°o J—•Ds W—™s d—ęR q—a~—™w L˜†Õr Y˜\e˜•Z s˜†f\ ˜†ņp K™†ŠG X™†fN d™†×C q™†žC ~™^Kš†µG Yš†^Q eš†VM rš³4u~š†—C L›él Y›³Muf›†œC t›†›C Aœ†ŒC Nœ™žu [œ†’J gœ•žV sœ†;C @PM³“u[†”C iĀR v†›G CžX Ož†M \ž X hž†C už†‹C BŸ†ŽC OŸ†C \Ÿ†/\ iŸ/vŸ†čS D †/\ P Š G] /Rd”Qr”†+N @¢†6\ M¢™c Z¢™äf f¢†äW s¢†’a @£™Ąf M£†ĄW Z£™ŗf f£†ŗW s£†žN £†.S L¤™õf X¤†®l e¤†¤S q¤†¦l ~¤†ÖE J„Ź@ W„† C d„†/[ q„/n~„†õW L¦†ŌC X¦¾6Z e¦}r¦•Źe @§6aM§“6V [§ÆR h§•ÕT u§•fm B؆ŻC Oس^u\؆¬C j؆­C w؆’E D©†µC P©•ÕY ]©†©C j©³šuw©†MC EŖ†”C RŖ†£C _Ŗ†4C lŖ†;G yŖ†—G E«†×G Q«†³e ]«†žG i«†“C u«†³W B¬†„C O¬†ŒG \¬•Rh¬†’C v¬†oC C­†‹G P­†G \­§R h­†˜C u­•e B®•P O®†G \®@ h®†S u®† S BƆn OƆ’I \ƆŽS iƆžS vƆ©G C°†›S O°†$N \°†‹S h°† G u°†˜S A±†ŌS N±†”S [±†ŌG h±†oS t±†oG A²†­G M²†œS Y²†„S f²†­S s²†ŠC @³†£G M³†£S Y³†“S f³†$l s³†(N @“†ŠS L“†©S Y“†4S f“™+@ s“øYy “†’D Lµ†B Yµ†MS fµ~sµ†µS A¶†ÆC N¶†#H [¶ZQh¶†ZM v¶†#j B·†#l O·†×S [·†Q h·†B\ u·†R Bø†;S Oø>N\ø†S jø6\wø†ĢS E¹øIR¹†"M a¹†ĀC m¹†ĀS z¹PGŗQUŗ•¤s cŗ†én pŗ†#L }ŗVQJ»†#k X»†#G e»¾6Vq»†ŸC »†ŸS L¼†>\ Y¼“>O f¼•m s¼"Q@½QN½†¬S \½†šC i½†šS v½†cJ C¾†”S O¾™ķj \¾“ņO h¾†—S u¾¾NQBæ†fO Pæ†ÆS ]æ™fh jæ a w憒S DĄ•ųp QĄ™ņd ]Ą†é` jĄ†S wĄ†o DĮ†¤C QĮ†ŒS ^Į†Öq kĮ¾KQwĮŠ.qEĀŠ\vĆŠ!WRČŠ[iĖŠ9iDŠŠZmŌ†’G Gץ[4e4S׊H4x‹†G lŒŠ7jyŒŠĶ–#Ac‘Ė#YDd“Š yh˜Š<oa›Šń·A PžŠ vpžŠ-wf­Š:I]°Š#vf³ŠJ|\øŠ)e XŗŠ4o}ÅŠ"KlĒŠ]MwÉŠ>rDĖŠovĢŠJeĻŠ >oÓŠ#ZmŌøJcGŲŠ1rUŲõNGŚ•õY UŚŠ'ZaŚŠ5r{ÜŠ>mŽŠ$Vkߊ#^HAį†E Ić•ŗw VćŠ*x cćŠi[ļŠ8EDó•ŗY IõĖō#BHUõ•ŗS ]ö•’Z jöŠ#2Iwö™’s @ˆ•ĄY Mˆ•ĄT Yˆ•ĄS fˆ†’r sˆŠ#i @‰†ŸG i“Š+Xu“Š÷·mM•“JT k••L x•Ć` E–ŠQR–†I c—†ĢG p—Šv|—†Õ^ rœŠBX œJgW©†N e©†M r©Šé·l©†X ^Ŗ•Šb kŖŠQxŖŠ=sF«Š#_y¬ŠLXÆŠ@fd°†_ J³™` W³™q d³™I q³øŠc~³Š6M“•F L¶øEY¶ŠAHg¶•äT o¹•äS |¹†F IŗŠ#,Y Vŗ† oĒŠ#bm|ĒŠłkEiĖēU nĢŠ?j{Ģ™¤^ eĪ•õV rĪ†K ĪŠUKĻ•õT `ŃŠFimŃŠ|d aö™,D mö™,E zöŠcUa"F÷ŠOg™™R vœ†O CŠõ#u8P™Bd Hž“BO Tž•W ažŠģ#G3nž†D^ aŸŠ#(9mŸ†H^ f “HO s ŠcTo@”Š#/wo½†K^ fĄŠ’·prĄŠ#KQĮ†N^ \ĆŠlhĆŠ#dTĒ†Z xȆY EɆ[ RɆGO _ɆGP lɆGQ yɆ\ FŹŠcRlSŹ“ŠT Ģ†ŻG KĶŠū\FWĶŠcSM]ц] jŌ†^ wŌ™H DÕŠcXzQÕĄ`[4HKķÉK\Sž†d^ o’Ąc[4p÷{’°nA:k÷ ŠW~l± †g^ j³ Šckv³ Š[Ra¶ •J s· †Ē^ @ø †ÆG Lø †f^ Yø Ą#[4p¹fø Ą[4j³Vņ Ą[4RW@¦Š;oRż