*EH7m kwD?\NoneSendIRCMessagePrePadClientMessageParseDelimited GetTeamColor SendNoticeSendBufferedDataPostPadCheckPasswordCore MVReporter2SystemEngineGetColoredMessage SendText ProcessInput ServerMutate SendMessageConnectLoadTeamNames GetStrTime GetString Disconnect JoinChannelRelaunchReporterOnScoreDetailsSendScoreBoard ChopLeft QueryPlayersTickInLocalizedMessageSendScoreLine OnGameOver ProcessScoreOnGameDetails OnAdvertise sScoreStrBeginTimer SendQuitiGameInfoDelay LoggingIniGameDetailsDelay QueryInfo LoggedInInTeamMessageProcessKillingSpreeBroadcastMessageCheckIRCColors InitializeInVoiceMessage QueryMap QuerySpecs ResetQueueMutateAddLine QueryScoreiScoreDetailsDelayPostPlayerStats SetGameInfoInClientMessageHandlePickupQueryCloseConsoleCommandOpen SendLineProcessPrivMsg AddMutatorSepLeft iFloodCount ReporterNick SepRightEngage InitReporterQueryMainTeam QueryRoot QueryMenuQueryMainColorGetTauntString QueryMainIRCPostBeginPlayQueryMainGeneralGetClientVoiceMessageStringReadBufferedLineQueryReconnect ResetBufferDoBufferQueueIOGetReporterClass QueryMain FullNameQueryMainMenu QueryStart QueryStop UBrowserQueryUWebResolve ResolvedResolveFailedOpenedClosed BindPortIpDrvMvReporterStats_DMUserInitChannel bFirstRun PreBeginPlay Password TeamMessageReceiveLocalizedMessage ircClear ircUnderline ircColorAdminPasswordircBoldcolHighcolGold colGreencolBluecolRedcolBodycolHeadcolTimecolGen teamGold teamGreen teamBlueteamRed Password2 UserName2 NickName2bSecondaryLink AuthPassword AuthName ServerAddr bAdvertise bPublicComssBuild sVersionClientVoiceMessageTaunt GetItemNameCheckIPPolicyAntiFloodDelay bEnabledMvReporterWebMvReporterStats_DOMFailAuthenticationMvReporterStats_CTFMvReporterStats_TDMMvReporterStats_BTCheckGameOverMvReporterStats_1on1MvReporterStatsMvReporterSpectatorMvReporterMutator_1on1MvReporterMutator UsernameMvReporterIRCLink2MvReporterIRCLinkMvReporterImageServerMvReporterConfig MvReporter GetAckStringGetFFireStringGetOtherStringArmor2 ThighPads HealthPackGetOrderStringORDERACK FRIENDLYFIRE AUTOTAUNT UT_Jumpboots ServerPort NickNameUT_ShieldBelt GetCallSignTeams GameSpeed TeamInfo MaxTeamsSize FragLimit TimeLimitFriendlyFireScaleGoalTeamScoreGRI TeamIndexTournamentPlayerStats bInitializedBotpackDeathMatchPlusChallengeVoicePack TeamGamePlus ControlPoint UserIdentNick ServerIPAddrLFCRLFUBrowserBufferedTCPLink DominationGetPlayerNetworkAddressControlPointMessagePing DeltaTimeCTFFlagOther PointNameIPMsg RelatedPRI_2 IPPoliciesbMultiWeaponStayFirstBloodMessageTournamentGameReplicationInfoDeathMessagePlusDeathMatchMessage CTFMessage MaxPlayersTGRIControllingTeam Controller ValueString ServerName VoicePack AdminRealmAdminUsername bIsPlayerbDebugMutSec LocalMessageP MutateStringMItem GameClassURI ResponseRequest GetVariableWebApplicationSubst ClearSubst IncludeUHTM ImageServerCommand WebRequestLink2 LastMessageType InControllerInLinkInLink2 StatsClassMut1on1 OutActor bOneOnOne GameName bIsConnectedTeam NickCounter iTimerType SwitchLinkconfSpec WebResponseiFloodCurrent NumPlayerssQueueifHeadifFootifCount bUTGLEnabled InConfig OrigNick DestNick NickFlags OrigNickAddrDisconnectMsgAddr sOrigNick sNickFlags sDestNicksLinesParamsiFoundPort sTestPwdsNick SpectatorMessagingSpectator PRIArrayIpAddrtempilHeadjiCommandString ScriptText StrLenghtStrTempS PlayerNameScoreIRCLink IRCLink2V ReturnValueTimesTeamsbMutedHasFlag PacketLossbIsABot bUseLogin bUseAuthTcpLink InternetLink Perform1 Perform2 Perform3 bIsSpectatorPagePad bAllowPickupbExtra1on1Stats bPublicSayLine VoiceType MessageIDSenderDeaths PlayerID TeamName ElapsedTimeRemainingTimeLinkStrText NextMutator BaseMutator bGameEnded PawnListOptionalObject bBTScores RelatedPRI_1bBeep nextPawnMutator LevelInfo GameInfoPlayerReplicationInfosStrGameReplicationInfo InventoryLevelActorPawn bGameOverGamebDoneAd iTimerCnt PlayerPawn RecipientPlayer sGameInfo iRowKills sMessagebIsSpeclPRIsHighsMsgNetConnectionbNoTimeMessageiTeamTitlesPreFix sHighLight sPlayer_1 sPlayer_2bAdminiID_1iID_2PRI MessageTypeClassPackagebestPRISwitch TextBuffersBotObjectiNumlSpeclPlrsName_1sName_2 sScore_1 sScore_2lPRI_1lPRI_2 FunctioniT iPingsArray iPLArray sTimeMsgiAll lastKiller lastVictim lastSwitch droppedNamedroppedMessageisStateDroppingDiedMsg Player_1 Player_2TmpStrlFLAGStateiScoreStruct sHeadLinebTime UnrealShare intScoresecs bSentDrop bSentDiedsltsgtlTI StrPropertylTempStructPropertyClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertyControlPointsNoneE )dwԝX SKJI]irc.de.quakenet.orgr" k] #mvrtests] Reporter1`] replacen] replaceH] replaceG] replacet]adminR$@FE] Reporter2D] replaceC] replaceB] Red TeamA] Blue Team@= Green Team] Gold Team~-3}-2|-2{]14z-4y]12x-3w-7v-4CCCCCC @DCB gb:DKxw ᘗwww&ww ,4vgww ,4vgww ,4vgww ,4vgwwwww ,4vgwKwwwwwwKwwwKwwwwwwKwwww ᘗwwwww ᘗwwwwwwttu[t{#Uu[@1C@1C@1C@1Cttwww ,4vg&$cT ,4vg&$cT ,4vg&$cT ,4vg&$cTwwwwww-%nwwwww&wwwwwwwwwwwwwwwww ,4vg ,4vgwwww ^g G]mvrZ]mavericks reporterF$?CCCC>CCECCc@CC'CF xe= ,4vgԝXwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwKw ᘗ@1C=$:e@1C@1C=$:e=$:e=$:eGGGG&w M] 2.0beta1L= 19/11/2004CCyCCq@DCCCCS @CChCC@DCCC C@CCWCCdCCV@DCCCC|CC~CA {a:  ᘗxwwwwwwwwwwwwwwwwwwwwwwww ,4vg ,4vgwwww ^g G]mvrZ]mavericks reporterF$?CCxCCsCChCCCCCpCCT@CCCCH@DCClC} o\$cT糜ԝX{#U{#UnWM)nWM)nWM)nWM)nWM)nWM)nWM)4@1C u]s]r]q]CCkC$~ H ] 61& o@1C=$:e$cT$cT$cT$cT糈@1C@1C ,4vgw@1C=$:e@1C@1C=$:e=$:e=$:eSQwSQw ,4vg$cT$cTKKSQw ,4vgwK ,4vgwK ,4vgw$cT$cT ,4vg$cT$cT糈@1C$cT iCC@C_{ y[(<_Pw;({#U{#U{#U{#U{#UKw&&wwwww@1CZ )"Q+"xCC[@CC3CCpCC@CC5@CCiC(CYCCC C7@CC4CCQCCCCA@CC*CCK@CCoCCfCCM@CCLCC6CC;CCMCC]CC[CC=CCCCACC~@CCdCCCC,CC:@DCCLCCz@CC?CCmCCYCCYCCY@CC}@CCcCCW@CCp@CC@@DCCC&C^@CCBCCVCCy@CCzCCK@CC@DCC\@DCCs@CCXCCl@CCo@DCCNCCE@CCA@CC}@CCBCCs@DCCgCCg@DCCL@CCi@DCC@DCCwCC@CC]@DC_r mXp_PK@1CZ}"#xx{#UwwK{#U&{#Uw{#U{#Uw{#UKK}"#;({#U{#U{#U{#UK}"#}"#}"#Kw}"#}"#w}"#;({#U{#U{#U{#U;({#U{#U;(w}"#}"#}"#ww}"#wwwwww}"#ww{#U{#Uww{#UwZ}"#www;(;(Z}"#ww}"#-%n;(w;(;(w;(wZ}"#wKww}"#;({#U{#U{#UK{#U{#Uww&{#U{#U{#Uww{#Uww{#Uww{#Uw{#U{#Uw{#U{#Uww{#Uww{#Uww{#Uw{#U{#U}"#}"#}"#ww}"#wwwwwww{#U{#Uwwwwww %]FragsCCa@CCJ@CCc@DCCdCCH@CCnCCvCCgCC@CCCCh@DCCFCCRCC}CCFC CCCCUCCyC&CDCCBCCl@DCCHC@ L_fG=$:e=$:eu[u[KKw ᘗ ᘗu[Kw ᘗu[Kw ᘗu[wK ᘗu[K ᘗu[u[Ku[u[wKwwwwwwKwwu[wu[u[wu[u[wKwwwwwwKwwu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wwu[wwu[wwu[wu[wu[wu[wu[wwu[wwu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[wu[w CCICC^CC}CC1@CC@CCQCCCCCCCCq@CCsC Q^'SQw=$:etГ(<(<Ã{#U{#U(<wГ(<(<Ã{#U{#U(<wГ(<(<Ã{#U{#U(<wГ(<(<Ã{#U{#U(<wГ(<(<Ã{#U{#U(<w=$:e CCx@CCWCC@DCCPCCcCCE@DCCCC~CCI@CCCCC$v HhD_P$cTK@1CZxxK{#U&{#U{#U{#U{#UKK@1CZl)l)KKl){#U&l){#UKl){#UKKK;(;(;(K;(K;(K;(@1CZww;(ww@1CZwKww;({#U{#UKw{#Uww&{#Uw{#Uww{#Uww{#Uww{#Uww{#Uww{#Uww{#Uww{#Uww{#Uw;(;({#U{#U;(www;(;({#U{#Uww{#UwKw@1Cw{#Uw{#U{#Uw{#U{#Uw{#Uw{#Uw{#Uw{#Uw{#U{#U{#U{#U{#U{#U{#UEl{#U{#UwK ᘗKK ,4vgww;(;(;(;(;(w;(@1C;(@1C@1C;(;(;(wK{#U{#Uwwww{#U{#Uww{#UwKK;({#U{#UwwK;({#U l)",+":"xCC`@DCCc CCCC @CCCCCCMCC_CC"@CCCCQ@DCC @CCm@DCCk@DCCNCCCCsCCY@DCCN@CCGC$CCCaCCxCC|@CCqCCsCGCCC@CCxCCK@CCO@CCe@CCj@DCCJ@CC{@CC@CCB@CC-CCkCCj CSCK @CC @CCg @CC{@CCE@CC`@DCCjCCCCCCCCQCCTCCCCUCC@@CCi@CC/CC@CC @CC@CCI @CCdCCICC@CC@CC@CC_@CC@CCCCcCCb@CCjCCeCCECCCCTCCDCCr@CC!CCC Co@CCCCCC9CCCCCCSCCCC\CC8CC|@CCz@CC@CC_CC0@CCnCCUCCCCACCCCh@CC@CCGCCCCD@CCfCCn@CC@CCCCtCCM@CCqEe{ p** Team Status Information:%.e%we, ~e r~*mm~-:~R~Q:~2r}*}e mm}~}e epCppppppppppTeam-Name, | n,  | Ping,  | PL,  | PPL,  |%g.RR.QQ.pppppppppppppppppppp> =), | =SD.,  |  SR,  |  pSQ%,  |  S.,  |pppppppppppBest Player is} } with SD} Frags!  CC@CCC C@CCx@CC@CCSCCh@CCCCCCoCCeCCVCC@CCCCp@CCPCC~@CC@@CCCCLCC]CC@CC@CCiCCUCCCCCC@ @CCFCCC C| C&C~CCOCCCCf@CCt@CCu@CCv@CCx@CCbCCy@CCz@CC|@CCCC}@CC@CCPCCA@CCCCC@CCCCCF@CC@CCD@CCG@CCM@CC%CCYCCZ@CC@CCK@CCR@CCkCCc@CC@CCxCCS@CCU@CCiCCX@CCsSkX 2`ak T :%` ,pppppp* i is now on i.F  ak ``kTiEF0ak /TiE C{CC@CCZ@CC[@CC\@CC@CC_@CCZCC`@CCa@CCb@CCc@CCe@CC@CCg@CC#CCd@CCW@CCN[#]%[%[, ~[ ;r~*`rP*P[ P~P[ [ p** Game Details:ppppppp>> Timelimit / Fraglimit:  S  / S ppppppppp> PP is in the lead with SDP frags!  CP@CC@CCmCCnCCkCC@CCNCCOCCgCC{@CC[CCv@CCVCCyCC^@CCCCwCCuCC@CCOCCL@CC2$jfzV,BT-zV,CTF-BT-,{VBotPack.CTFGame-z'MvReporter2: Stats Actor Initialized Cb@CCdCCCCBCC@CCFCC`CC] CCC @CCI@CC@CCL@CCt@CC@CCb !R$>6pGame has ended!; Cr@CCFCCCCE@CC@CC]P  p52 CWCC@CCCCJ@CCS @CC[CCHCCXCCY 'yA- >-+h-@ WW-+ #% -I'-I(pMavericks IRC Reporter 0w'pp*** kR-f-K$ %! %$RR ,< %$?#?l?% % #%pp*** k?#?m?% #% %-#a?#?n?% #% %a-- -^-^'!##%#, CG CCvCCUCCB @CC`CCLCCu CCdCCss 3= ChC CjCCCCc @CCZ @CCCClCCf@CCJCCCCir( CqX;{!)O 'p** Final Player Status:'-FppppppppppppName, | Login, | Frags,  | Death,  | Ping,  | PL,  |'ppppppppppName, | Frags,  | Death,  | Ping,  | PL,  |'X%CX, /X r/*99/-/-Y (Bot) Y-Fppppppppppppppppppppppp> p/Y, |  U!pgetlogin /, |  SD/,  |  SD/,  |  S/,  |  pR/%,  |'9pppppppppppppppppppp> p/Y, |  SD/,  |  SD/,  |  S/,  |  pR/%,  |'X ' C[ 87 Cp@CCPCCrX <R0pppppppppppCurrently Playing:   ( ) on   CuCCwCC@CCZW [,2;D[pp*** Detailed Game Information for :P[ppp>> Timelimit / Fraglimit: S  / S  %6[p>> Time Remaining:  94[p>> Elapsed Time:   CmCC@@CCO @CCC@CCGN .3E CE @CCpQ H8HHpp*** Player List for :]%/a0 A_dA]%dpd, -Fdppppppdd - Login: U!pgetlogin d (SDd)Wdppppdd (SDd)]10]%dNo players on server!Hp>> d C{CCB @CCBCC@CCCC}=. CoAI9: I C@CCFCCaCCK@CCJ@CCb @CCP@CC@CCNCC@CCi Q.Q7 CppppQ:  N CMCC` e 4+ CCCjCC]@CCt@CCUl ,S CY@CCZ@CC^C CXCCmCCsCpw P WNa9#Ipw}"#;({#U{#U{#U{#U{#Uw}"#}"#}"#ww}"#wwwwww}"#www}"#}"#w;({#U{#U{#U{#Uw{#Uwj\w{#Uw{#Uwwww{#Uw{#U{#Uw{#U{#UwEl{#UwElwEl %]Caps)"+",:"CC.CCN@CCCC{CC`CC@CCgCC~@CCZm 5| CT@CC@CCAuS#HSpp*** Player List for :U%A%A.U%S/a0 pMNpL:NAU%SpS, 'SpppA): 5-FSppppppppppS=A--N - Login: U!pgetlogin N  (SDN)>SppppppppS=A--N  (SDN)UU10yU%Sp>> SA_U%%S>> No players on server! CfC CpG 9 Cjo  CrMM64-@4zM&#ppJOIN M Ct'K9, B-:ppPASS jMvReporter2: Secondary Link - Sent PASS9, a?(S9, ppppUSER V 0 * :pMvReporter2: Secondary Link - Sent USER9, a?(SS9, ppNICK TMvReporter2: Secondary Link - Sent NICKg9,-@'9&o99%-@" CSCCyRwA-KpMvReporter2 Debug: Secondary Link - RuzR,PING ppPONG R, CHOj9S%.P%P, pP hrp*p-:pSpT:pP4jpppppppppTeam-Name, | n,  | Ping,  | PL,  | PPL,  |%Q.SS.TT.jppppppppppppp>= ), 5| SD.,  | SS,  | pST%,  | S.,  || Cql(U> '%-@ppQUIT :l CoCCACCzw!WToo CDQOv! Cv}[ 9&a@( Ck@CC@CC|@CCZ7 $w*7Z RzZ, mvrstatus True -|Z,mvr 'Z,#|',START>-+>Q - M-@MQ Done.|',STOP>g- M Done. |',RESTART>Reporter restart ...- MReporter restart ... Done.4|',STATUS- w>-+M-@ Connected>-+M-@ Link2 disconnected Disconnected1>-+ Connected1 Disconnected`|', MUTEOUTPUT-1>Fppp*** Output has been muted.-1-1bD-1>Ippp*** Output has been un-muted. Applied.|', MUTESTATUS-1 1 0|', PUBCOMSSTATUS-7 1  0N|',PUBCOMS-7>Rppp*** Public Commands have been enabled.-7-7b2-7>Sppp*** Public Commands have been disabled. Applied.|',SET '',H'pE'  ADMINPASSWORD s Applied. SERVERADDR { Applied. ZSERVERPORT hJ Applied. ANTIFLOODDELAY cL Applied. CHANNEL " Applied. NICKNAME H Applied. YNICKNAME2 T Applied. USERNAME M Applied. USERNAME2 @ Applied.  PASSWORD ` Applied. S PASSWORD2 j Applied. AUTHNAME l Applied. AUTHPASSWORD m Applied.  PERFORM1 k Applied. O PERFORM2 i Applied. PERFORM3 g Applied. BUSELOGIN  zTrue-:'  zFalse z-:( Applied. BUSEAUTH > zTrue-`'n n zFalse z-`( Applied.  BSECONDARYLINK  zTrue- '  zFalse z- ( Applied. K TEAMRED a Applied. TEAMBLUE o Applied. TEAMGREEN ] Applied.  TEAMGOLD \ Applied. BEXTRA1ON1STATS ? zTrue-Q'o o zFalse z-Q( Applied. BPUBLICSAY  zTrue-q'  zFalse z-q( Applied. b|',GET '',' {ADMINPASSWORD s SERVERADDR { SERVERPORT Sh ANTIFLOODDELAY Uc :CHANNEL " gNICKNAME H NICKNAME2 T USERNAME M USERNAME2 @ PASSWORD ` KPASSWORD2 j xAUTHNAME l AUTHPASSWORD m PERFORM1 k PERFORM2 i 0PERFORM3 g `BUSELOGIN T-: BUSEAUTH T-` BSECONDARYLINK T-  TEAMRED a TEAMBLUE o KTEAMGREEN ] xTEAMGOLD \ BEXTRA1ON1STATS T-Q BPUBLICSAY T-q  CV@CCRTERROR :Closing Link8RWR ,iR:!,kR! ,|R}TTpMvReporter2: Secondary Link - R:,'-@(9&apA(zR &ERRORpMvReporter2: Secondary Link - R:,'nzW433^pTSsppNICK ^s zW4749a A(zWKICKzR ,^" CPE "Yq}PO&GOq=zPO& GOPO& Cq@CCHA-TpMvReporter2: Secondary Link - Joining Channel: "ppJOIN "-`ppppPRIVMSG Q@cserve.quakenet.org :AUTH l mMvReporter2: Secondary Link - Successfully logged in to IRC Network!I{kpky{ipi{gpg9,a@( &CCiTa#`*zE  p** Game Details:ppppppppp>> Timelimit / Scorelimit:  S  mins / S  nzE ppppppp>> Friendly Fire / Weaponstay:  SD.?,d% / T.- %appTime Remaining:   L %aThis Game will never end, because Timelimit and Scorelimit are zero!appElapsed Time:   pp>> azE   Ce} G}e ,Jze,PING ppPONG e,ze &ERRORpMvReporter2: Secondary Link - e:,'z}433^pTSsppNICK ^s z}451G-KMvReporter2 Debug: Secondary Link - sending USER and NICKppNICK ^ppppUSER V 0 * :p z}NICKKe~@,|KVKe:,'^K:J}%MvReporter2: Secondary Link - Switching state to 'LoggedIn'q!-8e CVV<ca< 6 Z%<6*3Q ,* <6*3Q a< r3*V*W:* V3W:3h6w3* w**:3:*V<6*3Q}h<6*3Q/~h was slimed."~h was incinerated.V<6*3Q}Vpppp=WVJhas died !{VaL=(a@@' a< 6 %ppA<6*3Q New Score:  T,ppA<6*3Q ,-e'g*p<6*3Q p<6*3Q6%{pppppppppppA**JAhas captured the flag !J (Best Time: "D*) New Score:   CIF*~6-:ppPASS jppppUSER V 0 * :pppNICK T &CCJet =MvReporter2: Secondary Link - Lost connection to server CKdl NMvReporter2: Secondary Link - Link to IRC Server opened...u!q!* CPceAMvReporter2: Secondary Link - Failed to resolve IRC server! CBNH#]M}Nt&GtM=zNt& GtNMt CM@CCO@CCh@CCx dbV6[6dff%MvReporter2: SecondaryLink - Failed to resolve IRC server port! MvReporter2: SecondaryLink - Successfully resolved Server IP Address...A[ Cbr> Brga/!j.rppp.BB.Jhas picked upi ThighPads.7ga/!i.qppp.BB.Jhas picked up aniEArmor.ga/!q.rppp.BB.Jhas picked upiJumpboots.^ga/!t.uppp.BB.Jhas picked up ailShieldbelt.ga/!k.uppp.BB.Jhas picked up ailHealthPack.w*>rg_ CNG!vMpGame has ended!** Final Score Information:' CORbM** Current Score: o%o, mro *o -bo rN*Nb-zNbNb-zNbNbY.bwY*ppppp>> b has the :Y) flag!o!K-zN?%pppppppp>> N has the best CapTime - "DN ! Cr\n;28 'p** Final Player Status:'-FppppppppppppName, | Login, | n,  | Death,  | Ping,  | PL,  |'ppppppppppName, | n,  | Death,  | Ping,  | PL,  |'!%!.n%n, n r*-:!I-c (Bot)Qc$-Fppppppppppppppppppppppp> pc, |  U!pgetlogin , | SD,  |  SD,  |  S,  |  pR%,  |'pppppppppppppppppppp> pc, | SD,  |  SD,  |  S,  |  pR%,  |'!h!e:n! ,4-'!%6!.!h!h!.!e!e!.pppppppppppppppppppppp> =!!), | , | =!SD!.,  |  ---,  |  S!h,  |  pS!e%,  |'! CCC@],Do]^-@(^Tppppow (Build o|)V-:V@VmvrX%X,VpV쒧, ,0XpMvReporter2: Secondary link - Created new UserIdent: V6[ha{ CCCS\ 0ppppppppppppp\$%) SD%.5:$--SD&. &) CUCCCCXY<-t -tpY-t%0.d%&d, xd wx*x-:xx-gxj:xdm@ppppppppppTeam-Name, | n,  | Ping,  | PL,  | PPL,  |-t%".gg.jj.pppppppppppppppppppp> =), | =SD.,  |  Sg,  |  pSj%,  |  S.,  |-t:-t -t CSlt.'Ipppptt:  [ CWCC]CC^CC_ @CC`CCaCC[Z"-zZ%0:00vZv& vxD?v?,<~x, \p0Sx\pSxppSv,<:\SZ CbCCv@CCpCCh6F@%U%W% CoB|E W% J-o- Uk-o'lUk-o(UD?U&?, WW&% Czc|,nD|pp*** Detailed Game Information for :|ppp>> Timelimit / Caplimit: S  / SJ8@ppget V GoalTeamScore/ %6|p>> Time Remaining:  l4|p>> Elapsed Time:   C@CC]iw'# A- >-+h-@ WW-+ ~{-w'{{{{-y'-w-y 8#% -I'-I(pMavericks IRC Reporter 0w'pp*** k-f-K % %$ ,< %$?#?l?% % #%pp*** kj?#?m?% #% %j-#?#?n?% #% %-- -^-^'!##%#, CTnW<kW $q /$Y C$E W$l   CBCCmk^Nv(H^pp*** Player List for :_%J%J.}%P/a0 }WO}V:OJ}%PpP, 'PpppJ): 5-FPppppppppppP=J--O - Login: U!pgetlogin O  ("DO)HPppppppppP=J--O  ("DO)}_10}%^p>> PJ__%%^>> No players on server! CrX8DT]D?@&?, R]U@kX@]WW&,  CJCC@CCtqC8&a@( CCC{R(xC'%-+ppQUIT :R Czmx -z -z'a 1bpp[Mv] Mavericks IRC Reporter vw loading...J CuZJ86qr*a FrW*- Wa r*rW*- MvReporter2: Error Spawning IRC Link Class!  -[MvReporter2: Starting Connection Process...  - W BrB*Ba & Da GZwZ*~VZMvReporterMutatorZZy.GZyQyy>yMWBIW Cve %)a&)o,)],)\ Cw1mr 9,p.r,p. , p. V,Vp.V,p.Vq,qp.qY,Yp.YE,Ep.El,lp.lb Ci|l#Qpp*** kl%l, |l ^r|*|-wx*q|x|l*rx*{--Dnobody{SDxDxrq*z--Bnobody@zSDqBq>-Fpppppppppppppppppppp>> Current Score:54 D - Login: Upgetlogin D {5:512--z B - Login: Upgetlogin Bpppppppppppppppp>> Current Score:54 D {5:512--z B C@CCOB53-+8ppppNOTICE O :P Cvz<ppppppppPlaying 1on1 on  , Server:   C@ @CCV`C@aC A Z%CA=;L ,* CA=;L aC z=~`CA=;LaC ~=L;KA`CA=;L-bJr;*z=a#z;a w;*-b(`/A=; aC A l%ppACA=;L New Score:  ,-b'a=@pCA=;L@ pCA=;L  CA E@BVT-1(-+8ppppPRIVMSG " :E CD CCJ DxA64-+4zD&#ppJOIN D CCC]CCCCF @CC@CCN~!g#MpGame has ended!** Final Score Information:' COG _r&** Current Score: L%>L, _L Ur_*4nrX*X_X_X_4_-c._4wc*ppppp>> _ has the :c) flag!L!pppppppp>> X is in the lead with SDX frags! CwCCL ~ f@Qz~s'OC*** Error: Wrong password provided.( C@CCT H^V??7{H~: H&HH&H CH } 0ppppppppppppp}$%) SD%.5:$--SD&. &) CR CCCCM |=-@ -@p|-@%1.C%'C, |C r|*|-:||-F|G:|Cm@ppppppppppTeam-Name, | n,  | Ping,  | PL,  | PPL,  |-@%#.FF.GG.pppppppppppppppppppp> =), | =SD.,  |  SF,  |  pSG%,  |  S.,  |-@;-@ -@ Cjz\54K\pp*** Spectator List for :w%/a0 bZYb-w.b*!-Fk\ppp> b - Login: U*pgetlogin bR(\p> bw10w%#\>> No specs on server! CY @CCI@CCU Cqp"% I ,( |IY& I ,(, I ,'|% say|% msg & 0pp (IRC): , |% mutate & n, |% teamred & a, b0ppChanged Team Name of 'red' to ', '!:|% teamblue: & o, b0ppChanged Team Name of 'blue' to ', '!|% teamgreen & ], b0ppChanged Team Name of 'green' to ', '!p|% teamgoldp & \, b0ppChanged Team Name of 'gold' to ', '!_|% teamsreset_ & aRed TeamoBlue Team]Green Team\Gold Teamb0All Team Names have been reset to standard values!|% mute & -1Ppppp*** Output has been muted by -1-1b-1Spppp*** Output has been un-muted by |% pubcoms & '-7\pppp*** Public Commands have been enabled by -7-7b-7]pppp*** Public Commands have been disabled by f|% nickf & pChanging Reporter's Nick to: , H, bppNICK , )|% channel) & pSwitching Channel to: , , , ppPART "", b|% server & pSwitching IRC-Server to: , {, bpChanging IRC-Server to , { |% pwd{  & , I ,(pChanging Admin Password to: , s, b |% op  & ppppMODE " +o :ppOped you on "... |% voice  & ppppMODE " +v :ppVoiced you on "...F |% servertravelF  & pTravelling to: , 0pppp***  switches map to ,  from IRC@pservertravel ,  |% kick|% kickban  & d%E wE* w.E*wE*w..E* |, EI |% kickbanc.EI  Qccc~c:pAdding IP Ban for: c]% ],2 z] ]  ],2]pDENY,cbpBanning IP: cpKicking player: , Ead&EE  d%ppSorry, couldn't find ,  on server!|I"-1-7& I ,'% |!map0B% 4 !gameinfo0B% , !specs !spectators0B% 5 -!players0B%  !sayk-q0pp (IRC): & Sorry, this function is disabled on this server.  CV '=3p8, B-:ppPASS `MvReporter2: Sent PASS8, a?( 8, ppppUSER O 0 * :~MvReporter2: Sent USER8, a?(  8, ppNICK HMvReporter2: Sent NICK48,-+'O8&088%-+" C^ e4f0-KpMvReporter2 Debug: edze,PING ppPONG e, CUvy41~sypppppCurrently Reporting:  ( ) on  C@CCZ CCCC] CCVKmQjam w Z%mwvnN ,* mwvnN am zvLKmwvnNam LvtnpwKmwvnN/wvn am g%h%eh,[wh.@*g%uppu  - Wrh.@.NH[D]gHDih.@wi*uppppu=iHh.@DTuppppu=,Hh.@DghppControl Points Updated: u C` CC_ oVlo?&PlFlP.- Fc?,FcBWTJJ Cf Qv! Cp CCCCm a ZIC$$ -'"( Cd @CCu@CCDFfERROR :Closing Link8D~D ,OD:!,nD! ,|D}ffpMvReporter2: D:,'-+(8&apA(zD &ERRORpMvReporter2: D:,'Lz~433YpHSyppNICK Yy oz~4748a A(z~KICKzD ,Y"Dz~PRIVMSGrD ,*{r~:@+r&rr&JJpJr&COJrD Ch e -/zngetglstatusTrue-F'pMvReporter2: Joining Channel: "ppJOIN "-`ppppPRIVMSG Q@cserve.quakenet.org :AUTH l mMvReporter2: Successfully logged in to IRC Network!V{kpk{ipi{gpg8,a@( &CCj Lj ,Jzj,PING ppPONG j,zj &ERRORpMvReporter2: j:,'zL433YpHSyppNICK Yy nzL451%-KMvReporter2 Debug: sending USER and NICKppNICK YppppUSER O 0 * :~ zLNICKEj~@,|EOEj:,'YEJL%MvReporter2: Switching state to 'LoggedIn'q!-8j Ci g *J6-:ppPASS `ppppUSER O 0 * :~ppNICK H &CCj ey. ,MvReporter2: Lost connection to server Cl dq =MvReporter2: Link to IRC Server opened...u!q!* CO\ ^e p** Team Status Information:%x.^%n^, C^ rC*ddC-:CBCA:C)rD*D^ ddDCD^ ^g:ppppppppppTeam-Name, | n,  | Ping,  | PL,  | PPL,  |%_.BB.AA.pppppppppppppppppppp>> =), | =SD.,  |  SB,  |  pSA%,  |  S.,  |pppppppppppBest Player isD D with SDD Frags! Cn cj- 0MvReporter2: Failed to resolve IRC server! Cy $A#F0pThis match is being broadcasted to: "-f' Co ibZ6p6iVf%MvReporter2: Failed to resolve IRC server port! MvReporter2: Successfully resolved Server IP Address...Ap Cx OC&(Reporter quit!-+(? Cq CCCCe_ed C~ CCfCCv @CCw @CC@CC+g/90gh-+(YH~ppp0w (Build 0|)V6-:OMOmvrj%j,OpO쒧, ,0jpMvReporter2: Created new UserIdent: O6pha{ CL t /CfrB*Cy,ppf was looking good, until he killed himself!Cy%@B@y,pppppB's Killing Spree was ended by f!@y%Cy&Cy ,ppf is on a Killing Spree! , ppf is on a Rampage! ,ppf is Dominating! H,ppf is Unstoppable! ,ppf is Godlike!  Cj Cz mXh/ a0 medzVmMvReporter2.MvReporterm10 ClCC{ 2_+MXkr*4OERROR : [Mv] Reporter Class not found! |2mvr|2s4VMvr Admin 4!BugAddressrush@u.one.pl2&  "rootL24K >menuM24K ZmainY24K {main_menu[24K start\24K stop]24K reconnectU24K generalR24K ircP24K +teamK24K HcolorN24K  CE CCQ@CC} A L[\qMenuURImenuqMainURImainqmvr_root.uhtm CqCC @CC@ D Md wwAdminURIServerAdminwReporterURIrootwmvr_menu.uhtmw CwCCI CCC _Yq; S_PagegeneralvIndexURImain_menuvMainURISvmvr_main.uhtmv CR@CCX a':QQ 7ak CCCF \[~ ~V\PageircX%GeneralURImain?Page=generalXIRCURImain?Page=ircXTeamURImain?Page=teamX!ColorURImain?Page=colorX!StartURImain?Page=startXStopURImain?Page=stopX)ReconnectURImain?Page=reconnectXmvr_main_menu.uhtmX Cf\AW)}\Ip\I,...O}\I\pY\)\  CTX +WwH*EHHpppHEJJwI*DIIpppIDJJRppJXZ[HI^wH*HE#wI*IDR C@CCJ O \D[-[u=MessageThe bot is already running. Nothing to do...u;MessageStarting [Mv] Reporter Bot, please wait...-['bumvr_message.uhtmuB- W CuCCM CCN R ] ,v-[t;MessageStopping [Mv] Reporter Bot, please wait...-[(bt9MessageThe bot is not running. Nothing to do...tmvr_message.uhtmt*- W CtCC@CCQ U U({-[r]MessageThe [Mv] Reporter Bot will reconnect to IRC in 5 seconds. Please stand by...rWMessageThe bot is not running, can not reconnect. Please start the bot first.rmvr_message.uhtmr-[0[Mv] Reporter - http://www.mvreporter.de- W0[Mv] Reporter - http://www.mvreporter.de CrCCK rJW)}rNprN,...O}rNrprk)r  CT IR SrI#AdminPasswordsLAdminPasswordrfI#bPublicComsT-7bIbMutedT-1_I"bAdvertiseT-KmIbDebugT-KG-[LstatusrunninggLstatusstopped/{IApplysr &fIbPublicComsfalse|fTRUE-7'-7(bIbMutedfalse\|bTRUE-1'm-1(_IbAdvertisefalse|_TRUE-K'-K(mIbDebugfalse|mTRUE-K'#-K(bd|fTRUELbPublicComschecked|bTRUELbMutedchecked|_TRUELbAdvertisechecked|mTRUELbDebugcheckedLPostActiongeneralLmvr_main_general.uhtmL C^ bN{%%3b`UW C\ OizO I %Lpp[ ]mLpp[ ]-cKOKppppVL5 O K C@CCV GWWCD?G?,<BD?G?,<ppSC,0:SB,0 CfVQ3 vPSQxwut}P%ppppQQ:  P CC@CCd Dp*%DB{ml CW P< z ServerAddr{ServerAddrz|!ServerPortShServerPort|}Channel"Channel}NickNameHNickNamesbUseLogintUserNameMUserNametuPassword`PassworduvbUseAuthxAuthNamelAuthNamexy"AuthPasswordmAuthPasswordyGbSecondaryLinkMNickName2TNickName2MRUserName2@UserName2RSPassword2jPassword2SUbExtra1on1StatsXbPublicSayAPerform1kPerform1ACPerform2iPerform2CFPerform3gPerform3F {Apply{z &hJ| &"} &H &sbUseLoginfalsevbUseAuthfalseGbSecondaryLinkfalseUbExtra1on1StatsfalseXbPublicSayfalse|sTRUE-:'-:(Mt &`u &A|vTRUE-`'R-`(lx &my &|GTRUE- '- ( |UTRUE-Q'-Q(@|XTRUE-q'Q-q(TM &'@R &'jS &'kA &'iC &'gF &'b -`bUseAuthchecked -:bUseLoginchecked& - bSecondaryLinkcheckeda -Q bExtra1on1Statschecked -qbPublicSaycheckedPostActionircmvr_main_irc.uhtm C[ WSa $rW*rW*GaWJrG*u!n,p,.G f:aw{*,p,.G u{u!o,p,.G g:a&u!O,p,.G O:agu!p,p,.G O:a,u!m,p,.Gl:aDeathmatch,p,.G h:aGa, CCCa CCG@CCh To~&%.TMJ-F C@CCTCCf CCn uv Fv!CkuDw%*%=uv-V CGk J=.-^(TJ:&}T%xJ:,'Z%Z, zZ rz*zzTz--^'ppp T: xZZ -^pp* J~Jentered the game%TJ &Z%Z, zZ wz*zzTZy%Zd CRCC^2- .Ek<a@@' C@CC@CCnI"-{(nFfH`sPVs iDEATHMATCHPLUS EUTDEATHMATCHPLUS,s (-{'s _0 TEAMGAMEPLUS EUTTEAMGAMEPLUSs p0 CTFGAME SMARTCTFGAMEs a0 s _0S-Q-{ Da SRwR*~VRMvReporterMutator_1on1RRG.SRGbFGi%asr%*MvReporter2: Unable to spawn Stats Class!%F%hHFHFn wG*G..(%U- FFc?,{FFc%U%%%E%2 C@CCM////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterWeb expands WebApplication config; // Global Vars var MvReporter Controller; var MvReporterConfig conf; event Init() { Super.Init(); } // Search for our classes (main handler + config) function GetReporterClass() { local MvReporter lTemp; // Search all classes foreach Level.AllActors(class'MvReporter', lTemp) { if (String(lTemp.Class) == "MvReporter2.MvReporter") { Controller = lTemp; conf = Controller.conf; } } } // Main Entry Point event Query(WebRequest Request, WebResponse Response) { // Search for our report3r GetReporterClass(); // If no Mod Found -> Error if (conf == none) { Response.SendText("ERROR : [Mv] Reporter Class not found!"); return; } // Check authentication: if (!((Request.Username ~= "mvr") && (Request.Password ~= conf.AdminPassword))) { Response.FailAuthentication("Mvr Admin"); return; } Response.Subst("BugAddress", "rush@u.one.pl"); switch (Mid(Request.URI, 1)) { case "": case "root": QueryRoot(Request, Response); break; case "menu": QueryMenu(Request, Response); break; case "main": QueryMain(Request, Response); break; case "main_menu": QueryMainMenu(Request, Response); break; case "start": QueryStart(Request, Response); break; case "stop": QueryStop(Request, Response); break; case "reconnect": QueryReconnect(Request, Response); break; case "general": QueryMainGeneral(Request, Response); break; case "irc": QueryMainIRC(Request, Response); break; case "team": QueryMainTeam(Request, Response); break; case "color": QueryMainColor(Request, Response); break; } } // Query the Root Document function QueryRoot(WebRequest Request, WebResponse Response) { Response.Subst("MenuURI", "menu"); Response.Subst("MainURI", "main"); Response.IncludeUHTM("mvr_root.uhtm"); } // Query the upper menu function QueryMenu(WebRequest Request, WebResponse Response) { Response.Subst("AdminURI", "ServerAdmin"); Response.Subst("ReporterURI", "root"); Response.IncludeUHTM("mvr_menu.uhtm"); Response.ClearSubst(); } // Query the Main Document (Left Menu and Content -> Frameset) Document function QueryMain(WebRequest Request, WebResponse Response) { local String Page; // if no page specified, use the default Page = Request.GetVariable("Page", "general"); Response.Subst("IndexURI", "main_menu"); Response.Subst("MainURI", Page); Response.IncludeUHTM("mvr_main.uhtm"); Response.ClearSubst(); } // The Main Menu on the Left Site! function QueryMainMenu(WebRequest Request, WebResponse Response) { local String Page; Page = Request.GetVariable("Page", "irc"); // Set URIs Response.Subst("GeneralURI", "main?Page=general"); Response.Subst("IRCURI", "main?Page=irc"); Response.Subst("TeamURI", "main?Page=team"); Response.Subst("ColorURI", "main?Page=color"); Response.Subst("StartURI", "main?Page=start"); Response.Subst("StopURI", "main?Page=stop"); Response.Subst("ReconnectURI", "main?Page=reconnect"); Response.IncludeUHTM("mvr_main_menu.uhtm"); Response.ClearSubst(); } // Query Start Page (Message) function QueryStart(WebRequest Request, WebResponse Response) { if (conf.bEnabled) Response.Subst("Message", "The bot is already running. Nothing to do..."); else { Response.Subst("Message", "Starting [Mv] Reporter Bot, please wait..."); conf.bEnabled = True; conf.SaveConfig(); } Response.IncludeUHTM("mvr_message.uhtm"); Response.ClearSubst(); Controller.IRCLink.Connect(Controller, conf); if(conf.bSecondaryLink) Controller.IRCLink2.Connect(Controller, conf); } // Query Stop Page (Message) function QueryStop(WebRequest Request, WebResponse Response) { if (conf.bEnabled) { Response.Subst("Message", "Stopping [Mv] Reporter Bot, please wait..."); conf.bEnabled = False; conf.SaveConfig(); } else Response.Subst("Message", "The bot is not running. Nothing to do..."); Response.IncludeUHTM("mvr_message.uhtm"); Response.ClearSubst(); Controller.IRCLink.Disconnect(); if(conf.bSecondaryLink) Controller.IRCLink2.Disconnect(); } // Query Reconnect Page (Message) function QueryReconnect(WebRequest Request, WebResponse Response) { if (conf.bEnabled) Response.Subst("Message", "The [Mv] Reporter Bot will reconnect to IRC in 5 seconds. Please stand by..."); else Response.Subst("Message", "The bot is not running, can not reconnect. Please start the bot first."); Response.IncludeUHTM("mvr_message.uhtm"); Response.ClearSubst(); if (conf.bEnabled) { Controller.IRCLink.RelaunchReporter("[Mv] Reporter - http://www.mvreporter.de"); if(conf.bSecondaryLink) Controller.IRCLink2.RelaunchReporter("[Mv] Reporter - http://www.mvreporter.de"); } } // Query General Setup! function QueryMainGeneral(WebRequest Request, WebResponse Response) { local string bDebug, AdminPassword, bPublicComs, bMuted, bAdvertise; AdminPassword = Request.GetVariable("AdminPassword", conf.AdminPassword); Response.Subst("AdminPassword", AdminPassword); bPublicComs = Request.GetVariable("bPublicComs", string(conf.bPublicComs)); bMuted = Request.GetVariable("bMuted", string(conf.bMuted)); bAdvertise = Request.GetVariable("bAdvertise", string(conf.bAdvertise)); bDebug = Request.GetVariable("bDebug", string(conf.bDebug)); if (conf.bEnabled) Response.Subst("status", "running"); else Response.Subst("status", "stopped"); // If the Apply Button has been pushed... if (Request.GetVariable("Apply", "") != "") { conf.AdminPassword = Controller.IRCLink.ParseDelimited(AdminPassword, " ", 1); bPublicComs = Request.GetVariable("bPublicComs", "false"); if (bPublicComs ~= "TRUE") conf.bPublicComs = True; else conf.bPublicComs = False; bMuted = Request.GetVariable("bMuted", "false"); if (bMuted ~= "TRUE") conf.bMuted = True; else conf.bMuted = False; bAdvertise = Request.GetVariable("bAdvertise", "false"); if (bAdvertise ~= "TRUE") conf.bAdvertise = True; else conf.bAdvertise = False; bDebug = Request.GetVariable("bDebug", "false"); if (bDebug ~= "TRUE") conf.bDebug = True; else conf.bDebug = False; conf.SaveConfig(); } if (bPublicComs ~= "TRUE") Response.Subst("bPublicComs", "checked"); if (bMuted ~= "TRUE") Response.Subst("bMuted", "checked"); if (bAdvertise ~= "TRUE") Response.Subst("bAdvertise", "checked"); if (bDebug ~= "TRUE") Response.Subst("bDebug", "checked"); Response.Subst("PostAction", "general"); Response.IncludeUHTM("mvr_main_general.uhtm"); Response.ClearSubst(); } // Query IRC Setup! function QueryMainIRC(WebRequest Request, WebResponse Response) { local string bUseLogin, UserName, Password, bUseAuth, AuthName, AuthPassword, ServerAddr, ServerPort, Channel, Nickname, Perform1, Perform2, Perform3, bSecondaryLink, NickName2, UserName2, Password2, bExtra1on1Stats, bPublicSay; ServerAddr = Request.GetVariable("ServerAddr", conf.ServerAddr); Response.Subst("ServerAddr", ServerAddr); ServerPort = Request.GetVariable("ServerPort", string(conf.ServerPort)); Response.Subst("ServerPort", ServerPort); Channel = Request.GetVariable("Channel", conf.Channel); Response.Subst("Channel", Channel); NickName = Request.GetVariable("NickName", conf.NickName); Response.Subst("NickName", NickName); bUseLogin = Request.GetVariable("bUseLogin"); UserName = Request.GetVariable("UserName", conf.UserName); Response.Subst("UserName", UserName); Password = Request.GetVariable("Password", conf.Password); Response.Subst("Password", Password); bUseAuth = Request.GetVariable("bUseAuth"); AuthName = Request.GetVariable("AuthName", conf.AuthName); Response.Subst("AuthName", AuthName); AuthPassword = Request.GetVariable("AuthPassword", conf.AuthPassword); Response.Subst("AuthPassword", AuthPassword); bSecondaryLink = Request.GetVariable("bSecondaryLink"); NickName2 = Request.GetVariable("NickName2", conf.NickName2); Response.Subst("NickName2", NickName2); UserName2 = Request.GetVariable("UserName2", conf.UserName2); Response.Subst("UserName2", UserName2); Password2 = Request.GetVariable("Password2", conf.Password2); Response.Subst("Password2", Password2); bExtra1on1Stats = Request.GetVariable("bExtra1on1Stats"); bPublicSay = Request.GetVariable("bPublicSay"); Perform1 = Request.GetVariable("Perform1", conf.Perform1); Response.Subst("Perform1", Perform1); Perform2 = Request.GetVariable("Perform2", conf.Perform2); Response.Subst("Perform2", Perform2); Perform3 = Request.GetVariable("Perform3", conf.Perform3); Response.Subst("Perform3", Perform3); // If the Apply Button has been pushed... if (Request.GetVariable("Apply", "") != "") { conf.ServerAddr = Controller.IRCLink.ParseDelimited(ServerAddr, " ", 1); conf.ServerPort = int(Controller.IRCLink.ParseDelimited(ServerPort, " ", 1)); conf.Channel = Controller.IRCLink.ParseDelimited(Channel, " ", 1); conf.NickName = Controller.IRCLink.ParseDelimited(NickName, " ", 1); bUseLogin = Request.GetVariable("bUseLogin", "false"); bUseAuth = Request.GetVariable("bUseAuth", "false"); bSecondaryLink = Request.GetVariable("bSecondaryLink", "false"); bExtra1on1Stats = Request.GetVariable("bExtra1on1Stats", "false"); bPublicSay = Request.GetVariable("bPublicSay", "false"); if (bUseLogin ~= "TRUE") conf.bUseLogin = True; else conf.bUseLogin = False; conf.UserName = Controller.IRCLink.ParseDelimited(UserName, " ", 1); conf.Password = Controller.IRCLink.ParseDelimited(Password, " ", 1); if (bUseAuth ~= "TRUE") conf.bUseAuth = True; else conf.bUseAuth = False; conf.AuthName = Controller.IRCLink.ParseDelimited(AuthName, " ", 1); conf.AuthPassword = Controller.IRCLink.ParseDelimited(AuthPassword, " ", 1); if (bSecondaryLink ~= "TRUE") conf.bSecondaryLink = True; else conf.bSecondaryLink = False; if (bExtra1on1Stats ~= "TRUE") conf.bExtra1on1Stats = True; else conf.bExtra1on1Stats = False; if (bPublicSay ~= "TRUE") conf.bPublicSay = True; else conf.bPublicSay = False; conf.NickName2 = Controller.IRCLink.ParseDelimited(NickName2, " ", 1, TRUE); conf.UserName2 = Controller.IRCLink.ParseDelimited(UserName2, " ", 1, TRUE); conf.Password2 = Controller.IRCLink.ParseDelimited(Password2, " ", 1, TRUE); conf.Perform1 = Controller.IRCLink.ParseDelimited(Perform1, " ", 1, TRUE); conf.Perform2 = Controller.IRCLink.ParseDelimited(Perform2, " ", 1, TRUE); conf.Perform3 = Controller.IRCLink.ParseDelimited(Perform3, " ", 1, TRUE); // Save! conf.SaveConfig(); } if (conf.bUseAuth) Response.Subst("bUseAuth", "checked"); if (conf.bUseLogin) Response.Subst("bUseLogin", "checked"); if (conf.bSecondaryLink) Response.Subst("bSecondaryLink", "checked"); if (conf.bExtra1on1Stats) Response.Subst("bExtra1on1Stats", "checked"); if (conf.bPublicSay) Response.Subst("bPublicSay", "checked"); Response.Subst("PostAction", "irc"); Response.IncludeUHTM("mvr_main_irc.uhtm"); Response.ClearSubst(); } // Query Teams Setup! function QueryMainTeam(WebRequest Request, WebResponse Response) { local string teamRed, teamBlue, teamGreen, teamGold; teamRed = Request.GetVariable("teamRed", conf.teamRed); Response.Subst("teamRed", teamRed); teamBlue = Request.GetVariable("teamBlue", conf.teamBlue); Response.Subst("teamBlue", teamBlue); teamGreen = Request.GetVariable("teamGreen", conf.teamGreen); Response.Subst("teamGreen", teamGreen); teamGold = Request.GetVariable("teamGold", conf.teamGold); Response.Subst("teamGold", teamGold); Response.Subst("PostAction", "team"); // If the Apply Button has been pushed... if (Request.GetVariable("Apply", "") == "Apply") { conf.teamRed = teamRed; conf.teamBlue = teamBlue; conf.teamGreen = teamGreen; conf.teamGold = teamGold; // Save! conf.SaveConfig(); Controller.LoadTeamNames(); } // If reset has been pushed if (Request.GetVariable("Apply", "") == "Reset All Teams") { conf.teamRed = "Red Team"; conf.teamBlue = "Blue Team"; conf.teamGreen = "Green Team"; conf.teamGold = "Gold Team"; conf.SaveConfig(); Controller.LoadTeamNames(); Response.Subst("Message", "All Team Names have been reset to standard values!"); Response.IncludeUHTM("mvr_message.uhtm"); Response.ClearSubst(); return; } Response.IncludeUHTM("mvr_main_team.uhtm"); Response.ClearSubst(); } // Query Color Setup! function QueryMainColor(WebRequest Request, WebResponse Response) { local string colGen, colTime, colHead, colBody, colHigh; local string colRed, colBlue, colGreen, colGold; colGen = Request.GetVariable("colGen", conf.colGen); Response.Subst("colGen", colGen); colTime = Request.GetVariable("colTime", conf.colTime); Response.Subst("colTime", colTime); colHead = Request.GetVariable("colHead", conf.colHead); Response.Subst("colHead", colHead); colBody = Request.GetVariable("colBody", conf.colBody); Response.Subst("colBody", colBody); colHigh = Request.GetVariable("colHigh", conf.colHigh); Response.Subst("colHigh", colHigh); colRed = Request.GetVariable("colRed", conf.colRed); Response.Subst("colRed", colRed); colBlue = Request.GetVariable("colBlue", conf.colBlue); Response.Subst("colBlue", colBlue); colGreen = Request.GetVariable("colGreen", conf.colGreen); Response.Subst("colGreen", colGreen); colGold = Request.GetVariable("colGold", conf.colGold); Response.Subst("colGold", colGold); // If the Apply Button has been pushed... if (Request.GetVariable("Apply", "") != "") { conf.colGen = Controller.IRCLink.ParseDelimited(colGen, " ", 1); conf.colTime = Controller.IRCLink.ParseDelimited(colTime, " ", 1); conf.colHead = Controller.IRCLink.ParseDelimited(colHead, " ", 1); conf.colBody = Controller.IRCLink.ParseDelimited(colBody, " ", 1); conf.colHigh = Controller.IRCLink.ParseDelimited(colHigh, " ", 1); conf.colRed = Controller.IRCLink.ParseDelimited(colRed, " ", 1); conf.colBlue = Controller.IRCLink.ParseDelimited(colBlue, " ", 1); conf.colGreen = Controller.IRCLink.ParseDelimited(colGreen, " ", 1); conf.colGold = Controller.IRCLink.ParseDelimited(colGold, " ", 1); // Save! Controller.CheckIRCColors(); } Response.Subst("PostAction", "team"); Response.IncludeUHTM("mvr_main_color.uhtm"); Response.ClearSubst(); } p | T}q m xDw $~Dw $~Dw $~Dw $~Dw $~Dw $~Dw $~Dw $~Dw $~Dw ,4vgKw ,4vgKw ,4vgKw ,4vgKw ,4vgKw ,4vgKw ,4vgKw ,4vgKw ,4vgK ,4vg $~ $~ $~Dw $~Dw $~Dw $~Dw $~ $~Dwwwww ,4vgDwwwww ,4vg $~ $~ $~ $~ $~Dw $~Dw $~Dw $~Dw $~DDw $~Dw $~DDw $~Dw $~DDw $~Dw $~Dw $~DDDw $~Dw $~Dw $~Dw ,4vgKw ,4vgKw ,4vgKw ,4vgKDDDDDwww ,4vgKw ,4vgKwww ,4vgKw ,4vgKwwwwwww ,4vgKw ,4vgKw ,4vgKw ,4vgKw ,4vgKw ,4vgKww $~w $~w $~w $~w $~ $~ $~ $~Dw $~DwDwDwDww $~ $~Dw ,4vgKDwwDwwDwwDwww $~ $~ $~ $~ $~ $~ $~w $~ $~ $~ $~w ,4vgKw ,4vg ᘗw $~ww $~ $~ $~ ,4vgKw ,4vg ᘗw $~ $~ww $~ $~ ,4vgKw ,4vg ᘗD $~ $~ $~ $~ $~ $~ $~ $~ $~D $~ $~ $~ $~ $~ $~ $~ $~ $~ $~ $~ $~DDw $~ $~D ,4vg ,4vg ` CC[////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterStats_TDM extends MvReporterStats_DM; var string sScoreStr; // Override GetTeamColor Function function string GetTeamColor(byte iTeam) { // Do a switch and return the proper color switch (iTeam) { case 0: return conf.colRed; case 1: return conf.colBlue; case 2: return conf.colGreen; case 3: return conf.colGold; default: return conf.colBody; } } // Override InTeamMessage Function function InTeamMessage(PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { SendIRCMessage(GetTeamColor(PRI.Team) $ PRI.PlayerName $ ": " $ conf.colBody $ S); } // Post Player Statistics (overridden) function PostPlayerStats() { local int i, iT; local PlayerReplicationInfo lPRI; local int iPingsArray[4], iPLArray[4]; local string sBot; SendIRCMessage(" ", TRUE); SendIRCMessage(conf.colGen$"** Final Player Status:", TRUE); if(Link.bUTGLEnabled) SendIRCMessage(conf.colHead$PostPad("Name", 22, " ") $ "| " $ PrePad("Login", 15, " ") $ "| " $ PrePad(sScoreStr, 5, " ") $ " | " $ PrePad("Death", 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " |", TRUE); else SendIRCMessage(conf.colHead$PostPad("Name", 22, " ") $ "| " $ PrePad(sScoreStr, 5, " ") $ " | " $ PrePad("Death", 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " |", TRUE); // The outer loop will go through all teams (so that output will be kinda sorted by teams) // The inner loop will go thourgh all players of the specific team for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if(lPRI==None) continue; if (!lPRI.bIsSpectator && lPRI.Team == iT) { if (lPRI.bIsABot) sBot = " (Bot)"; else sBot = ""; if(Link.bUTGLEnabled) SendIRCMessage("> "$GetTeamColor(lPRI.Team)$PostPad(lPRI.PlayerName $ sBot, 20, " ") $ conf.colHead $ "| " $ conf.colBody $ PrePad(Spec.ServerMutate("getlogin "$lPRI.PlayerName), 15, " ") $ "| " $ GetTeamColor(lPRI.Team) $ PrePad(string(int(lPRI.Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(int(lPRI.Deaths)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.Ping), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.PacketLoss)$"%", 4, " ") $ conf.colHead $ " |", TRUE); else SendIRCMessage("> "$GetTeamColor(lPRI.Team)$PostPad(lPRI.PlayerName $ sBot, 20, " ") $ conf.colHead $ "| " $ GetTeamColor(lPRI.Team) $ PrePad(string(int(lPRI.Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(int(lPRI.Deaths)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.Ping), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.PacketLoss)$"%", 4, " ") $ conf.colHead $ " |", TRUE); iPingsArray[iT] += lPRI.Ping; iPLArray[iT] += lPRI.PacketLoss; } } } SendIRCMessage(PostPad(" ", 52, "-"), TRUE); // Now spamm out the Team Scores! for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iPingsArray[iT] = iPingsArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; iPLArray[iT] = iPLArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; SendIRCMessage("> "$GetTeamColor(iT)$PostPad(conf.sTeams[iT], 20, " ") $ conf.colHead $ "| " $ PrePad("",15, " ") $ "| " $ GetTeamColor(iT) $ PrePad(string(int(TeamGamePlus(Level.Game).Teams[iT].Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad("---", 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPingsArray[iT]), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPLArray[iT])$"%", 4, " ") $ conf.colHead $ " |", TRUE); } } // Detailed Game Information (overridden) function OnGameDetails() { local string sTimeMsg; // Post Stuff if (GRI.GameName == class'TeamGamePlus'.Default.GameName) SendIRCMessage(" "); SendIRCMessage(conf.colGen$"** Game Details:"); SendIRCMessage(">> "$conf.colHead$"Timelimit / Scorelimit:" $conf.colBody$" "$TGRI.TimeLimit $ " mins / " $ TGRI.GoalTeamScore $ " " $ sScoreStr); if (GRI.GameName == class'TeamGamePlus'.Default.GameName) SendIRCMessage(">> "$conf.colHead$"Friendly Fire / Weaponstay:" $conf.colBody$" "$string(int(TeamGamePlus(Level.Game).FriendlyFireScale * 100))$"% / "$string(DeathMatchPlus(Level.Game).bMultiWeaponStay)); // Post remaining / elapsed time! if (TGRI.TimeLimit > 0) sTimeMsg = "Time Remaining: " $ conf.colBody $ GetStrTime(TGRI.RemainingTime); else if (TGRI.GoalTeamScore == 0) sTimeMsg = "This Game will never end, because Timelimit and Scorelimit are zero!"; else sTimeMsg = "Elapsed Time: " $ conf.colBody $ GetStrTime(TGRI.ElapsedTime); SendIRCMessage(">> "$conf.colHead$sTimeMsg); if (GRI.GameName == class'TeamGamePlus'.Default.GameName) SendIRCMessage(" "); } // Detailed Score Information (overridden) function OnScoreDetails() { local int i, iT; local PlayerReplicationInfo lPRI, bestPRI; local int iPingsArray[4], iPLArray[4]; // Head SendIRCMessage(" "); SendIRCMessage(conf.colGen$"** Team Status Information:"); // Get the best PRI and save Ping & PL 4 ScoreBoard for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if(lPRI == None) continue; if (!lPRI.bIsSpectator && lPRI.Team == iT) { iPingsArray[iT] += lPRI.Ping; iPLArray[iT] += lPRI.PacketLoss; if(bestPRI == None) bestPRI = TGRI.PRIArray[i]; else if(bestPRI.Score <= lPRI.Score) bestPRI = TGRI.PRIArray[i]; } } } // Spamm out our stuff :) SendIRCMessage(conf.colHead$PostPad("Team-Name", 22, " ") $ "| " $ PrePad(sScoreStr, 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " | " $ PrePad("PPL", 3, " ") $ " |"); for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iPingsArray[iT] = iPingsArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; iPLArray[iT] = iPLArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; SendIRCMessage("> "$GetTeamColor(iT)$PostPad(conf.sTeams[iT], 20, " ") $ conf.colHead $ "| " $ GetTeamColor(iT) $ PrePad(string(int(TeamGamePlus(Level.Game).Teams[iT].Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPingsArray[iT]), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPLArray[iT])$"%", 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(TeamGamePlus(Level.Game).Teams[iT].Size, 3, " ") $ conf.colHead $ " |"); } SendIRCMessage(conf.colHead$"Best Player is"$GetTeamColor(bestPRI.Team)$" "$bestPRI.PlayerName$conf.colHead$" with"$conf.colHigh$" "$string(int(bestPRI.Score))$conf.colHead$" Frags!"); SendIRCMessage(" "); } // Override Query Score Function (to broadcast Scoreboard) function QueryScore(string sNick) { local int i, iT; local PlayerReplicationInfo lPRI, bestPRI; local int iPingsArray[4], iPLArray[4]; // Save Ping & PL 4 ScoreBoard for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if(lPRI == None) continue; if (!lPRI.bIsSpectator && lPRI.Team == iT) { iPingsArray[iT] += lPRI.Ping; iPLArray[iT] += lPRI.PacketLoss; } } } // Spamm out our stuff :) Link.SendNotice(sNick, PostPad("Team-Name", 22, " ") $ "| " $ PrePad(sScoreStr, 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " | " $ PrePad("PPL", 3, " ") $ " |"); for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iPingsArray[iT] = iPingsArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; iPLArray[iT] = iPLArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; Link.SendNotice(sNick, ">"$GetTeamColor(iT)$" "$PostPad(conf.sTeams[iT], 20, " ")$ ircColor $ "| " $ PrePad(string(int(TeamGamePlus(Level.Game).Teams[iT].Score)), 5, " ") $ " | " $ PrePad(string(iPingsArray[iT]), 4, " ") $ " | " $ PrePad(string(iPLArray[iT])$"%", 4, " ") $ " | " $ PrePad(TeamGamePlus(Level.Game).Teams[iT].Size, 3, " ") $ " |"); } } // Override QueryPlayers function to provide team based colors function QueryPlayers(string sNick) { local int i, iT, iNum, iAll; local string sMessage; local TournamentPlayer lPlr; local PlayerReplicationInfo lPRI; Link.SendNotice(sNick, "*** Player List for "$Level.Game.GameReplicationInfo.ServerName$":"); iAll = 0; for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iNum = 0; sMessage = ""; foreach AllActors(class'TournamentPlayer', lPlr) { lPRI = lPlr.PlayerReplicationInfo; if (lPRI.Team == iT) { if (iNum > 0) sMessage = sMessage$", "; else sMessage = conf.colHead$conf.sTeams[iT]$": "$ircColor; if(Link.bUTGLEnabled) sMessage = sMessage $ GetTeamColor(iT) $ ircBold $ ircBold $ lPRI.PlayerName $ " - Login: "$ Spec.ServerMutate("getlogin "$lPRI.PlayerName) $ conf.colBody $ " ("$string(int(lPRI.Score))$")"; else sMessage = sMessage $ GetTeamColor(iT) $ ircBold $ ircBold $ lPRI.PlayerName $ conf.colBody $ " ("$string(int(lPRI.Score))$")"; iNum++; iAll++; } } if (iNum > 0) Link.SendNotice(sNick, ">> "$sMessage); } if (iAll == 0) Link.SendNotice(sNick, ">> No players on server!"); } CZN////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterStats_DOM expands MvReporterStats_TDM; var string lastMessage, lastKiller, lastVictim; var int lastSwitch; // Override InLocalizedMessage Function function InLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string sHigh, Player_1, Player_2, sMessage, slt, sgt; local int i, iNum; local TeamInfo lTI; sHigh = ""; // *** SUDDEN DEATH / TEAM CHANGE *** if (ClassIsChildOf(Message, class'BotPack.DeathMatchMessage')) { switch(Switch) { // Overtime :) case 0: SendIRCMessage(GetColoredMessage("", conf.colHigh, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); return; // Team Change case 3: SendIRCMessage(GetColoredMessage("* ", conf.colGen, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); return; } } // *** FIRST BLOOD MESSAGE *** if (ClassIsChildOf(Message, class'BotPack.FirstBloodMessage')) { if (RelatedPRI_1.PlayerName == lastKiller) SendIRCMessage(lastMessage); SendIRCMessage(GetColoredMessage("", conf.colHigh, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); } // *** FRAG Messages *** if (ClassIsChildOf(Message, class'BotPack.DeathMessagePlus')) { // Save our message (maybe we need it l8er) lastKiller = RelatedPRI_1.PlayerName; lastVictim = RelatedPRI_2.PlayerName; lastSwitch = Switch; lastMessage = GetColoredMessage("", conf.colHead, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); // Killing Spree ? ProcessKillingSpree(Switch, RelatedPRI_1, RelatedPRI_2); return; } // *** CONTROL POINT Messages *** if (ClassIsChildOf(Message, class'ControlPointMessage')) { iNum = 0; for (i = 0; i < 16; i++) { if (Domination(Level.Game).ControlPoints[i] != none) { if (iNum > 0) sMessage = sMessage $ conf.colBody $ " - "; if (Domination(Level.Game).ControlPoints[i] == ControlPoint(OptionalObject)) { slt = "["; sgt = "]"; } else { slt = ""; sgt = ""; } lTI = Domination(Level.Game).ControlPoints[i].ControllingTeam; if (lTI != none) sMessage = sMessage $ GetTeamColor(lTI.TeamIndex) $ slt $ Domination(Level.Game).ControlPoints[i].PointName $ sgt; else sMessage = sMessage $ GetTeamColor(255) $ slt $ Domination(Level.Game).ControlPoints[i].PointName $ sgt; iNum++; } } SendIRCMessage(conf.colHead$"Control Points Updated: "$sMessage); } } // Detailed Score Information (overridden) function OnScoreDetails() { local int i, iT; local PlayerReplicationInfo lPRI, bestPRI; local int iPingsArray[4], iPLArray[4]; SendIRCMessage(conf.colGen$"** Team Status Information:"); // Get the best PRI and save Ping & PL 4 ScoreBoard for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if( lPRI == None) continue; if (!lPRI.bIsSpectator && lPRI.Team == iT) { iPingsArray[iT] += lPRI.Ping; iPLArray[iT] += lPRI.PacketLoss; if( bestPRI == None) bestPRI = TGRI.PRIArray[i]; else if (bestPRI.Score <= lPRI.Score) bestPRI = TGRI.PRIArray[i]; } } } // Spamm out our stuff :) SendIRCMessage(conf.colHead$PostPad("Team-Name", 22, " ") $ "| " $ PrePad(sScoreStr, 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " | " $ PrePad("PPL", 3, " ") $ " |"); for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iPingsArray[iT] = iPingsArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; iPLArray[iT] = iPLArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; SendIRCMessage(">> "$GetTeamColor(iT)$PostPad(conf.sTeams[iT], 20, " ") $ conf.colHead $ "| " $ GetTeamColor(iT) $ PrePad(string(int(TeamGamePlus(Level.Game).Teams[iT].Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPingsArray[iT]), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPLArray[iT])$"%", 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(TeamGamePlus(Level.Game).Teams[iT].Size, 3, " ") $ conf.colHead $ " |"); } SendIRCMessage(conf.colHead$"Best Player is"$GetTeamColor(bestPRI.Team)$" "$bestPRI.PlayerName$conf.colHead$" with"$conf.colHigh$" "$string(int(bestPRI.Score))$conf.colHead$" Frags!"); } ps k UDt uK^pw}"#;({#U{#U{#U{#U;({#U{#U;(w}"#}"#}"#ww}"#wwwwww}"#ww{#U{#Uww{#Uwww{#Uw{#U{#UwLwLL')LL')LL')Lw %]PntsCC_ fKh/?YfteamRedaMteamRedYZfteamBlueoMteamBlueZ[fteamGreen]MteamGreen[\fteamGold\MteamGold\MPostActionteamzfApplyApplyaYoZ][\\b zfApplyReset All TeamsaRed TeamoBlue Team]Green Team\Gold TeambMCMessageAll Team Names have been reset to standard values!Mmvr_message.uhtmM Mmvr_main_team.uhtmM Cu////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterStats_DM expands MvReporterStats; var bool bGameOver, bFirstRun, bDoneAd; var int iTimerCnt; var int iGameInfoDelay, iGameDetailsDelay, iScoreDetailsDelay; var string sGameInfo; var TournamentGameReplicationInfo TGRI; // Since killing spree messages are only reported to Tournament Players, we have to // calculate them on our own. We're going to have an array, which holds the Kills // a player made in a row (without dieing). That will give us neccessary information // about the state of a killing spr33 var int iRowKills[64]; // Override Initialization Function function Initialize() { // Link.ClearBuffer(); super.Initialize(); TGRI = TournamentGameReplicationInfo(GRI); sGameInfo = SetGameInfo(); // Initiate Class Timer :) SetTimer(3, TRUE); } // Override InClientMessage Function function InClientMessage(coerce string S, optional name Type, optional bool bBeep) { local string sNick, sMessage; local bool bIsSpec; local int i; local PlayerReplicationInfo lPRI; bIsSpec = FALSE; sNick = Link.ParseDelimited(S, ":", 1); if (Len(sNick) > 0) { sMessage = Link.ParseDelimited(S, ":", 2, TRUE); for (i = 0; i<32; i++) { lPRI = TGRI.PRIArray[i]; if( lPRI == None ) continue; if (lPRI.PlayerName == sNick && lPRI.bIsSpectator) { bIsSpec = TRUE; SendIRCMessage(conf.colBody $ sNick $ ": " $ sMessage); } } } if (!bIsSpec) SendIRCMessage(conf.colGen $ "* " $ S); // Check wheater we have a JOIN Message! // If so -> reset Kills in a row to zer0 if (InStr(S, "entered the game") > 0) { sNick = Link.ParseDelimited(S, " ", 1); for (i = 0; i<32; i++) { lPRI = TGRI.PRIArray[i]; if ((lPRI != none) && (lPRI.PlayerName == sNick)) iRowKills[i] = 0; } } } // Override InTeamMessage Function function InTeamMessage(PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { SendIRCMessage(conf.colHead $ PRI.PlayerName $ ": " $ conf.colBody $ S); } // Override InLocalizedMessage Function function InLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string sHigh; sHigh = ""; // If we have Sudden Death Overtime -> Highlight Message if (ClassIsChildOf(Message, class'BotPack.DeathMatchMessage')) { switch(Switch) { // Overtime :) case 0: sHigh = conf.colHigh; break; // Team Change case 3: SendIRCMessage(conf.colGen$"* "$conf.colHead$RelatedPRI_1.PlayerName$" is now on " $ GetTeamColor(RelatedPRI_1.Team) $ TeamInfo(OptionalObject).TeamName); return; break; } } // If we have a first bl00d message -> activate highlight if (ClassIsChildOf(Message, class'BotPack.FirstBloodMessage')) { sHigh = conf.colHigh; } // Send Message to IRC SendIRCMessage(GetColoredMessage("", sHigh, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); // Check for Killing Sprees if (ClassIsChildOf(Message, class'BotPack.DeathMessagePlus')) { ProcessKillingSpree(Switch, RelatedPRI_1, RelatedPRI_2); } } // Override InVoiceMessage Function function InVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { local string sMsg; sMsg = GetClientVoiceMessageString(Sender, Recipient, messagetype, messageID); if (Len(sMsg) > 0) { SendIRCMessage(GetTeamColor(Sender.Team)$Sender.PlayerName$": "$conf.colBody$sMsg); } } // Send a message to IRC function SendIRCMessage(string msg, optional bool bNoTime) { local string Time; local string Message; if (msg == "") return; // Get the Time (Remaining / Elapsed) if (TGRI.TimeLimit == 0) { Time = "["$GetStrTime(TGRI.ElapsedTime)$"]"; } else { Time = "["$GetStrTime(TGRI.RemainingTime)$"]"; } // Add Time to message if neccessary if (bNoTime) { Message = msg; } else { Message = conf.colTime$Time$ircColor$" "$msg; } // Send Message to our IRC Link Class Link.SendMessage(Message); } // Our Timer Event event Timer() { if(conf.bSecondaryLink) { if (!Link.bIsConnected || !Link2.bIsConnected) return; } else if (!Link.bIsConnected) return; // Beim ersten durchlauf! if ((iTimerCnt == 0) && (bFirstRun == TRUE)) { bFirstRun = FALSE; SendIRCMessage("Mavericks IRC Reporter "$Link.Controller.sVersion, TRUE); SendIRCMessage(conf.colHigh $ "*** " $ sGameInfo); } // Advertising if (!bDoneAd && conf.bAdvertise) { if (TGRI.Timelimit == 0) { if (TGRI.ElapsedTime > 0) OnAdvertise(); } else { //BroadcastMessage(string(TGRI.Timelimit)$" - "$string(TGRI.RemainingTime)$" = "$string(TGRI.Timelimit - TGRI.RemainingTime)); if ((TGRI.Timelimit * 60 - TGRI.RemainingTime) > 0) OnAdvertise(); } } // Map Info (Mapname/Gamename/ServerURL) if ((iTimerCnt % iGameInfoDelay) == 0) { if ((TGRI.NumPlayers > 0) && (iTimerCnt != 0)) SendIRCMessage(conf.colHigh $ "*** " $ sGameInfo); } // Detailed Game Information if (((iTimerCnt % iGameDetailsDelay) == 0) && (iTimerCnt > 0) && (TGRI.NumPlayers > 0)) { if (!Level.Game.bGameEnded) OnGameDetails(); } // Detailed Score Information if (((iTimerCnt % iScoreDetailsDelay) == 0) && (iTimerCnt > 0) && (TGRI.NumPlayers > 0)) { if (!Level.Game.bGameEnded) OnScoreDetails(); } // Check whether the game is over or not if (Level.Game.bGameEnded && (!bGameOver)) { bGameOver = TRUE; OnGameOver(); } // Increase Counter 4 Timer if (iTimerCnt > 3600) iTimerCnt = 0; else iTimerCnt += 5; } // Additional Functions // Get Team Color (may be inherited!) function string GetTeamColor(byte iTeam) { // In DM we don't have teams -> return color 2 return ircColor $ "2"; } // Get a Colored Message !! function string GetColoredMessage(string sPreFix, string sHighLight, class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject) { local string sMsg, sPlayer_1, sPlayer_2; // Set Playernames with Colors! if (RelatedPRI_1 != none) { sPlayer_1 = RelatedPRI_1.PlayerName; RelatedPRI_1.PlayerName = GetTeamColor(RelatedPRI_1.Team)$sPlayer_1$ircClear$sHighLight; } if (RelatedPRI_2 != none) { sPlayer_2 = RelatedPRI_2.PlayerName; RelatedPRI_2.PlayerName = GetTeamColor(RelatedPRI_2.Team)$sPlayer_2$ircClear$sHighLight; } // Send Message to IRC sMsg = sHighLight $ sPreFix $ Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); // Restore Player Names if (RelatedPRI_1 != none) { RelatedPRI_1.PlayerName = sPlayer_1; } if (RelatedPRI_2 != none) { RelatedPRI_2.PlayerName = sPlayer_2; } return sMsg; } // Process Killing Sprees. function ProcessKillingSpree(int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2) { local int iID_1, iID_2; iID_1 = RelatedPRI_1.PlayerID; // Player made a suicide if (RelatedPRI_2 == none) { // If the Player was on a spree -> tell end message if (iRowKills[iID_1] > 4) SendIRCMessage(conf.colHigh$RelatedPRI_1.PlayerName$" was looking good, until he killed himself!"); iRowKills[iID_1] = 0; // Reset Kills of Victim } // Switch 0 or 8 means a frag occured! else { iID_2 = RelatedPRI_2.PlayerID; if (iRowKills[iID_2] > 4) SendIRCMessage(conf.colHigh$RelatedPRI_2.PlayerName$"'s Killing Spree was ended by"$" "$RelatedPRI_1.PlayerName$"!"); iRowKills[iID_2] = 0; // Reset Kills iRowKills[iID_1] += 1; // Increase Kills of Killer switch (iRowKills[iID_1]) { case 5: SendIRCMessage(conf.colHigh$RelatedPRI_1.PlayerName$" is on a Killing Spree!"); break; case 10: SendIRCMessage(conf.colHigh$RelatedPRI_1.PlayerName$" is on a Rampage!"); break; case 15: SendIRCMessage(conf.colHigh$RelatedPRI_1.PlayerName$" is Dominating!"); break; case 20: SendIRCMessage(conf.colHigh$RelatedPRI_1.PlayerName$" is Unstoppable!"); break; case 25: SendIRCMessage(conf.colHigh$RelatedPRI_1.PlayerName$" is Godlike!"); break; } } } // Advertising :> function OnAdvertise() { BroadCastMessage("This match is being broadcasted to: "$conf.Channel); bDoneAd = True; } // Game Over Check Function function bool CheckGameOver() { if (Level.Game.bGameEnded) return TRUE; else return FALSE; } // Game Over event function OnGameOver() { Link.ResetQueue(); SendIRCMessage(conf.colHigh$"Game has ended!"); PostPlayerStats(); } // Detailed Game Information function OnGameDetails() { local int i; local PlayerReplicationInfo lPRI, bestPRI; // Get the best PRI for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if( lPRI == None) continue; if(bestPRI==None) bestPRI = TGRI.PRIArray[i]; if (bestPRI.Score <= lPRI.Score) bestPRI = TGRI.PRIArray[i]; } // Post Stuff SendIRCMessage(" "); SendIRCMessage(conf.colGen$"** Game Details:"); SendIRCMessage(">> "$conf.colHead$"Timelimit / Fraglimit:" $conf.colBody$" "$TGRI.TimeLimit $ " / " $ TGRI.Fraglimit); SendIRCMessage("> " $ GetTeamColor(bestPRI.Team) $ bestPRI.PlayerName $ conf.colHead $ " is in the lead with"$conf.colHigh$" "$string(int(bestPRI.Score))$conf.colHead$" frags!"); SendIRCMessage(" "); } // Detailed Score Information function OnScoreDetails() { } // Post Player Statistics function PostPlayerStats() { local int i; local PlayerReplicationInfo lPRI; local string sBot; SendIRCMessage(" ", TRUE); SendIRCMessage(conf.colGen$"** Final Player Status:", TRUE); if(Link.bUTGLEnabled) SendIRCMessage(conf.colHead$PostPad("Name", 22, " ") $ "| " $ PrePad("Login", 15, " ") $ "| " $ PrePad("Frags", 5, " ") $ " | " $ PrePad("Death", 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " |", TRUE); else SendIRCMessage(conf.colHead$PostPad("Name", 22, " ") $ "| " $ PrePad("Frags", 5, " ") $ " | " $ PrePad("Death", 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " |", TRUE); for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if(lPRI==None) continue; if (!lPRI.bIsSpectator) { if (lPRI.bIsABot) sBot = " (Bot)"; else sBot = ""; if(Link.bUTGLEnabled) SendIRCMessage("> "$conf.colHead$PostPad(lPRI.PlayerName $ sBot, 20, " ") $ conf.colHead $ "| " $ conf.colBody $ PrePad(Spec.ServerMutate("getlogin "$lPRI.PlayerName), 15, " ") $ "| " $ conf.colBody $ PrePad(string(int(lPRI.Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(int(lPRI.Deaths)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.Ping), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.PacketLoss)$"%", 4, " ") $ conf.colHead $ " |", TRUE); else SendIRCMessage("> "$conf.colHead$PostPad(lPRI.PlayerName $ sBot, 20, " ") $ conf.colHead $ "| " $ conf.colBody $ PrePad(string(int(lPRI.Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(int(lPRI.Deaths)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.Ping), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(lPRI.PacketLoss)$"%", 4, " ") $ conf.colHead $ " |", TRUE); } } SendIRCMessage(" ", TRUE); } // Set the GameInformation function string SetGameInfo() { return conf.ColHead $ "Currently Playing:" $ conf.colBody $ " " $ Level.Title $ " (" $ TGRI.GameName $ ")" $ conf.colHead $ " on " $ conf.colBody $ Level.Game.GameReplicationInfo.ServerName; } /////////////////////////////////////////////////////////////////// // Query of the Current Map (overriden) function QueryMap(string sNick) { Link.SendNotice(sNick, "Currently Reporting: "$Level.Title$" ("$TGRI.GameName$") on "$Level.Game.GameReplicationInfo.ServerName); } // Query of the Current Gameinfo (overridden) function QueryInfo(string sNick) { // Send some nifty stuff to the user! Link.SendNotice(sNick, "*** Detailed Game Information for "$Level.Title$":"); Link.SendNotice(sNick, ">> Timelimit / Fraglimit: "$TGRI.TimeLimit $ " / " $ TGRI.Fraglimit); if (TGRI.TimeLimit > 0) Link.SendNotice(sNick, ">> Time Remaining: "$GetStrTime(TGRI.RemainingTime)); else Link.SendNotice(sNick, ">> Elapsed Time: "$GetStrTime(TGRI.ElapsedTime)); } // Query of the Current Spectator List (overridden) function QuerySpecs(string sNick) { local int i, iNum; local Spectator lSpec; Link.SendNotice(sNick, "*** Spectator List for "$Level.Game.GameReplicationInfo.ServerName$":"); // List our Speccs iNum = 0; foreach AllActors(class'Spectator', lSpec) { if (lSpec.bIsPlayer && NetConnection(lSpec.Player) != None) { if(Link.bUTGLEnabled) Link.SendNotice(sNick, "> "$lSpec.PlayerReplicationInfo.PlayerName$" - Login: "$Spec.ServerMutate("getlogin "$lSpec.PlayerReplicationInfo.PlayerName)); else Link.SendNotice(sNick, "> "$lSpec.PlayerReplicationInfo.PlayerName); iNum++; } } if (iNum == 0) Link.SendNotice(sNick, ">> No specs on server!"); } // Query of the Current Player List (overridden) function QueryPlayers(string sNick) { local int i, iNum; local string sMessage; local TournamentPlayer lPlr; local PlayerReplicationInfo lPRI; Link.SendNotice(sNick, "*** Player List for "$Level.Game.GameReplicationInfo.ServerName$":"); iNum = 0; foreach AllActors(class'TournamentPlayer', lPlr) { lPRI = lPlr.PlayerReplicationInfo; if (iNum > 0) sMessage = sMessage $ ", "; if(Link.bUTGLEnabled) sMessage = sMessage $ lPRI.PlayerName $ " - Login: "$Spec.ServerMutate("getlogin "$lPRI.PlayerName)$" ("$string(int(lPRI.Score))$")"; else sMessage = sMessage $ lPRI.PlayerName $ " ("$string(int(lPRI.Score))$")"; iNum++; } if (iNum == 0) sMessage = "No players on server!"; Link.SendNotice(sNick, ">> "$sMessage); } // Query of the Current Scores (overridden) function QueryScore(string sNick) { QueryPlayers(sNick); } CLg////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterStats_CTF expands MvReporterStats_TDM; // Variables to store the Name & Type of the Last Frag (& the message) var string lastMessage, lastKiller, lastVictim; var int lastSwitch; var string droppedName, droppedMessage; var bool isStateDropping; // Override InLocalizedMessage Function function InLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string sHigh, Player_1, Player_2; sHigh = ""; // *** SUDDEN DEATH / TEAM CHANGE *** if (ClassIsChildOf(Message, class'BotPack.DeathMatchMessage')) { switch(Switch) { // Overtime :) case 0: SendIRCMessage(GetColoredMessage("", conf.colHigh, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); return; // Team Change case 3: SendIRCMessage(GetColoredMessage("* ", conf.colGen, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); return; } } // *** FIRST BLOOD MESSAGE *** if (ClassIsChildOf(Message, class'BotPack.FirstBloodMessage')) { if (RelatedPRI_1.PlayerName == lastKiller) SendIRCMessage(lastMessage); sendIRCMessage(GetColoredMessage("", conf.colHigh, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); } // *** FRAG Messages *** if (ClassIsChildOf(Message, class'BotPack.DeathMessagePlus')) { // Save our message (maybe we need it l8er) lastKiller = RelatedPRI_1.PlayerName; lastVictim = RelatedPRI_2.PlayerName; lastSwitch = Switch; lastMessage = GetColoredMessage("", conf.colHead, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); // If we have a flag drop in progress -> post that too // if (isStateDropping && (((droppedName == RelatedPRI_2.PlayerName) && (Related_PRI2 != none)) || ((droppedName == RelatedPRI_1.PlayerName) && (RelatedPRI_2 == none))){ if (isStateDropping && (((RelatedPRI_2 == none) && (RelatedPRI_1.PlayerName == droppedName)) || ((RelatedPRI_2.PlayerName == droppedName) && (RelatedPRI_2 != none)) )) { isStateDropping = FALSE; SendIRCMessage(lastMessage); } // Killing Spree ? ProcessKillingSpree(Switch, RelatedPRI_1, RelatedPRI_2); return; } // *** CTF Messages *** if (ClassIsChildOf(Message, class'BotPack.CTFMessage')) { switch (Switch) { // The Flag has been captured! case 0: SendIRCMessage(conf.colGen$ircUnderline$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); SendScoreLine("New Score: "); return; // Dropped the Flag / Just store the Message to get it shown @ the next frag case 2: isStateDropping = TRUE; droppedName = RelatedPRI_1.PlayerName; droppedMessage = conf.colGen$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); SendIRCMessage(droppedMessage); break; default: SendIRCMessage(conf.colGen$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); return; } } } // Override Game Over event function OnGameOver() { SendIRCMessage(conf.colHigh$"Game has ended!"); SendScoreBoard("** Final Score Information:", TRUE); } // Override Score Details function OnScoreDetails() { local PlayerReplicationInfo lPRI, BestPRI; local CTFFlag lFLAG; local int i; SendScoreBoard("** Current Score: "); // Search for Flag Carriers and spamm them for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if(lPRI==None) continue; if(bestPRI == none) bestPRI = lPRI; else if (bestPRI.Score <= lPRI.Score) bestPRI = lPRI; if (!lPRI.bIsSpectator) { lFLAG = CTFFlag(lPRI.HasFlag); if (lFLAG != none) SendIRCMessage(">> "$conf.colHead$lPRI.PlayerName$" has the "$conf.sTeams[lFLAG.Team]$" flag!"); } } SendIRCMessage(">> " $ conf.colHead $ bestPRI.PlayerName $ " is in the lead with"$conf.colHigh$" "$string(int(bestPRI.Score))$conf.colHead$" frags!"); } // Send the CTF ScoreLine function SendScoreLine(string sPreFix) { local int iScore[4]; SendIRCMessage(conf.colGen$sPreFix$GetTeamColor(0)$conf.sTeams[0]$" "$string(int(TeamGamePlus(Level.Game).Teams[0].Score))$ircColor$":"$GetTeamColor(1)$ircBold$ircBold$string(int(TeamGamePlus(Level.Game).Teams[1].Score))$" "$conf.sTeams[1]); } // Send the CTF ScoreBoard! function SendScoreBoard(string sHeadLine, optional bool bTime) { local int i, iT; local PlayerReplicationInfo lPRI; local int iPingsArray[4], iPLArray[4]; // Head if (bTime) SendIRCMessage(" ", bTime); SendIRCMessage(conf.colGen$sHeadLine, bTime); // Get Ping & PL 4 ScoreBoard for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if(lPRI==None) continue; if (!lPRI.bIsSpectator && lPRI.Team == iT && !lPRI.bIsABot) { iPingsArray[iT] += lPRI.Ping; iPLArray[iT] += lPRI.PacketLoss; } } } // Spamm out our stuff :) SendIRCMessage(conf.colHead$PostPad("Team-Name", 22, " ") $ "| " $ PrePad(sScoreStr, 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " | " $ PrePad("PPL", 3, " ") $ " |", bTime); for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iPingsArray[iT] = iPingsArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; iPLArray[iT] = iPLArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; SendIRCMessage("> "$GetTeamColor(iT)$PostPad(conf.sTeams[iT], 20, " ") $ conf.colHead $ "| " $ GetTeamColor(iT) $ PrePad(string(int(TeamGamePlus(Level.Game).Teams[iT].Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPingsArray[iT]), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPLArray[iT])$"%", 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(TeamGamePlus(Level.Game).Teams[iT].Size, 3, " ") $ conf.colHead $ " |", bTime); } if (bTime) SendIRCMessage(" ", bTime); } CVK&(Reporter quit!-@(? Cs////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterStats_BT expands MvReporterStats_TDM; // Variables to store the Name & Type of the Last Frag (& the message) var string lastMessage, lastKiller, lastVictim; var int lastSwitch; var string droppedName, droppedMessage; var bool isStateDropping; var string DiedMsg; // Override InLocalizedMessage Function function InLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { local string sHigh, Player_1, Player_2, TmpStr; local int Team; sHigh = ""; // *** SUDDEN DEATH / TEAM CHANGE *** if (ClassIsChildOf(Message, class'BotPack.DeathMatchMessage')) { switch(Switch) { // Overtime :) case 0: SendIRCMessage(GetColoredMessage("", conf.colHigh, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); return; // Team Change case 3: SendIRCMessage(GetColoredMessage("* ", conf.colGen, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); return; } } // *** FRAG Messages *** if (ClassIsChildOf(Message, class'BotPack.DeathMessagePlus')) { // Save our message (maybe we need it l8er) if(RelatedPRI_2 == None) { lastVictim = RelatedPRI_1.PlayerName; Team = RelatedPRI_1.Team; } else { lastVictim = RelatedPRI_2.PlayerName; Team = RelatedPRI_2.Team; } lastSwitch = Switch; if(RelatedPRI_2 != None && RelatedPRI_1 != None) { if(RelatedPRI_2.Team != RelatedPRI_1.Team) lastMessage = GetColoredMessage("", conf.colHead, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } else { TmpStr = Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); if(InStr(TmpStr, " was slimed.") != -1 || InStr(TmpStr, " was incinerated.") != -1) lastMessage = GetColoredMessage("", conf.colHead, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); else lastMessage = conf.colHead$GetTeamColor(Team)$lastVictim$ircClear$conf.ColHead@"has died !"; } DiedMsg = lastMessage; SetTimer(0.05, false); SetTimer(3, TRUE); return; } // *** CTF Messages *** if (ClassIsChildOf(Message, class'BotPack.CTFMessage')) { switch (Switch) { // The Flag has been captured! case 0: SendIRCMessage(conf.colGen$ircUnderline$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); SendScoreLine("New Score: "); return; // Dropped the Flag / Just store the Message to get it shown @ the next frag case 6: SendIRCMessage(conf.colGen$ircUnderline$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); break; case 2: isStateDropping = TRUE; droppedName = RelatedPRI_1.PlayerName; droppedMessage = conf.colGen$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); break; default: SendIRCMessage(conf.colGen$Message.static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject)); break; } } if(Switch==0) { DiedMsg=""; droppedMessage=""; SendIRCMessage(conf.colGen$ircUnderline$GetTeamColor(RelatedPRI_1.Team)$RelatedPRI_1.PlayerName$ircClear$conf.ColHead$ircUnderline@"has captured the flag !"$ircClear$conf.ColHead$" (Best Time: "$ProcessScore(RelatedPRI_1.Score)$")"); SendScoreLine("New Score: "); return; } } // Override Game Over event function OnGameOver() { SendIRCMessage(conf.colHigh$"Game has ended!"); SendScoreBoard("** Final Score Information:", TRUE); } // Override Score Details function OnScoreDetails() { local PlayerReplicationInfo lPRI, BestPRI; local CTFFlag lFLAG; local int i; SendScoreBoard("** Current Score: "); // Search for Flag Carriers and spamm them for (i = 0; i < 32; i++) { if(TGRI.PRIArray[i] == none || TGRI.PRIArray[i].bIsSpectator) continue; lPRI = TGRI.PRIArray[i]; if (bestPRI == None) bestPRI = lPRI; else if ( !bBTScores && bestPRI.Score <= lPRI.Score ) bestPRI = lPRI; else if ( bBTScores && bestPRI.Score >= lPRI.Score ) bestPRI = lPRI; lFLAG = CTFFlag(lPRI.HasFlag); if (lFLAG != none) SendIRCMessage(">> "$conf.colHead$lPRI.PlayerName$" has the "$conf.sTeams[lFLAG.Team]$" flag!"); } if(bBTScores && bestPRI.Score!=0) SendIRCMessage(">> " $ conf.colHead $ bestPRI.PlayerName $ " has the best CapTime -"$conf.colHigh$" "$ProcessScore(bestPRI.Score)$conf.colHead$" !"); } // Send the CTF ScoreLine function SendScoreLine(string sPreFix) { local int iScore[4]; SendIRCMessage(conf.colGen$sPreFix$GetTeamColor(0)$conf.sTeams[0]$" "$string(int(TeamGamePlus(Level.Game).Teams[0].Score))$ircColor$":"$GetTeamColor(1)$ircBold$ircBold$string(int(TeamGamePlus(Level.Game).Teams[1].Score))$" "$conf.sTeams[1]); } // Send the CTF ScoreBoard! function SendScoreBoard(string sHeadLine, optional bool bTime) { local int i, iT; local PlayerReplicationInfo lPRI; local int iPingsArray[4], iPLArray[4]; // Head if (bTime) SendIRCMessage(" ", bTime); SendIRCMessage(conf.colGen$sHeadLine, bTime); // Get Ping & PL 4 ScoreBoard for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if ((lPRI != none) && (!lPRI.bIsSpectator) && (lPRI.Team == iT) && !lPRI.bIsABot) { iPingsArray[iT] += lPRI.Ping; iPLArray[iT] += lPRI.PacketLoss; } } } // Spamm out our stuff :) SendIRCMessage(conf.colHead$PostPad("Team-Name", 22, " ") $ "| " $ PrePad(sScoreStr, 5, " ") $ " | " $ PrePad("Ping", 4, " ") $ " | " $ PrePad("PL", 4, " ") $ " | " $ PrePad("PPL", 3, " ") $ " |", bTime); for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iPingsArray[iT] = iPingsArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; iPLArray[iT] = iPLArray[iT] / TeamGamePlus(Level.Game).Teams[iT].Size; SendIRCMessage("> "$GetTeamColor(iT)$PostPad(conf.sTeams[iT], 20, " ") $ conf.colHead $ "| " $ GetTeamColor(iT) $ PrePad(string(int(TeamGamePlus(Level.Game).Teams[iT].Score)), 5, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPingsArray[iT]), 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(string(iPLArray[iT])$"%", 4, " ") $ conf.colHead $ " | " $ conf.colBody $ PrePad(TeamGamePlus(Level.Game).Teams[iT].Size, 3, " ") $ conf.colHead $ " |", bTime); } if (bTime) SendIRCMessage(" ", bTime); } function string ProcessScore(int Score) { local int intScore, secs; local string sec; if(bBTScores) { if(Score==0) return "0:00"; else { intScore = 2000 - Score; if ( intScore > 1 && intScore < 1999 ) { secs = int(intScore % 60); if ( secs < 10 ) sec = "0" $string(secs); else sec = "" $string(secs); return string(intScore / 60) $":" $sec; } } } return string(Score); } // Query of the Current Gameinfo (overridden) function QueryInfo(string sNick) { // Send some nifty stuff to the user! Link.SendNotice(sNick, "*** Detailed Game Information for "$Level.Title$":"); Link.SendNotice(sNick, ">> Timelimit / Caplimit: "$TGRI.TimeLimit $ " / " $ string(int(Level.ConsoleCommand("get "$string(Level.Game.class)$" GoalTeamScore")))); if (TGRI.TimeLimit > 0) Link.SendNotice(sNick, ">> Time Remaining: "$GetStrTime(TGRI.RemainingTime)); else Link.SendNotice(sNick, ">> Elapsed Time: "$GetStrTime(TGRI.ElapsedTime)); } // Our Timer Event event Timer() { local bool bSentDrop, bSentDied; if(conf.bSecondaryLink) { if (!Link.bIsConnected || !Link2.bIsConnected) return; } else if (!Link.bIsConnected) return; if(droppedMessage!="") { SendIRCMessage(droppedMessage); droppedMessage=""; bSentDrop=True; } if(DiedMsg!="") { SendIRCMessage(DiedMsg); DiedMsg=""; bSentDied=True; } if(bSentDrop || bSentDied) return; // Beim ersten durchlauf! if ((iTimerCnt == 0) && (bFirstRun == TRUE)) { bFirstRun = FALSE; SendIRCMessage("Mavericks IRC Reporter "$Link.Controller.sVersion, TRUE); SendIRCMessage(conf.colHigh $ "*** " $ sGameInfo); } // Advertising if (!bDoneAd && conf.bAdvertise) { if (TGRI.Timelimit == 0) { if (TGRI.ElapsedTime > 0) OnAdvertise(); } else { //BroadcastMessage(string(TGRI.Timelimit)$" - "$string(TGRI.RemainingTime)$" = "$string(TGRI.Timelimit - TGRI.RemainingTime)); if ((TGRI.Timelimit * 60 - TGRI.RemainingTime) > 0) OnAdvertise(); } } // Map Info (Mapname/Gamename/ServerURL) if ((iTimerCnt % iGameInfoDelay) == 0) { if ((TGRI.NumPlayers > 0) && (iTimerCnt != 0)) SendIRCMessage(conf.colHigh $ "*** " $ sGameInfo); } // Detailed Game Information if (((iTimerCnt % iGameDetailsDelay) == 0) && (iTimerCnt > 0) && (TGRI.NumPlayers > 0)) { if (!Level.Game.bGameEnded) OnGameDetails(); } // Detailed Score Information if (((iTimerCnt % iScoreDetailsDelay) == 0) && (iTimerCnt > 0) && (TGRI.NumPlayers > 0)) { if (!Level.Game.bGameEnded) OnScoreDetails(); } // Check whether the game is over or not if (Level.Game.bGameEnded && (!bGameOver)) { bGameOver = TRUE; OnGameOver(); } // Increase Counter 4 Timer if (iTimerCnt > 3600) iTimerCnt = 0; else iTimerCnt += 5; } // Override QueryPlayers function to provide team based colors function QueryPlayers(string sNick) { local int i, iT, iNum, iAll; local string sMessage; local TournamentPlayer lPlr; local PlayerReplicationInfo lPRI; Link.SendNotice(sNick, "*** Player List for "$Level.Game.GameReplicationInfo.ServerName$":"); iAll = 0; for (iT = 0; iT < TeamGamePlus(Level.Game).MaxTeams; iT++) { iNum = 0; sMessage = ""; foreach AllActors(class'TournamentPlayer', lPlr) { lPRI = lPlr.PlayerReplicationInfo; if (lPRI.Team == iT) { if (iNum > 0) sMessage = sMessage$", "; else sMessage = conf.colHead$conf.sTeams[iT]$": "$ircColor; if(Link.bUTGLEnabled) sMessage = sMessage $ GetTeamColor(iT) $ ircBold $ ircBold $ lPRI.PlayerName $ " - Login: "$ Spec.ServerMutate("getlogin "$lPRI.PlayerName) $ conf.colBody $ " ("$ProcessScore(lPRI.Score)$")"; else sMessage = sMessage $ GetTeamColor(iT) $ ircBold $ ircBold $ lPRI.PlayerName $ conf.colBody $ " ("$ProcessScore(lPRI.Score)$")"; iNum++; iAll++; } } if (iNum > 0) Link.SendNotice(sNick, ">> "$sMessage); } if (iAll == 0) Link.SendNotice(sNick, ">> No players on server!"); } py nYXz yVpK@1CZ}"#xx{#UwwK{#U&{#Uw{#U{#Uw{#UKKwK ᘗKK ,4vgww;(;(;(;(;(w;(@1C;(@1C@1CKK;(@1C;(K;(K;(w}"#;({#U{#U{#U{#U{#Uw}"#}"#}"#ww}"#wwwwww}"#www}"#}"#w;(;({#U;({#U{#U{#U{#U{#Uw{#Uwj\{#Uw{#Uw{#Uwwww{#U{#U{#U{#U{#U{#UwElwwwwElwEl{#UwElwElw{#U{#Uww{#U %]Caps)"+",:"CCU////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterStats_1on1 expands MvReporterStats_DM; // Override Set Gameinfo :) function string SetGameInfo() { return conf.ColHead $ "Playing 1on1 on" $ conf.colBody $ " " $ Level.Title $ conf.colHead $ ", Server: " $ conf.colBody $ Level.Game.GameReplicationInfo.ServerName; } // Override Detailed Game Information function OnGameDetails() { local int i; local string sName_1, sName_2, sScore_1, sScore_2; local PlayerReplicationInfo lPRI, lPRI_1, lPRI_2; SendIRCMessage(conf.colHigh$"*** "$sGameInfo); // Post Results! for (i = 0; i < 32; i++) { lPRI = TGRI.PRIArray[i]; if(lPRI==None) continue; if (!lPRI.bIsSpectator) if (lPRI_1 != none) lPRI_2 = lPRI; else lPRI_1 = lPRI; } if (lPRI_1 == none) { sScore_1 = "--"; sName_1 = "nobody"; } else { sScore_1 = string(int(lPRI_1.Score)); sName_1 = lPRI_1.PlayerName; } if (lPRI_2 == none) { sScore_2 = "--"; sName_2 = "nobody"; } else { sScore_2 = string(int(lPRI_2.Score)); sName_2 = lPRI_2.PlayerName; } if(Link.bUTGLEnabled) SendIRCMessage(">>"$conf.colHead$" Current Score:"$ircColor$"4 "$sName_1$" - Login: "$Spec.ServerMutate("getlogin "$sName_1)$" "$sScore_1$ircColor$":"$ircColor$"12"$ircBold$ircBold$sScore_2$" "$sName_2$" - Login: "$Spec.ServerMutate("getlogin "$sName_2)); else SendIRCMessage(">>"$conf.colHead$" Current Score:"$ircColor$"4 "$sName_1$" "$sScore_1$ircColor$":"$ircColor$"12"$ircBold$ircBold$sScore_2$" "$sName_2); } Cu KN5]KcolGen?colGen]_KcolTimeV?colTime_`KcolHead?colHead`aKcolBody ?colBodyabKcolHigh?colHighbcKcolRedq?colRedceKcolBlueY?colBlueegKcolGreenE?colGreengdKcolGoldl?colGolddm{KApply] &V_ &` & a &b &qc &Ye &Eg &ld &1?PostActionteam?mvr_main_color.uhtm? CX;////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // // Generic Stats Class (MvReporter2.MvReporterStats) // ////////////////////////////////////////////////////////////////////////// class MvReporterStats expands Actor; // Link to our IRC Interface (IMPORTANT) var MvReporterIRCLink Link; var MvReporterIRCLink2 Link2; var MvReporterSpectator Spec; var MvReporterConfig conf; var LevelInfo Level; var GameReplicationInfo GRI; // Declare some Variables var string ircBold; var string ircColor; var string ircUnderline; var string ircClear; var bool bBTScores; // Initialization Function function Initialize() { if((Left(string(Level), 3)=="BT-" || Left(string(Level), 5)=="CTF-BT-") && string(Level.Game.class)!="BotPack.CTFGame") { bBTScores=True; } Log("MvReporter2: Stats Actor Initialized"); } // Recieve General Messages (Joins, Parts, etc) function InClientMessage(coerce string S, optional name Type, optional bool bBeep) { } // Recieve Say Messages function InTeamMessage(PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { } // Recieve Localized Messages function InLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { } // Recieve Taunts function InVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { } static function string PrePad (coerce string S, int Size, string Pad) { if (Len(S) > Size) return Left(S, Size-3)$"..."; while (Len(S) < Size) S = Pad $ S; return S; } static function string PostPad (coerce string S, int Size, string Pad) { if (Len(S) > Size) return Left(S, Size-3)$"..."; while (Len(S) < Size) S = S $ Pad; return S; } function string GetStrTime(int Time) { local int m; local int s; // local string str; m = (Time % 3600) / 60; s = Time % 60; return PrePad(string(m),2,"0") $ ":" $ PrePad(string(s),2,"0"); } function String GetClientVoiceMessageString(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { local VoicePack V; local String sStr; if ((Sender == None) || (Sender.voicetype == None)) return ""; V = Spawn(Sender.voicetype, self); if (V == none) return ""; if (messagetype == 'ACK') sStr = sStr $ ChallengeVoicePack(V).static.GetAckString(messageID); else { if (recipient != none) { sStr = sStr $ ChallengeVoicePack(V).GetCallSign(Recipient); } if (messagetype == 'FRIENDLYFIRE') { sStr = sStr $ ChallengeVoicePack(V).static.GetFFireString(messageID); } else if (messagetype == 'TAUNT') { sStr = sStr $ ChallengeVoicePack(V).static.GetTauntString(messageID); } else if (messagetype == 'AUTOTAUNT') { sStr = sStr $ ChallengeVoicePack(V).static.GetTauntString(messageID); sStr = ""; } else if (messagetype == 'ORDER') { sStr = sStr $ ChallengeVoicePack(V).static.GetOrderString(messageID, "Deathmatch"); } else { sStr = sStr $ ChallengeVoicePack(V).static.GetOtherString(messageID); } } V.Destroy(); return sStr; } // IRC Queries function QueryMap(string sNick) { } function QueryInfo(string sNick) { } function QuerySpecs(string sNick) { } function QueryPlayers(string sNick) { } function QueryScore(string sNick) { } CWK////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // // Spectator Class (MvReporter2.MvReporterSpectator) // ////////////////////////////////////////////////////////////////////////// class MvReporterSpectator expands MessagingSpectator; // Our master controller var MvReporter Controller; var MvReporterIRCLink Link; var MvReporterIRCLink2 Link2; var MvReporterStats Stats; var string LastMessage; // Init function function Engage(MvReporter InController, MvReporterIRCLink InLink, MvReporterIRCLink2 InLink2) { local Class StatsClass; local MvReporterMutator_1on1 Mut1on1; local Actor OutActor; local Mutator M; local string GameClass; local bool bOneOnOne; bOneOnOne = false; Controller = InController; Link = InLink; Link2 = InLink2; // OK, now determine the gametype and spawn the specific Reporter Class, we are able to access from here! GameClass = caps(GetItemName(string(Level.Game.Class))); switch(GameClass) { case "DEATHMATCHPLUS": case "EUTDEATHMATCHPLUS": if (Level.Game.MaxPlayers == 2) { StatsClass = class'MvReporterStats_1on1'; bOneOnOne = true; } else StatsClass = class'MvReporterStats_DM'; break; case "TEAMGAMEPLUS": case "EUTTEAMGAMEPLUS": StatsClass = class'MvReporterStats_TDM'; break; case "CTFGAME": case "SMARTCTFGAME": StatsClass = class'MvReporterStats_CTF'; break; default: StatsClass = class'MvReporterStats_DM'; break; } if (Controller.conf.bExtra1on1Stats && (bOneOnOne)) { Level.Game.BaseMutator.AddMutator(Level.Game.Spawn(class'MvReporterMutator_1on1')); M = Level.Game.BaseMutator; while (M.NextMutator != None) { if (InStr(string(M.Class),"MvReporterMutator_1on1") != -1) break; else M = M.NextMutator; } Mut1on1 = MvReporterMutator_1on1(M); Mut1on1.Link = Link; Mut1on1.conf = Controller.conf; } // Spawn Actor n0w Stats = Spawn(StatsClass); // Check wheter spawn was success if (Stats == none) Log("MvReporter2: Unable to spawn Stats Class!"); else { Stats.Link = Link; Stats.Link2 = Link2; Link.Link2 = Link2; Link.Spec = self; if ( Mut1on1 != None ) Mut1on1.Stats = MvReporterStats_1on1(Stats); if(Controller.conf.bSecondaryLink) Link.AntiFloodDelay = Controller.conf.AntiFloodDelay/2; else Link.AntiFloodDelay = Controller.conf.AntiFloodDelay; Stats.Spec = self; Stats.conf = Controller.conf; Stats.Level = Level; Stats.GRI = Level.Game.GameReplicationInfo; Stats.Initialize(); } } function ClientMessage(coerce string S, optional name Type, optional bool bBeep ) { if(Type=='None') LastMessage=S; if(Stats!=None) Stats.InClientMessage(S, Type, bBeep); } function TeamMessage(PlayerReplicationInfo PRI, coerce string S, name Type, optional bool bBeep ) { Stats.InTeamMessage(PRI, S, Type, bBeep); } function ReceiveLocalizedMessage( class Message, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) { Stats.InLocalizedMessage(Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); } function ClientVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID) { Stats.InVoiceMessage(Sender, Recipient, messagetype, messageID); } function string ServerMutate(string MutateString) { local String Str; local Mutator Mut; Mut = Level.Game.BaseMutator; Mut.Mutate(MutateString, Self); return LastMessage; } //function ClientReceive(PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject){ //function ClientMessage( coerce string S, optional Name Type, optional bool bBeep ) { // BroadCastMessage("Client Recieve Event!"); //} CCclass MvReporterMutator_1on1 expands Mutator; var MvReporterIRCLink Link; var MvReporterStats_1on1 Stats; var MvReporterConfig conf; function bool HandlePickupQuery(Pawn Other, Inventory item, out byte bAllowPickup) { local PlayerReplicationInfo PRI; PRI = Other.PlayerReplicationInfo; if(Item.IsA('ThighPads')) Stats.SendIRCMessage(Stats.GetTeamColor(PRI.Team)$PRI.PlayerName$Stats.ircClear@"has picked up"@conf.colBody$"ThighPads."); else if(Item.IsA('Armor2')) Stats.SendIRCMessage(Stats.GetTeamColor(PRI.Team)$PRI.PlayerName$Stats.ircClear@"has picked up an"@conf.colGreen$"Armor."); else if(Item.IsA('UT_Jumpboots')) Stats.SendIRCMessage(Stats.GetTeamColor(PRI.Team)$PRI.PlayerName$Stats.ircClear@"has picked up"@conf.colGen$"Jumpboots."); else if(Item.IsA('UT_Shieldbelt')) Stats.SendIRCMessage(Stats.GetTeamColor(PRI.Team)$PRI.PlayerName$Stats.ircClear@"has picked up a"@conf.colGold$"Shieldbelt."); else if(Item.IsA('HealthPack')) Stats.SendIRCMessage(Stats.GetTeamColor(PRI.Team)$PRI.PlayerName$Stats.ircClear@"has picked up a"@conf.colGold$"HealthPack."); if ( NextMutator != None ) return NextMutator.HandlePickupQuery(Other, item, bAllowPickup); } CDclass MvReporterMutator expands Mutator; var MvReporterConfig conf; var MvReporterIRCLink Link; var MvReporterIRCLink2 Link2; var MvReporter Controller; function Mutate(string MutateString, PlayerPawn Sender) { local string CommandString; local String ValueString; if ( NextMutator != None ) NextMutator.Mutate(MutateString, Sender); if(Left(MutateString, 9) == "mvrstatus") Sender.ClientMessage("True"); if(Sender.bAdmin) { if(Left(MutateString, 4) ~= "mvr ") { CommandString=Mid(MutateString, 4); if(Left(CommandString , 5) ~= "START") { if(!Link.bIsConnected) Link.Connect(Controller, conf); if(conf.bSecondaryLink && !Link2.bIsConnected) Link2.Connect(Controller, conf); Sender.ClientMessage("Done."); } else if(Left(CommandString , 4) ~= "STOP") { Link.Disconnect(); if(conf.bSecondaryLink) Link2.Disconnect(); Sender.ClientMessage("Done."); } else if(Left(CommandString, 7) ~= "RESTART") { Link.RelaunchReporter("Reporter restart ..."); if(conf.bSecondaryLink) Link2.RelaunchReporter("Reporter restart ..."); Sender.ClientMessage("Done."); } else if(Left(CommandString, 6) ~= "STATUS") { if(conf.bSecondaryLink) { if(Link.bIsConnected && Link2.bIsConnected) Sender.ClientMessage("Connected"); else if(Link.bIsConnected && !Link2.bIsConnected) Sender.ClientMessage("Link2 disconnected"); else Sender.ClientMessage("Disconnected"); } else { if(Link.bIsConnected) Sender.ClientMessage("Connected"); else Sender.ClientMessage("Disconnected"); } } else if(Left(CommandString, 10) ~= "MUTEOUTPUT") { if (!conf.bMuted) Link.SendMessage(conf.colHigh$"*** "$conf.colHead$"Output has been muted."); conf.bMuted = !conf.bMuted; conf.SaveConfig(); if (!conf.bMuted) Link.SendMessage(conf.colHigh$"*** "$conf.colHead$"Output has been un-muted."); Sender.ClientMessage("Applied."); } //For SuperWebAdmin compatibility else if(Left(CommandString, 10) ~= "MUTESTATUS") { if(conf.bMuted) Sender.ClientMessage("1"); else Sender.ClientMessage("0"); } //For SuperWebAdmin compatibility else if(Left(CommandString, 13) ~= "PUBCOMSSTATUS") { if(conf.bPublicComs) Sender.ClientMessage("1"); else Sender.ClientMessage("0"); } else if(Left(CommandString, 7) ~= "PUBCOMS") { if (!conf.bPublicComs) Link.SendMessage(conf.colHigh$"*** "$conf.colHead$"Public Commands have been enabled."); conf.bPublicComs = !conf.bPublicComs; conf.SaveConfig(); if (!conf.bPublicComs) Link.SendMessage(conf.colHigh$"*** "$conf.colHead$"Public Commands have been disabled."); Sender.ClientMessage("Applied."); } else if(Left(CommandString, 4) ~= "SET ") { CommandString=Mid(CommandString, 4); ValueString=SepRight(CommandString); switch(SepLeft(Caps(CommandString))$" ") { case "ADMINPASSWORD ": conf.AdminPassword = ValueString; Sender.ClientMessage("Applied."); break; case "SERVERADDR ": conf.ServerAddr = ValueString; Sender.ClientMessage("Applied."); break; case "SERVERPORT ": conf.ServerPort = int(ValueString); Sender.ClientMessage("Applied."); break; case "ANTIFLOODDELAY ": conf.AntiFloodDelay = float(ValueString); Sender.ClientMessage("Applied."); break; case "CHANNEL ": conf.Channel = ValueString; Sender.ClientMessage("Applied."); break; case "NICKNAME ": conf.Nickname = ValueString; Sender.ClientMessage("Applied."); break; case "NICKNAME2 ": conf.Nickname2 = ValueString; Sender.ClientMessage("Applied."); break; case "USERNAME ": conf.Username = ValueString; Sender.ClientMessage("Applied."); break; case "USERNAME2 ": conf.Username2 = ValueString; Sender.ClientMessage("Applied."); break; case "PASSWORD ": conf.Password = ValueString; Sender.ClientMessage("Applied."); break; case "PASSWORD2 ": conf.Password2 = ValueString; Sender.ClientMessage("Applied."); break; case "AUTHNAME ": conf.AuthName = ValueString; Sender.ClientMessage("Applied."); break; case "AUTHPASSWORD ": conf.AuthPassword = ValueString; Sender.ClientMessage("Applied."); break; case "PERFORM1 ": conf.Perform1 = ValueString; Sender.ClientMessage("Applied."); break; case "PERFORM2 ": conf.Perform2 = ValueString; Sender.ClientMessage("Applied."); break; case "PERFORM3 ": conf.Perform3 = ValueString; Sender.ClientMessage("Applied."); break; case "BUSELOGIN ": if(ValueString == "True") conf.bUseLogin = True; else if(ValueString == "False" || ValueString=="") conf.bUseLogin = False; Sender.ClientMessage("Applied."); break; case "BUSEAUTH ": if(ValueString == "True") conf.bUseAuth = True; else if(ValueString == "False" || ValueString=="") conf.bUseAuth = False; Sender.ClientMessage("Applied."); break; case "BSECONDARYLINK ": if(ValueString == "True") conf.bSecondaryLink = True; else if(ValueString == "False" || ValueString=="") conf.bSecondaryLink = False; Sender.ClientMessage("Applied."); break; case "TEAMRED ": conf.TeamRed = ValueString; Sender.ClientMessage("Applied."); break; case "TEAMBLUE ": conf.TeamBlue = ValueString; Sender.ClientMessage("Applied."); break; case "TEAMGREEN ": conf.TeamGreen = ValueString; Sender.ClientMessage("Applied."); break; case "TEAMGOLD ": conf.TeamGold = ValueString; Sender.ClientMessage("Applied."); break; case "BEXTRA1ON1STATS ": if(ValueString == "True") conf.bExtra1on1Stats = True; else if(ValueString == "False" || ValueString=="") conf.bExtra1on1Stats = False; Sender.ClientMessage("Applied."); break; case "BPUBLICSAY ": if(ValueString == "True") conf.bPublicSay = True; else if(ValueString == "False" || ValueString=="") conf.bPublicSay = False; Sender.ClientMessage("Applied."); break; } conf.SaveConfig(); } else if(Left(CommandString, 4) ~= "GET ") { CommandString=Mid(CommandString, 4); switch(Caps(CommandString)) { case "ADMINPASSWORD": Sender.ClientMessage(conf.AdminPassword); break; case "SERVERADDR": Sender.ClientMessage(conf.ServerAddr); break; case "SERVERPORT": Sender.ClientMessage(conf.ServerPort); break; case "ANTIFLOODDELAY": Sender.ClientMessage(string(conf.AntiFloodDelay)); break; case "CHANNEL": Sender.ClientMessage(conf.Channel); break; case "NICKNAME": Sender.ClientMessage(conf.Nickname); break; case "NICKNAME2": Sender.ClientMessage(conf.Nickname2); break; case "USERNAME": Sender.ClientMessage(conf.Username); break; case "USERNAME2": Sender.ClientMessage(conf.Username2); break; case "PASSWORD": Sender.ClientMessage(conf.Password); break; case "PASSWORD2": Sender.ClientMessage(conf.Password2); break; case "AUTHNAME": Sender.ClientMessage(conf.AuthName); break; case "AUTHPASSWORD": Sender.ClientMessage(conf.AuthPassword); break; case "PERFORM1": Sender.ClientMessage(conf.Perform1); break; case "PERFORM2": Sender.ClientMessage(conf.Perform2); break; case "PERFORM3": Sender.ClientMessage(conf.Perform3); break; case "BUSELOGIN": Sender.ClientMessage(string(conf.bUseLogin)); break; case "BUSEAUTH": Sender.ClientMessage(string(conf.bUseAuth)); break; case "BSECONDARYLINK": Sender.ClientMessage(string(conf.bSecondaryLink)); break; case "TEAMRED": Sender.ClientMessage(conf.TeamRed); break; case "TEAMBLUE": Sender.ClientMessage(conf.TeamBlue); break; case "TEAMGREEN": Sender.ClientMessage(conf.TeamGreen); break; case "TEAMGOLD": Sender.ClientMessage(conf.TeamGold); break; case "BEXTRA1ON1STATS": Sender.ClientMessage(string(conf.bExtra1on1Stats)); break; case "BPUBLICSAY": Sender.ClientMessage(string(conf.bPublicSay)); break; } } } } } function string SepLeft(string Str) { local int StrLenght; local int StrTemp; StrLenght=Len(Str); for(StrTemp=1;StrTemp rejoin chan :) if (Command == "KICK") { if (ParseDelimited(Line, " ", 4) == ReporterNick) { // Rejoin the Channel JoinChannel(conf.Channel); } } } Begin: Log ("MvReporter2: Secondary Link - Joining Channel: "$conf.Channel); SendBufferedData("JOIN "$conf.Channel$CRLF); // Let's see if we have to auth on Q :) if (conf.bUseAuth) SendBufferedData("PRIVMSG Q@cserve.quakenet.org :AUTH "$conf.AuthName$" "$conf.AuthPassword$CRLF); Log("MvReporter2: Secondary Link - Successfully logged in to IRC Network!"); // Execute perform commands - if any if (conf.Perform1 != "") SendBufferedData(conf.Perform1$LF); if (conf.Perform2 != "") SendBufferedData(conf.Perform2$LF); if (conf.Perform3 != "") SendBufferedData(conf.Perform3$LF); // Go into mode "intialized" in 5 seconds iTimerType = 2; SetTimer(5, FALSE); } // FUNCTION: PostBeginPlay function PostBeginPlay() { Super.PostBeginPlay(); Disable('Tick'); } // FUNCTION: Tick function Tick(float DeltaTime) { local string Line; DoBufferQueueIO(); if(ReadBufferedLine(Line)) ProcessInput(Line); } // FUNCTION ProccessInput / Standard Processing Function function ProcessInput(string Line) { if (conf.bDebug) Log("MvReporter2 Debug: Secondary Link - "$Line); if(Left(Line, 5) == "PING ") SendBufferedData("PONG "$Mid(Line, 5)$CRLF); } // TIMER EVENT event Timer() { if (iTimerType == 10) { if (conf.bUseLogin) SendText("PASS "$conf.Password2$LF); Log ("MvReporter2: Secondary Link - Sent PASS"); iTimerType = 11; SetTimer(1, false); } else if (iTimerType == 11) { SendText("USER "$UserIdent$" 0 * :"$FullName$LF); Log ("MvReporter2: Secondary Link - Sent USER"); iTimerType = 12; SetTimer(1, false); } else if (iTimerType == 12) { SendText("NICK "$conf.NickName2$LF); Log ("MvReporter2: Secondary Link - Sent NICK"); } // Initialize! if (iTimerType == 2) { bIsConnected = TRUE; } // Reconnect if (iTimerType == 1) { Connect(Controller, conf); } // If Banned -> reconnect to chan if (iTimerType == 474) { iTimerType = 0; if (bIsConnected) JoinChannel(conf.Channel); } } //////////////////////////////////////////////// ////////////// IRC COMMANDS //////////////////// //////////////////////////////////////////////// // Join a Channel function JoinChannel(string Channel) { if (bIsConnected) if(Left(Channel, 1) == "#") SendBufferedData("JOIN "$Channel$CRLF); } // Quit from IRC function SendQuit(string msg) { if (bIsConnected) SendBufferedData("QUIT :"$msg$CRLF); } function RelaunchReporter(string msg) { Disconnect(); iTimerType = 1; // Set Type = reconnect SetTimer(5, FALSE); // Engage r3c0nn3ct Timer in 5 seconds } CG ////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // // IRC Link Class (MvReporter2.MvReporterIRCLink) // ////////////////////////////////////////////////////////////////////////// // Inherit Class! class MvReporterIRCLink expands UBrowserBufferedTCPLink; // Variable Declarations var bool bIsConnected; var IpAddr ServerIpAddr; var string UserIdent, ReporterNick; var int NickCounter; var int iTimerType; var bool SwitchLink; var localized string FullName; var MvReporter Controller; var MvReporterConfig conf; var MvReporterIRCLink2 Link2; var MvReporterSpectator Spec; // Anti Flood Stuff var float iFloodCount, iFloodCurrent, AntiFloodDelay; var string sQueue[32]; // Buffer var int ifHead, ifFoot, ifCount; var float GameSpeed; // Correcting the AntiFloodDelay var bool bUTGLEnabled; // FUNCTION: Connect / Startup (INIT) function Connect(MvReporter InController, MvReporterConfig InConfig) { local int i; // Get the Variables passed from the Controller Controller = InController; conf = InConfig; bIsConnected = FALSE; // Set Nickname ReporterNick = conf.NickName; FullName = Controller.sVersion$" (Build "$Controller.sBuild$")"; // Set User IdentD ResetBuffer(); ResetQueue(); if (conf.bUseLogin) { UserIdent = conf.UserName; } else { UserIdent = "mvr"; for(i = 0; i < 5; i++) UserIdent = UserIdent $ Chr((Rand(10) + 48)); } Log("MvReporter2: Created new UserIdent: "$UserIdent); ServerIpAddr.Port = conf.ServerPort; Resolve(conf.ServerAddr); } function Disconnect() { SendQuit("Reporter quit!"); bIsConnected = FALSE; Close(); } // FUNCTION (EVENT): Resolved / Resolved IP Address function Resolved(IpAddr Addr) { // Store the resolved Addr ServerIpAddr.Addr = Addr.Addr; if(BindPort() == 0) { Log("MvReporter2: Failed to resolve IRC server port!"); return; } Log("MvReporter2: Successfully resolved Server IP Address..."); // Open Link Open(ServerIpAddr); } function ResolveFailed() { Log("MvReporter2: Failed to resolve IRC server!"); } // EVENT: Opened / IRC Link Opened event Opened() { Log("MvReporter2: Link to IRC Server opened..."); Enable('Tick'); GotoState('LoggingIn'); } // CLOSED !!? :( event Closed() { Log("MvReporter2: Lost connection to server"); } // STATE: LoggingIn / Logging In to Server state LoggingIn { function ProcessInput(string Line) { local string msg, Temp; msg = ParseDelimited(Line, " ", 2); if(Left(Line, 5) == "PING ") SendBufferedData("PONG "$Mid(Line, 5)$CRLF); // IF an error occured if(ParseDelimited(Line, " ", 1) == "ERROR") Log("MvReporter2: "$ParseDelimited(Line, ":", 2, True)); // Already in use issue if(msg == "433") { ReporterNick = conf.NickName$string(NickCounter); SendBufferedData("NICK "$ReporterNick$CRLF); NickCounter++; return; } // Register First Issue! if (msg == "451") { if(conf.bDebug) Log("MvReporter2 Debug: sending USER and NICK"); SendBufferedData("NICK "$ReporterNick$LF); SendBufferedData("USER "$UserIdent$" 0 * :"$FullName$LF); return; } if(msg == "NICK") { Temp = ParseDelimited(Line, "~@", 2); if (Temp ~= UserIdent) { Temp = ParseDelimited(Line, ":", 3, True); ReporterNick = Temp; } } // Proceed to next section if(Int(msg) != 0) { Log("MvReporter2: Switching state to 'LoggedIn'"); GotoState('LoggedIn'); } Global.ProcessInput(Line); } Begin: if (conf.bUseLogin) SendText("PASS "$conf.Password$LF); SendText("USER "$UserIdent$" 0 * :"$FullName$LF); SendText("NICK "$conf.NickName$LF); } // STATE: LoggedIn / Logged In to Server state LoggedIn { function ProcessInput(string Line) { local string Command, OrigNick, DestNick, NickFlags, OrigNickAddr, DisconnectMsg; DisconnectMsg = "ERROR :Closing Link"; Global.ProcessInput(Line); // Get Infos about the Message from Server Command = ParseDelimited(Line, " ", 2); OrigNick = ParseDelimited(Line, ":!", 2); OrigNickAddr = ParseDelimited(Line, "! ", 2); // Check for Disconnect Message if ((Left(Line, Len(DisconnectMsg)) ~= DisconnectMsg)) { Log("MvReporter2: "$ParseDelimited(Line, ":", 2, True)); bIsConnected = FALSE; iTimerType = 1; // Set Type = reconnect SetTimer(15, FALSE); // Engage r3c0nn3ct Timer in 15 seconds } // IF an error occured if(ParseDelimited(Line, " ", 1) == "ERROR") Log("MvReporter2: "$ParseDelimited(Line, ":", 2, True)); // Join Channels after /MOTD // if (Command == "376") // Nick already in USE! if(Command == "433") { ReporterNick = conf.NickName$string(NickCounter); SendBufferedData("NICK "$ReporterNick$CRLF); NickCounter++; return; } // Banned if (Command == "474") { // Set anti-ban timer! iTimerType = 474; SetTimer(10, FALSE); } // KICK command -> rejoin chan :) if (Command == "KICK") { if (ParseDelimited(Line, " ", 4) == ReporterNick) { // Rejoin the Channel JoinChannel(conf.Channel); } } // Handle Messages (Private and/or Public) if (Command == "PRIVMSG") { // Get User Flags and User's Nick DestNick = ParseDelimited(Line, " ", 3); while(DestNick != "" && InStr(":@+", Left(DestNick, 1)) != -1) { DestNick = Mid(DestNick, 1); log(NickFlags); NickFlags = NickFlags$Left(DestNick,1); } ProcessPrivMsg(OrigNick, NickFlags, DestNick, Line); } } Begin: if(Spec.ServerMutate("getglstatus")=="True") bUTGLEnabled=True; Log ("MvReporter2: Joining Channel: "$conf.Channel); SendBufferedData("JOIN "$conf.Channel$CRLF); // Let's see if we have to auth on Q :) if (conf.bUseAuth) SendBufferedData("PRIVMSG Q@cserve.quakenet.org :AUTH "$conf.AuthName$" "$conf.AuthPassword$CRLF); Log("MvReporter2: Successfully logged in to IRC Network!"); // Execute perform commands - if any if (conf.Perform1 != "") SendBufferedData(conf.Perform1$LF); if (conf.Perform2 != "") SendBufferedData(conf.Perform2$LF); if (conf.Perform3 != "") SendBufferedData(conf.Perform3$LF); // Go into mode "intialized" in 5 seconds iTimerType = 2; SetTimer(5, FALSE); } // FUNCTION: PostBeginPlay function PostBeginPlay() { Super.PostBeginPlay(); Disable('Tick'); } // FUNCTION: Tick function Tick(float DeltaTime) { local string Line; // Anti Flood Stuff iFloodCurrent += (DeltaTime * (1/GameSpeed)); if (iFloodCurrent > AntiFloodDelay) { iFloodCurrent = 0; GameSpeed = DeathMatchPlus(Level.Game).GameSpeed; //For live AntiFloodDelay value changes :P if(conf.bSecondaryLink) AntiFloodDelay = conf.AntiFloodDelay/2; else AntiFloodDelay = conf.AntiFloodDelay; SendLine(); } DoBufferQueueIO(); if(ReadBufferedLine(Line)) ProcessInput(Line); } // FUNCTION ProccessInput / Standard Processing Function function ProcessInput(string Line) { if (conf.bDebug) Log("MvReporter2 Debug: "$Line); if(Left(Line, 5) == "PING ") SendBufferedData("PONG "$Mid(Line, 5)$CRLF); } // TIMER EVENT event Timer() { if (iTimerType == 10) { if (conf.bUseLogin) SendText("PASS "$conf.Password$LF); Log ("MvReporter2: Sent PASS"); iTimerType = 11; SetTimer(1, false); } else if (iTimerType == 11) { SendText("USER "$UserIdent$" 0 * :"$FullName$LF); Log ("MvReporter2: Sent USER"); iTimerType = 12; SetTimer(1, false); } else if (iTimerType == 12) { SendText("NICK "$conf.NickName$LF); Log ("MvReporter2: Sent NICK"); } // Initialize! if (iTimerType == 2) { bIsConnected = TRUE; } // Reconnect if (iTimerType == 1) { Connect(Controller, conf); } // If Banned -> reconnect to chan if (iTimerType == 474) { iTimerType = 0; if (bIsConnected) JoinChannel(conf.Channel); } } // Process any Private Messages and do the propriet stuff function ProcessPrivMsg(string sOrigNick, string sNickFlags, string sDestNick, string sLine) { local string sParams[4], IP; local Pawn P; local int iFound, j; sParams[0] = ChopLeft(ParseDelimited(sLine, " ", 4, FALSE)); // Channel Events if (sDestNick ~= ReporterNick) { sParams[1] = ChopLeft(ParseDelimited(sLine, " ", 5, FALSE)); sParams[2] = ChopLeft(ParseDelimited(sLine, " ", 6, TRUE)); // Send a Message to the Server! if ((sParams[0] ~= "say") || (sParams[0] ~= "msg")) if (CheckPassword(sParams[1], sOrigNick)) BroadCastMessage(sOrigNick$" (IRC): "$sParams[2]); // Handle mutate commands if(sParams[0] ~= "mutate") if (CheckPassword(sParams[1], sOrigNick)) { Spec.ServerMutate(sParams[2]); } // Set Red Team Name if (sParams[0] ~= "teamred") if (CheckPassword(sParams[1], sOrigNick)) { conf.teamRed = sParams[2]; conf.SaveConfig(); Controller.LoadTeamNames(); SendNotice(sOrigNick, "Changed Team Name of 'red' to '"$sParams[2]$"'!"); } // Set Blue Team Name if (sParams[0] ~= "teamblue") if (CheckPassword(sParams[1], sOrigNick)) { conf.teamBlue = sParams[2]; conf.SaveConfig(); Controller.LoadTeamNames(); SendNotice(sOrigNick, "Changed Team Name of 'blue' to '"$sParams[2]$"'!"); } // Set Green Team Name if (sParams[0] ~= "teamgreen") if (CheckPassword(sParams[1], sOrigNick)) { conf.teamGreen = sParams[2]; conf.SaveConfig(); Controller.LoadTeamNames(); SendNotice(sOrigNick, "Changed Team Name of 'green' to '"$sParams[2]$"'!"); } // Set Gold Team Name if (sParams[0] ~= "teamgold") if (CheckPassword(sParams[1], sOrigNick)) { conf.teamGold = sParams[2]; conf.SaveConfig(); Controller.LoadTeamNames(); SendNotice(sOrigNick, "Changed Team Name of 'gold' to '"$sParams[2]$"'!"); } // Set Gold Team Name if (sParams[0] ~= "teamsreset") if (CheckPassword(sParams[1], sOrigNick)) { conf.teamRed = "Red Team"; conf.teamBlue = "Blue Team"; conf.teamGreen = "Green Team"; conf.teamGold = "Gold Team"; conf.SaveConfig(); Controller.LoadTeamNames(); SendNotice(sOrigNick, "All Team Names have been reset to standard values!"); } // Mute Reporter if (sParams[0] ~= "mute") if (CheckPassword(sParams[1], sOrigNick)) { if (!conf.bMuted) self.SendMessage(conf.colHigh$"*** "$conf.colHead$"Output has been muted by "$sOrigNick); conf.bMuted = !conf.bMuted; conf.SaveConfig(); if (!conf.bMuted) self.SendMessage(conf.colHigh$"*** "$conf.colHead$"Output has been un-muted by "$sOrigNick); } // Enable / Disable Public Commands if (sParams[0] ~= "pubcoms") if (CheckPassword(sParams[1], sOrigNick)) { if (!conf.bPublicComs) self.SendMessage(conf.colHigh$"*** "$conf.colHead$"Public Commands have been enabled by "$sOrigNick); conf.bPublicComs = !conf.bPublicComs; conf.SaveConfig(); if (!conf.bPublicComs) self.SendMessage(conf.colHigh$"*** "$conf.colHead$"Public Commands have been disabled by "$sOrigNick); } // Change Reporter's NickName if (sParams[0] ~= "nick") if (CheckPassword(sParams[1], sOrigNick)) { SendNotice(sOrigNick, "Changing Reporter's Nick to: "$sParams[2]); conf.NickName = sParams[2]; conf.SaveConfig(); SendBufferedData("NICK "$sParams[2]$CRLF); } // Change Reporter's Channel if (sParams[0] ~= "channel") if (CheckPassword(sParams[1], sOrigNick)) { SendNotice(sOrigNick, "Switching Channel to: "$sParams[2]); JoinChannel(sParams[2]); Link2.JoinChannel(sParams[2]); SendBufferedData("PART "$conf.Channel$CRLF); conf.Channel = sParams[2]; conf.SaveConfig(); } // Change Reporter's Channel if (sParams[0] ~= "server") if (CheckPassword(sParams[1], sOrigNick)) { SendNotice(sOrigNick, "Switching IRC-Server to: "$sParams[2]); conf.ServerAddr = sParams[2]; conf.SaveConfig(); RelaunchReporter("Changing IRC-Server to "$sParams[2]); Link2.RelaunchReporter(""); } if (sParams[0] ~= "pwd") if (CheckPassword(sParams[1], sOrigNick)) { sParams[2] = ChopLeft(ParseDelimited(sLine, " ", 6, FALSE)); SendNotice(sOrigNick, "Changing Admin Password to: "$sParams[2]); conf.AdminPassword = sParams[2]; conf.SaveConfig(); } // Get OP across the bot! if (sParams[0] ~= "op") if (CheckPassword(sParams[1], sOrigNick)) { SendBufferedData("MODE "$conf.Channel$" +o :"$sOrigNick$CRLF); SendNotice(sOrigNick, "Oped you on "$conf.Channel$"..."); } // Get VOICE across the bot! if (sParams[0] ~= "voice") if (CheckPassword(sParams[1], sOrigNick)) { SendBufferedData("MODE "$conf.Channel$" +v :"$sOrigNick$CRLF); SendNotice(sOrigNick, "Voiced you on "$conf.Channel$"..."); } // Servertravel if (sParams[0] ~= "servertravel") if (CheckPassword(sParams[1], sOrigNick)) { SendNotice(sOrigNick, "Travelling to: "$sParams[2]); BroadcastMessage("*** "$sOrigNick$" switches map to "$sParams[2]$" from IRC"); ConsoleCommand("servertravel "$sParams[2]); } // Kick Player!! if (sParams[0] ~= "kick" || sParams[0] ~= "kickban") if (CheckPassword(sParams[1], sOrigNick)) { // Now this is some complicated stuff here.... iFound = 0; for (P = Level.PawnList; P!=None; P=P.NextPawn) { if(PlayerPawn(P) != none && P.PlayerReplicationInfo != none && NetConnection(PlayerPawn(P).Player) != none) { if (sParams[2] ~= P.PlayerReplicationInfo.PlayerName) { if (sParams[0] ~= "kickban") { // do Banning stuff here IP = PlayerPawn(P).GetPlayerNetworkAddress(); if(Level.Game.CheckIPPolicy(IP)) { IP = Left(IP, InStr(IP, ":")); Log("Adding IP Ban for: "$IP); for(j=0;j<50;j++) if(Level.Game.IPPolicies[j] == "") break; if(j < 50) Level.Game.IPPolicies[j] = "DENY,"$IP; Level.Game.SaveConfig(); SendNotice(sOrigNick, "Banning IP: "$IP); } // END OF BANNINGCODE } // END if KICKBAN SendNotice(sOrigNick, "Kicking player: "$sParams[2]); P.Destroy(); iFound = 1; } } } if (iFound == 0) SendNotice(sOrigNick, "Sorry, couldn't find "$sParams[2]$" on server!"); } } if ((sDestNick ~= conf.Channel) && (!conf.bMuted) && (conf.bPublicComs)) { sParams[1] = ChopLeft(ParseDelimited(sLine, " ", 5, TRUE)); // Query Map Information switch(sParams[0]) { case "!map": Controller.Spectator.Stats.QueryMap(sOrigNick); break; case "!gameinfo": Controller.Spectator.Stats.QueryInfo(sOrigNick); break; case "!specs": case "!spectators": Controller.Spectator.Stats.QuerySpecs(sOrigNick); break; case "!players": Controller.Spectator.Stats.QueryPlayers(sOrigNick); break; case "!say": if(conf.bPublicSay) BroadCastMessage(sOrigNick$" (IRC): "$sParams[1]); else SendNotice(sOrigNick, "Sorry, this function is disabled on this server."); break; } } } // Remove any occurences of ": " on the left side of a string and return the clear string! function string ChopLeft(string Text) { while(Text != "" && InStr(": ", Left(Text, 1)) != -1) Text = Mid(Text, 1); return Text; } // Check the Admin Password!! function bool CheckPassword(string sTestPwd, string sNick) { if (sTestPwd == conf.AdminPassword) return TRUE; else { SendNotice(sNick, "*** Error: Wrong password provided."); return FALSE; } } //////////////////////////////////////////////// ////////////// IRC COMMANDS //////////////////// //////////////////////////////////////////////// // Join a Channel function JoinChannel(string Channel) { if (bIsConnected) if(Left(Channel, 1) == "#") SendBufferedData("JOIN "$Channel$CRLF); } // Send a Message function SendMessage(string msg) { if ((conf.bMuted == FALSE) && (bIsConnected)) { AddLine("PRIVMSG "$conf.Channel$" :"$msg$CRLF); } } // Send a Notice function SendNotice(string nick, string msg) { if (bIsConnected) AddLine("NOTICE "$nick$" :"$msg$CRLF); } // Quit from IRC function SendQuit(string msg) { if (bIsConnected) SendBufferedData("QUIT :"$msg$CRLF); } function RelaunchReporter(string msg) { Disconnect(); iTimerType = 1; // Set Type = reconnect SetTimer(5, FALSE); // Engage r3c0nn3ct Timer in 5 seconds } /////////////////////////////////////////////// function AddLine(string S) { local int ilHead; ilHead = (ifHead + 1) % 32; if (ilHead != ifFoot) { sQueue[ifHead] = S; ifHead = ilHead; ifCount = Min(ifCount + 1, 32); } } function SendLine() { if (ifCount == 0) return; if(!SwitchLink || !conf.bSecondaryLink) { SendBufferedData(sQueue[ifFoot]); SwitchLink=True; } else { Link2.SendBufferedData(sQueue[ifFoot]); SwitchLink=False; } ifFoot = (ifFoot + 1) % 32; ifCount = Max(ifCount - 1, 0); } function ResetQueue() { ifHead = 0; ifFoot = 0; ifCount = 0; } C}////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// class MvReporterImageServer expands ImageServer; event Query(WebRequest Request, WebResponse Response) { local string AdminUsername, AdminPassword, AdminRealm; Super.Query(Request, Response); } C r cD 87zэ ` CCC////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // // Config Class (MvReporter2.MvReporterConfig) // ////////////////////////////////////////////////////////////////////////// // Inherit class MvReporterConfig expands Actor; var string sTeams[4]; // Variables to store config info var globalconfig bool bEnabled; var globalconfig bool bDebug; var globalconfig bool bMuted; var globalconfig bool bPublicComs; var globalconfig bool bAdvertise; var globalconfig string ServerAddr; var globalconfig int ServerPort; var globalconfig string Channel; var globalconfig string NickName; var globalconfig bool bUseLogin; var globalconfig string UserName; var globalconfig string Password; var globalconfig bool bUseAuth; var globalconfig string AuthName; var globalconfig string AuthPassword; var globalconfig string Perform1; var globalconfig string Perform2; var globalconfig string Perform3; var globalconfig string AdminPassword; var globalconfig float AntiFloodDelay; var globalconfig bool bSecondaryLink; var globalconfig string NickName2; var globalconfig string UserName2; var globalconfig string Password2; var globalconfig bool bExtra1on1Stats; var globalconfig bool bPublicSay; var globalconfig string teamRed; var globalconfig string teamBlue; var globalconfig string teamGreen; var globalconfig string teamGold; var globalconfig string colGen; var globalconfig string colTime; var globalconfig string colHead; var globalconfig string colBody; var globalconfig string colRed; var globalconfig string colBlue; var globalconfig string colGreen; var globalconfig string colGold; var globalconfig string colHigh; CK3////////////////////////////////////////////////////////////////////////// // // Unreal Tournament Server Side Reporter // -------------------------------------- // // Programmed by [Mv]DarkViper // - Enhanced by Rush (rush@u.one.pl) // // Copyright Thomas Pajor, 2001 // ////////////////////////////////////////////////////////////////////////// // Inherit from Actor class MvReporter expands Actor; // Declare some Variable stuff var bool bInitialized; var string sVersion, sBuild; var MvReporterConfig conf; var MvReporterIRCLink IRCLink; var MvReporterIRCLink2 IRCLink2; var MvReporterSpectator Spectator; var MvReporterMutator Mut; var GameReplicationInfo GRI; // Event: PreBeginPlay event PreBeginPlay() { // Check if we're alread initialized if (bInitialized) return; bInitialized = TRUE; // Load Configuration conf = Spawn(class'MvReporter2.MvReporterConfig'); // Load Team Names LoadTeamNames(); // Check IRC Colors! CheckIRCColors(); // Start Reporter Engine // Save our Config conf.SaveConfig(); Log("[Mv] Mavericks IRC Reporter v"$sVersion$" loading..."); // Start IRC Link / Spectator, etc InitReporter(); } // FUNCTION: Enabled / Enable/Disable Reporter function InitReporter() { local Mutator M; // Start IRC Link if (IRCLink == none) IRCLink = Spawn(class'MvReporter2.MvReporterIRCLink'); if (IRCLink2 == none && conf.bSecondaryLink) IRCLink2 = Spawn(class'MvReporter2.MvReporterIRCLink2'); if (IRCLink == none || (IRCLink2 == none && conf.bSecondaryLink)) { Log("MvReporter2: Error Spawning IRC Link Class!"); return; } if (conf.bEnabled) { Log("MvReporter2: Starting Connection Process..."); IRCLink.Connect(self, conf); if(conf.bSecondaryLink) IRCLink2.Connect(self, conf); } if (Spectator == None) Spectator = Level.Spawn(class'MvReporter2.MvReporterSpectator'); Level.Game.BaseMutator.AddMutator(Level.Game.Spawn(class'MvReporterMutator')); M = Level.Game.BaseMutator; While (M.NextMutator != None) { if (InStr(string(M.Class),"MvReporterMutator") != -1) break; else M = M.NextMutator; } Mut = MvReporterMutator(M); Mut.Controller = self; Mut.conf = conf; Mut.Link = IRCLink; Mut.Link2 = IRCLink2; Spectator.Engage(Self, IRCLink, IRCLink2); } // FUNCTION: Load the Team Names function LoadTeamNames() { conf.sTeams[0] = conf.teamRed; conf.sTeams[1] = conf.teamBlue; conf.sTeams[2] = conf.teamGreen; conf.sTeams[3] = conf.teamGold; } function CheckIRCColors() { if (Asc(conf.colGen) != 3) conf.colGen = "."$conf.colGen; if (Asc(conf.colHead) != 3) conf.colHead = "."$conf.colHead; if (Asc(conf.colBody) != 3) conf.colBody = "."$conf.colBody; if (Asc(conf.colTime) != 3) conf.colTime = "."$conf.colTime; if (Asc(conf.colHigh) != 3) conf.colHigh = "."$conf.colHigh; if (Asc(conf.colRed) != 3) conf.colRed = "."$conf.colRed; if (Asc(conf.colBlue) != 3) conf.colBlue = "."$conf.colBlue; if (Asc(conf.colGreen) != 3) conf.colGreen = "."$conf.colGreen; if (Asc(conf.colGold) != 3) conf.colGold = "."$conf.colGold; conf.SaveConfig(); } C@C K K Jg K` KD Jx JQ Je J} JG JZ J~ J@ Jr }o J] xv Zy Ji Jx Kp Jf Zw K^ JN J JJ Jl ~w AK JP Jd }v xL xM }k Jm Kg }k @z Jn JN JO @y JE JF @| Z{ I J| Zz J~ A@ ~w @R ml JA }g }i }[ J{ JT JA JH xf Ji ] @V Jx @W {J Jj @S }\ x@ }B xI JE J| J^ @_ ZQ Jz J_ A Jk ~S JD Z' J\ xI Zj xZ Zc AK Zd Ze } J` Z }t {P Zb Jg Z_ @{ @f J| @~ @T Jj xV ZN xU xn Zp Zo Z> Z_ Zm Z7 }^ E ~} [ j ~w ZP }c JQ }k x` xt }c @@ Z @adRNn$O`tOot|~tbYLuOeOu$kDTdTRceM rb{O O^T`m$X|vLdZei xwOG~WvfP[u[DaSS[fuuyEk[U[dFs[BkPq_\bn&BP]F`qf_[[t}Oa^Jmh|$uJBXyhdx~G}vUYd}ut$sCMRK`MoM~BM>Y\~l>a|XKu[Jk>MzHH>~WeOhTowXGzUsevs$qCvRuauqLAIQ.w`_oOwNE]$PlI{ yJuZGjpySHW@eGtHyCCSBbyqTWAwPO_yanH~\pMG\gOkFzwI\~Wp%hAv_XMENRe[atpo\wN\a]\Mmy|vLyZIiPyxLHyX&dhPox[G iVkyfkLvxF&XU__eaDYT.[dks>_AQya.ypiLMNq]^lmhYVh}wWEHLTyd6qsipBuQTo`kpn$hH|nDQSQRcRsyApPv^rnrOMC\ukHyGH\YWpgyuzEuTEc ttIB#qQ M`9Xo l$`Pf^9ylX|e}KdZDi$rx9UGyFV9Te$tRCFRLZcTcru@JOgX^`m\_|tLpZ]h\v\E]TQb@q}@pOO]pkhyQhGQVneJtVzB^P~^Omp{]IKX\g\vVaE]UV~c9ptkCpRd`Zo9Y~uML\ujuyuHuX#rgLv9WD9VS)hb.QpZMU]k]lk\zPpI\vWgmfP\tP]C\uQl`e\om~HpL sZ YiqpkxYcdrOAhO^^_la{KJpXjf#wvKE#mU/nc.hq._@@Oc^emHj{TeKVOZe^h\Qv$E\wUxpdTrRA{yPP_NoK~uNt]Bl`{nJCYQQhHwGFIUHdrrkAiyPs`yGoF}yYLG\DkCyHHFW&fzuBD~S|aEpzXN{]RkD{CJVMYMhsqwRhNxBFAU@ds~AxP}_|n{}vLz[wjyxpGxUid#Hsh{&@J)X+g:vOESSscUrsBHQuaAp+swN+t] Cksz LJ.SX`h$2ZwdQS`upq~AkMVY[V_k|{hJTbY^Oh@v`EkT!GbeZiwxlG{VJe&sIYJhQvAEKT~cMtvC'aS_tvDsTpdRs}CruRrvb$3rxBPxY`n_p\zKN_]Yle]|^SKbZh;NE$SaqQ@<`PIpsWhOZ,R]aoPnMANJg]$.l>zJpeYM~JhM~\?Xmb{$=Io9%ghLAZbiaxuGuV;Je;XtHB4XR.J`Hj$4zbX,f/uvnE$,TurAABPY`LpD@pWd PXtzC_ReaCpc@bOZ^$5m]KXZAp]hBE$9U$sFQ'}WLTBdHp9k f(9QSJpY3hQ'[.B\pX[M7l:\`HJWEba{C-XRip#Q jw{V\ r*XNeZfde@c^eHdC {ggvhEbNT>r bN!]TORqrp;nCbqWwV gdAKlZA hSp.NiWwVFUUTdRsRB"jQF{#{JNY6,hBJTz,}^,{[]'l iTplU{AmaP8Zq.pK2XZ.h V(8e m~] Jr[ oM 1T|i(#}P<{MD[v(<M_ulVV{[QAlE{J{@pNb]>gk>hzN!]HOreQpW afL{GQU gfHMMl]B kj5Pmu}TaLCe/['G@qGU4~x{vADbS~aVW rMI`XQ'xa_b{oZ9}\gv\hEf[T-aohDP*XTeIldTuO`IcMi$VvbnL8zYr_B_)QRzyMJriYrthrhwDE/XIj"aXlCFo_h~sfYvLjEvo{M@NvNI^YTm{A&CPQS[gb$_Ihh{P\]^v{K]Q[vl{|U]Jvg$_wRIV&N7_lV{B$aPf3mq{^&p:mPZ g$SoAbpA~{M&o8\hTbbAq&N@G=jNGx2:HhBhP&IR ^hpr4Z~Tq-X pr4hI r4fNq pU{ W Kf R r4Bx r4Xgz9Rr4@KpY~K(r4aINw j$r4d;a&r4cKEr4Ohr4Qwr4wHr4Tr4I Sc]\r4Oy r4W3Hh_