*E@aD'eBBFKNoneSendIRCMessagePrePadClientMessageParseDelimited GetTeamColor SendNoticeSendBufferedDataPostPadCheckPasswordCore MvReporter2SystemGetColoredMessageEngine SendText ProcessInput ServerMutateConnect SendMessage GetStrTime GetStringLoadTeamNames Disconnect JoinChannelRelaunchReporterOnScoreDetailsTickSendScoreBoard ChopLeft QueryPlayersInLocalizedMessage OnGameOver OnAdvertiseSendScoreLine ProcessScoreOnGameDetailsiGameInfoDelay QueryInfoTimer sScoreStriGameDetailsDelay SendQuit LoggingIn LoggedInBeginProcessKillingSpreeInTeamMessageBroadcastMessageInVoiceMessage SetGameInfoInClientMessageCheckIRCColorsPostPlayerStats InitializeiScoreDetailsDelay QueryScore QuerySpecs QueryMapMutateAddLine ResetQueue SendLineHandlePickupQueryPostBeginPlayCloseQueryMainGeneral AddMutatorGetClientVoiceMessageStringConsoleCommandOpenSepLeftProcessPrivMsg iFloodCount ReporterNick SepRightEngageQueryReconnectQueryMainColorGetTauntString InitReporter QueryMainIRCQueryMainTeamGetReporterClassReadBufferedLine QueryRoot ResetBufferDoBufferQueueIO QueryMenu FullName QueryMainQueryMainMenu QueryStart QueryStop UBrowserResolve ResolvedResolveFailedOpenedClosed BindPortIpDrvQueryUWebUserCheckGameOverChannel bFirstRun Password PreBeginPlay TeamMessageReceiveLocalizedMessage ircClear ircUnderlineAdminPassword ircColorircBoldcolHighcolGold colGreencolBluecolRedcolBodycolHeadcolTimecolGen teamGold teamGreen teamBlueteamRed Password2 UserName2 NickName2bSecondaryLink AuthPasswordFailAuthentication AuthName ServerAddr bAdvertise bPublicComssBuild sVersionClientVoiceMessageTauntCheckIPPolicy bEnabledAntiFloodDelayInitMvReporterWebMvReporterStats_DOM UsernameMvReporterStats_CTFMvReporterStats_TDMMvReporterStats_BTMvReporterStats_DMMvReporterStats_1on1MvReporterStatsMvReporterSpectatorMvReporterMutator_1on1MvReporterMutatorMvReporterIRCLink2MvReporterIRCLinkMvReporterImageServerMvReporterConfig MvReporter GetAckStringGetFFireStringGetOtherStringArmor2 ThighPads HealthPackGetOrderStringACK FRIENDLYFIRE ServerPort NickName AUTOTAUNT UT_JumpbootsUT_ShieldBelt GetCallSignORDERTeams TeamInfo MaxTeamsSize FragLimit TimeLimitFriendlyFireScaleGoalTeamScoreGRI TeamIndexBotpackDeathMatchPlusChallengeVoicePackTournamentPlayer TeamGamePlus ControlPointPad UserIdentNickPageCTFGame ServerIPAddrLF DominationCRLFControlPointMessageUBrowserBufferedTCPLinkGetPlayerNetworkAddressCTFFlagPing PointName DeltaTimeOtherIP GameSpeedbMultiWeaponStayFirstBloodMessageTournamentGameReplicationInfoDeathMessagePlusDeathMatchMessage CTFMessageControlPointsTGRI IPPolicies Controller ValueStringStats bInitialized MaxPlayersMsg RelatedPRI_2P MutateStringMItemCommand NumPlayersAddrPort PRIArray PlayerNameScoreHasFlagURI ResponseRequest LastMessage ServerName InControllerInLinkInLink2 StatsClassMut1on1 OutActor VoicePackMut bIsConnected bIsPlayer NickCounter iTimerType SwitchLinkconfSpec LocalMessageiFloodCurrentIpAddrsQueueifHeadifFootifCount bUTGLEnabled InConfig OrigNick DestNick NickFlags OrigNickAddrDisconnectMsgType sOrigNick sNickFlags sDestNicksLinesParamsiFound GameName sTestPwdsNickTeamTcpLink InternetLink SpectatorMessagingSpectatorilHead PacketLossbIsABotCommandStringtemp StrLenghtStrTempj GetVariableWebApplicationIRCLink IRCLink2i ScriptTextSsTeamsbDebugbMutedSubst ClearSubst IncludeUHTM bUseLogin bUseAuth ImageServer bIsSpectator Perform1 Perform2 Perform3 MessageType WebRequest WebResponsePRIbExtra1on1Stats bPublicSay bAllowPickupLine VoiceType MessageIDSenderDeaths PlayerID TeamName ElapsedTimeRemainingTimeLinkStrText NextMutator BaseMutator bGameEnded PawnList bBTScoresV ReturnValueTimeOptionalObject RelatedPRI_1bBeepMutator LevelInfosStr GameInfoPlayerReplicationInfoGameReplicationInfo InventoryLevel bGameOver nextPawnbDoneAd iTimerCntActorPawn PlayerPawn sGameInfo iRowKills sMessagebIsSpeclPRIsHighsMsgGamebNoTimePlayeriTeamNetConnectionsPreFix sHighLight sPlayer_1 sPlayer_2MessageiID_1iID_2Title RecipientLink2bAdminbestPRIClassPackagesBotSwitchiNumlSpeclPlrsName_1sName_2 sScore_1 sScore_2lPRI_1lPRI_2 TextBufferiT iPingsArray iPLArray sTimeMsgiAll lastKiller lastVictim lastSwitch droppedNamedroppedMessageisStateDroppingDiedMsg Player_1 Player_2TmpStrlFLAGObjectiScore Function sHeadLinebTimeState intScoresecssec bSentDrop bSentDiedsltsgtlTIAdminUsername AdminRealmStructlTemp UnrealShare StrPropertyStructPropertyClassProperty NamePropertyObjectPropertyFloatProperty BoolProperty IntProperty BytePropertyControllingTeamD (cwԝX  QKJI]irc.de.quakenet.orgn" j] #mvrtesto] Reporter1V] replacel] replaceH] replaceF] replacer]adminR$@ED] Reporter2C] replaceB] replaceA] Red Team@] Blue Team= Green Team~] Gold Team}-3|-2{-2z]14y-4x]12w-3v-7u-4 @DA ga:DKxw ᘗwww$oAww ,4vgww ,4vgww ,4vgww ,4vgwwwww ,4vgwKwwwwwwKwwwKwwwwwwKwwww ᘗwwwww ᘗwwwwwwtt> Yt{#U> Yttwww ,4vg$oA%cT ,4vg$oA%cT ,4vg$oA%cT ,4vg$oA%cTwwwwww-%nwwwww$oAwwwwwwwwwwwwwwwww ,4vg ,4vgwwww ^e J]mvrY]mavericks reporterI$?_=M]@'E zd= ,4vgԝXwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwKw ᘗ=$:e=$:e=$:e=$:eyyyy$oAw  M] 2.0beta1L= 19/11/2004RS@DS @g@D @SeZ@D@ |`:  ᘗxwwwwwwwwwwwwwwwwwwwwwwww ,4vg ,4vgwwww ^e J]mvrY]mavericks reporterI$?z|t~j{T@J@Dnk} K ] 6=$oA o=$:e%cT%cT%cT%cT糈'n 6-%n ,4vgw=$:e=$:e=$:e=$:eiQwiQw ,4vg'n 6}"#'n 6''n 6L%cT%cTKKiQw ,4vgwK ,4vgwK ,4vgw%cT%cT ,4vg%cT%cT糈%cT  h| n\%cT糜ԝX{#U{#UnWM)nWM)nWM)nWM)nWM)nWM)nWM)4  t]s]q]p]r%@g@hz {[)P@,HYs:@De<I@e@N@n@^AKG@DeZu@y@$l@Vo@DK@B@D^@D_@D@@D|@@r@\@DO@iO@}%w}@f@DB@DWW@T@MRm@mvR L_fy=$:e=$:e> Y> YKKw ᘗ ᘗ> YKw ᘗ> YKw ᘗ> YwK ᘗ> YK ᘗ> Y> YK> Y> YwKwwwwwwKww> Yw> Y> Yw> Y> YwKwwwwwwKww> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yww> Yww> Yww> Yw> Yw> Yw> Yw> Yww> Yww> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw> Yw  J}aXtfhq qX@hPK'n 6}"#xx{#UwwK{#U$oA{#Uw{#U{#Uw{#UKK}"#;({#U{#U{#U{#UK}"#}"#}"#Kw}"#}"#w}"#;({#U{#U{#U{#U;({#U{#U;(w}"#}"#}"#ww}"#wwwwww}"#ww{#U{#Uww{#Uw'n 6}"#www;(;('n 6}"#ww}"#-%n;(w;(;(w;(w'n 6}"#wKww}"#;({#U{#U{#UK{#U{#Uww$oA{#U{#U{#Uww{#Uww{#Uww{#Uw{#U{#Uw{#U{#Uww{#Uww{#Uww{#Uw{#U{#U}"#}"#}"#ww}"#wwwwwww{#U{#Uwwwwww  (]Fragsl@DD IGc]u@qC$F\@D2@b@D@p@Dd~@D_!@`@DH@M@e@DGf sH@D%u GZDhP%cTK'n 6xxK{#U$oA{#U{#U{#U{#UKK'n 6'-'-KK'-{#U$oA'-{#UK'-{#UKKK;(;(;(K;(K;(K;('n 6ww;(ww'n 6wKww;({#U{#UKw{#Uww$oA{#Uw{#Uww{#Uww{#Uww{#Uww{#Uww{#Uww{#Uww{#Uww{#Uw;(;({#U{#U;(www;(;({#U{#Uww{#UwKww{#Uw{#U{#Uw{#U{#Uw{#Uw{#Uw{#Uw{#Uw{#U{#U{#U{#U{#U{#U{#UEl{#U{#UwK ᘗKK ,4vgww;(;(;(;(;(w;(;(;(;(;(wK{#U{#Uwwww{#U{#Uww{#UwKK;({#U{#UwwK;({#U  k%",)"7"x~ T^'iQw=$:etГ)<)<Ã{#U{#U)<wГ)<)<Ã{#U{#U)<wГ)<)<Ã{#U{#U)<wГ)<)<Ã{#U{#U)<wГ)<)<Ã{#U{#U)<w=$:e  w@ @NrQ@D @]@DNk @ec@DC@jM@B@i i@g@|@Brvyy@@@ @g@DK @M@m.oV@K@Q"U@h@@r@[ @^fo/@]@@7UdEgP`s@u@v@@@@j@A@dz@6R @@@0@]E@ @DTIfKHQ@pOa{ p** Team Status Information:%.a%wa, ~a r~*mm~-:~R~Q:~2rt*ta mmt~ta apCppppppppppTeam-Name, | a,  | Ping,  | PL,  | PPL,  |%g.RR.QQ.pppppppppppppppppppp> =(, | =SD.,  |  SR,  |  pSQ%,  |  S.,  |pppppppppppBest Player ist t with SDt Frags!  D@ @w@P@i@odZ@o@W{@}@h_@Y@j \ @L} $`Ot@u@v@x@Uy@z@{@|@}@@NA@C@yF@@D@G@L@[&Y@@R@aK@d@@{S@U@GX@@sQHX 2FaH T :%F ,pppppp* G is now on G.E  aH F FHTGDE0aH .TGD @Z@[@\@@_@R`@a@b@c@e@@g@#d@X@@S@lmqJt[s@ZPD^@z@@IP@6$jfzV,BT-zV,CTF-BT-,{VBotPack.CTFGame-I'MvReporter2: Stats Actor Initialized c@@XvM @BEFF@I@a z@@q@MY$]%Y%Y, ~Y ;r~*`rN*NY N~NY Y p** Game Details:ppppppp>> Timelimit / Fraglimit:  S  / S ppppppppp> NN is in the lead with SDN frags!  r R$>=pGame has ended!5 I@E@@oY  p92 VXJ@\ZER @L @TQ[ @D @lN_s{ 1= j t hkekPb @Lr( pA5{!)O 'p** Final Player Status:'-IppppppppppppName, | Login, | Frags,  | Death,  | Ping,  | PL,  |'ppppppppppName, | Frags,  | Death,  | Ping,  | PL,  |'A%CA, 0A r0*990-0-@ (Bot) @-Ippppppppppppppppppppppp> p0@, |  Y!pgetlogin 0, |  SD0,  |  SD0,  |  S0,  |  pR0%,  |'9pppppppppppppppppppp> p0@, |  SD0,  |  SD0,  |  S0,  |  pR0%,  |'A ' h@` 87 Jq\ 2R0pppppppppppCurrently Playing:   ( ) on   n@TZ &2;Dpp*** Detailed Game Information for :Pppp>> Timelimit / Fraglimit: S  / S  %6p>> Time Remaining:  94p>> Elapsed Time:   w@v|F@LP /3E kX A8HApp*** Player List for :{%/a0 _X{%dpd, -IdppppppdX - Login: Y!pgetlogin X (SDX)WdppppdX (SDX){10{%dNo players on server!Ap>> d }@N @D@B @AD @n@H8: H @@e @|C 3. KR@bO@n M/Q7 CppppM:  K @b g :+ Sl &S zs@^@Ul@Y @r j UD\uK^@w}"#;({#U{#U{#U{#U;({#U{#U;(w}"#}"#}"#ww}"#wwwwww}"#ww{#U{#Uww{#Uwww{#Uw{#U{#UwLwLL')LL')LL')Lw  (]Pntss@a UTw 9| Y-@x mYXcyV@K'n 6}"#xx{#UwwK{#U$oA{#Uw{#U{#Uw{#UKKwK ᘗKK ,4vgww;(;(;(;(;(w;(;(KK;(;(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%")",7"M@@v O WNf9#I@w}"#;({#U{#U{#U{#U{#Uw}"#}"#}"#ww}"#wwwwww}"#www}"#}"#w;({#U{#U{#U{#Uw{#Uwj\w{#Uw{#Uwwww{#Uw{#U{#Uw{#U{#UwEl{#UwElwEl  (]Caps%")",7"~@h~@`F  @V@kX8 \ 'yA- >-*g-@ WW-* #% -K'-K(pMavericks IRC Reporter /D'pp*** qR-f-{$ %! %!RR ,< %!?#?k?% % #%pp*** q?#?l?% #% %-$a?#?m?% #% %a-- -L-L' ##%#, Y@@{T#HTpp*** Player List for :U%%.f%P/a0 nMJnL:Jf%PpP, 'Pppp(: 9-IPppppppppppP=..J - Login: Y!pgetlogin J  (SDJ)>PppppppppP=..J  (SDJ)fU10yf%Tp>> P_U%%T>> No players on server! Zt'K6, B-:ppPASS gMvReporter2: Secondary Link - Sent PASS6, a?(S6, ppppUSER Z 0 * :DMvReporter2: Secondary Link - Sent USER6, a?(SS6, ppNICK TMvReporter2: Secondary Link - Sent NICKg6,-@'6&E66%-@! ySwA-OpMvReporter2 Debug: Secondary Link - SuzS,PING ppPONG S, siM64-@4zi&#ppJOIN i ul*U> '%-@ppQUIT :l Rzx!WTRR E@Ov! GPj8S"%".S%S, nS hrn*n-:n""Zn"^:nS4"jpppppppppTeam-Name, | a,  | Ping,  | PL,  | PPL,  |"%Q"."Z"Z"."^"^".jppppppppppppp>=" "(, 9| SD".,  | S"Z,  | pS"^%,  | S".,  |"| v@[ 6&a@( m@}@W@@Y; $w*;Y RzY, mvrstatus True -|Y,mvr 'Y,#|',START=-*=R - x-@xR Done.|',STOP=g- x Done. |',RESTART=Reporter restart ...- xReporter restart ... Done.4|',STATUS- w=-*x-@ Connected=-*x-@ Link2 disconnected Disconnected1=-* Connected1 Disconnected`|', MUTEOUTPUT-2=Fppp*** Output has been muted.-2-2bD-2=Ippp*** Output has been un-muted. Applied.|', MUTESTATUS-2 1 0|', PUBCOMSSTATUS-5 1  0N|',PUBCOMS-5=Rppp*** Public Commands have been enabled.-5-5b2-5=Sppp*** Public Commands have been disabled. Applied.|',SET '',K'pG'  ADMINPASSWORD B Applied. SERVERADDR M Applied. ZSERVERPORT \J Applied. ANTIFLOODDELAY lL Applied. CHANNEL ! Applied. NICKNAME J Applied. YNICKNAME2 T Applied. USERNAME w Applied. USERNAME2 G Applied.  PASSWORD c Applied. S PASSWORD2 g Applied. AUTHNAME r Applied. AUTHPASSWORD ] Applied.  PERFORM1 ` Applied. O PERFORM2 _ Applied. PERFORM3 ^ Applied. BUSELOGIN  zTrue-:'  zFalse z-:( Applied. BUSEAUTH > zTrue-e'n n zFalse z-e( Applied.  BSECONDARYLINK  zTrue- '  zFalse z- ( Applied. K TEAMRED m Applied. TEAMBLUE f Applied. TEAMGREEN \ Applied.  TEAMGOLD o Applied. BEXTRA1ON1STATS ? zTrue-H'o o zFalse z-H( Applied. BPUBLICSAY  zTrue-u'  zFalse z-u( Applied. b|',GET '',' {ADMINPASSWORD B SERVERADDR M SERVERPORT S\ ANTIFLOODDELAY Ul :CHANNEL ! gNICKNAME J NICKNAME2 T USERNAME w USERNAME2 G PASSWORD c KPASSWORD2 g xAUTHNAME r AUTHPASSWORD ] PERFORM1 ` PERFORM2 _ 0PERFORM3 ^ `BUSELOGIN T-: BUSEAUTH T-e BSECONDARYLINK T-  TEAMRED m TEAMBLUE f KTEAMGREEN \ xTEAMGOLD o BEXTRA1ON1STATS T-H BPUBLICSAY T-u  AQG "Yo}Qt&Gto=zQt& GtQt& XVERROR :Closing Link8XyX ,jX:!,mX! ,|X}VVpMvReporter2: Secondary Link - X:,'-@(6&apA(zX &ERRORpMvReporter2: Secondary Link - X:,'nzy433lpTS}ppNICK l} zy4746a A(zyKICKzX ,l! o@HC,TpMvReporter2: Secondary Link - Joining Channel: !ppJOIN !-eppppPRIVMSG Q@cserve.quakenet.org :AUTH r ]MvReporter2: Secondary Link - Successfully logged in to IRC Network!I{`p`y{_p_{^p^6,a@( -Ww;ea; 8 Z% ;8+3U , * ;8+3U a; r3*W+X:+ W3X:3i8w3* w+*:3:+w ;8+3U}h;8+3U/~h was slimed."~h was incinerated.w ;8+3U}wpppp=XWMhas died !~waL=(a@@' a; 8 %ppK;8+3U"New Score:  T,ppK;8+3U ,-g'h+p;8+3U p;8+3U8%~pppppppppppK++MKhas captured the flag !M (Best Time: #D+)"New Score:   c} G|c ,Jzc,PING ppPONG c,zc &ERRORpMvReporter2: Secondary Link - c:,'z|433lpTS}ppNICK l} z|451G-OMvReporter2 Debug: Secondary Link - sending USER and NICKppNICK lppppUSER Z 0 * :D z|NICKBc~@,|BZBc:,'lB:J|%MvReporter2: Secondary Link - Switching state to 'LoggedIn'q!,8c IG+~6-:ppPASS gppppUSER Z 0 * :DppNICK T -Jct =MvReporter2: Secondary Link - Lost connection to server Kbl NMvReporter2: Secondary Link - Link to IRC Server opened...u!q!+ PaeAMvReporter2: Secondary Link - Failed to resolve IRC server! BOK#]N}OH&GHN=zOH& GHONH N@h@L[b$`*zM  p** Game Details:ppppppppp>> Timelimit / Scorelimit:  S  mins / S  azM ppppppp>> Friendly Fire / Weaponstay:  SD.?,d% / T.- %bppTime Remaining:   L %bThis Game will never end, because Timelimit and Scorelimit are zero!bppElapsed Time:   pp>> bzM   Sd`V6\6dfd%MvReporter2: SecondaryLink - Failed to resolve IRC server port! MvReporter2: SecondaryLink - Successfully resolved Server IP Address...F\ N@Py [M** Current Score: o%o, mro *o -[o rV*V[-IV[V[-IV[V[Z.[wZ*ppppp>> [ has the :Z( flag!o!K-IV?%pppppppp>> V has the best CapTime - #DV ! VK&*Reporter quit!-@(A bp? Ap[a/!i-rppp-AA-Mhas picked up` ThighPads.7[a/!h-qppp-AA-Mhas picked up an`QArmor.[a/!q-rppp-AA-Mhas picked up`Jumpboots.^[a/!r-uppp-AA-Mhas picked up a`bShieldbelt.[a/!j-uppp-AA-Mhas picked up a`bHealthPack.w*?p[_ A@^,DE^a-@(lTDpppED (Build Ey)V-:ZGZmvrY%Y,ZpZ쒧, ,0YpMvReporter2: Secondary link - Created new UserIdent: Z6\\_M Rp"0pppppppppppppp$%( SD%.9:$..SD&. &( @W]<-s -sp]-s%0.M%&M, zM wz*z-:zz-JzI:zMm@ppppppppppTeam-Name, | a,  | Ping,  | PL,  | PPL,  |-s%".JJ.II.pppppppppppppppppppp> =(, | =SD.,  |  SJ,  |  pSI%,  |  S.,  |-s:-s -s qnn528 'p** Final Player Status:'-IppppppppppppName, | Login, | a,  | Death,  | Ping,  | PL,  |'ppppppppppName, | a,  | Death,  | Ping,  | PL,  |'%.n%n, n r*-:I-d (Bot)Qd$-Ippppppppppppppppppppppp> pd, |  Y!pgetlogin , | SD,  |  SD,  |  S,  |  pR%,  |'pppppppppppppppppppp> pd, | SD,  |  SD,  |  S,  |  pR%,  |'jg:n ,4-'%6.jj.gg.pppppppppppppppppppppp> =(, | , | =SD.,  |  ---,  |  Sj,  |  pSg%,  |' \]^_ @`Z[#-I[%0:00x[x& xCD?x?,<~C, ]p0SC]pSCppSx,<:]S[ ax@cDi=F\%f%s% ybx&nDxpp*** Detailed Game Information for :xppp>> Timelimit / Caplimit: S  / SJ8Eppget V GoalTeamScore/ %6xp>> Time Remaining:  l4xp>> Elapsed Time:   p>|E s% J-p- fm-p'l_fm-p(fD?f&?, ss&% ohq'# A- >-*g-@ WW-* ~{-q'{~~~-s'-q-s 8#% -K'-K(pMavericks IRC Reporter /D'pp*** q-f-{ % %! ,< %!?#?k?% % #%pp*** qj?#?l?% #% %j-$?#?m?% #% %-- -L-L' ##%#, kqj_Nv(H_pp*** Player List for :`%I%I.q%W/a0 uWPuV:PIq%WpW, 'WpppI(: 9-IWppppppppppW=I..P - Login: Y!pgetlogin P  (#DP)HWppppppppW=I..P  (#DP)q`10q%_p>> WI_`%%_>> No players on server! Qtt/'Ipppptt:  Z IrX<DT^D?\&?, R^f\mX\^ss&,  @uqC7&a@( @SaV<kV $S /$p C$Q W$b   |W*xC'%-*ppQUIT :W vmx -v -v'a 4bpp[Mv] Mavericks IRC Reporter vD loading...P wVP86qr*a FrS*- Sa r*rS*- MvReporter2: Error Spawning IRC Link Class!  -gMvReporter2: Starting Connection Process...  - S BrK*Ka $ Ca yVwV*~VVMvReporterMutatorVVC.yVCRCC=CxSKLS xe %(m&(f,(\,(o y4mr 9,p.r,p. , p. Z,Zp.Z,p.VS,Sp.Sp,pp.pQ,Qp.Qb,bp.bb L@ i$Qpp*** qi%i, Ai ^rA*A-wB*rABAi*rB*|--Enobody|SDBEBrr*z--@nobody@zSDr@r>-Ipppppppppppppppppppp>> Current Score:94 E - Login: Ypgetlogin E |9:912..z @ - Login: Ypgetlogin @pppppppppppppppp>> Current Score:94 E |9:912..z @ NB53-*?L , * BC>?L aB z>{a BC>?LaB {>P?OCa BC>?L-cJr?*z>b#z?b w?*-c(a.C>? aB C l%ppKBC>?L"New Score:  ,-c'b>}pBC>?L} pBC>?L  @A J@BVT-2(-*h, ph Urp*4nrW*WpWpWp4p-d.p4wd*ppppp>> p has the :d( flag!h!pppppppp>> W is in the lead with SDW frags! I Q C f@QzCB'OD*** Error: Wrong password provided.( @G B"0pppppppppppppB$%( SD%.9:$..SD&. &( {L ~=-F -Fp~-F%1.c%'c, |c r|*|-:||-a|]:|cm@ppppppppppTeam-Name, | a,  | Ping,  | PL,  | PPL,  |-F%#.aa.]].pppppppppppppppppppp> =(, | =SD.,  |  Sa,  |  pS]%,  |  S.,  |-F;-F -F W T J^V??7{J~: J&JJ&J wF@U Hqp"% F ,( |FN& F ,(, F ,'|% say|% msg & 0pp (IRC): , |% mutate & o, |% teamred & m, b/ppChanged Team Name of 'red' to ', '!:|% teamblue: & f, b/ppChanged Team Name of 'blue' to ', '!|% teamgreen & \, b/ppChanged Team Name of 'green' to ', '!p|% teamgoldp & o, b/ppChanged Team Name of 'gold' to ', '!_|% teamsreset_ & mRed TeamfBlue Team\Green TeamoGold Teamb/All Team Names have been reset to standard values!|% mute & -2Ppppp*** Output has been muted by -2-2b-2Spppp*** Output has been un-muted by |% pubcoms & '-5\pppp*** Public Commands have been enabled by -5-5b-5]pppp*** Public Commands have been disabled by f|% nickf & pChanging Reporter's Nick to: , J, bppNICK , )|% channel) & pSwitching Channel to: , , _, ppPART !!, b|% server & pSwitching IRC-Server to: , M, bpChanging IRC-Server to , _{ |% pwd{  & , F ,(pChanging Admin Password to: , B, b |% op  & ppppMODE ! +o :ppOped you on !... |% voice  & ppppMODE ! +v :ppVoiced you on !...F |% servertravelF  & pTravelling to: , 0pppp***  switches map to ,  from IRCEpservertravel ,  |% kick|% kickban  & e%K wK* w.K*wK*w..K* |, KI |% kickban].KI  P]]]~]:pAdding IP Ban for: ]_% _,2 z_ _  _,2_pDENY,]bpBanning IP: ]pKicking player: , Kae&KK  e%ppSorry, couldn't find ,  on server!|F!-2-5& F ,'% |!map/K& : !gameinfo/K& & !specs !spectators/K& 9 -!players/K&  !sayk-u0pp (IRC): & Sorry, this function is disabled on this server.  V '=3p7, B-:ppPASS cMvReporter2: Sent PASS7, a?( 7, ppppUSER O 0 * :`MvReporter2: Sent USER7, a?(  7, ppNICK JMvReporter2: Sent NICK47,-*'O7&/77%-*! ^ f4f0-OpMvReporter2 Debug: fdzf,PING ppPONG f, Y @`y~94K~pp*** Spectator List for :w%/a0 UZYU-w.U*!-Ik~ppp> U - Login: Y*pgetlogin UR(~p> Uw10w%#~>> No specs on server! ] Sux:1~sxpppppCurrently Reporting:  ( ) on  WGkQoak w Z% kwvmN , * kwvmN ak zvIG kwvmNak IvzmwwG kwvmN.wvm ak i%h%eh,[wh.@*i%rppr  - Wrh.@.NT[U]gTUjh.@wj*rppppr=jTh.@UTrppppr=,Th.@UihppControl Points Updated: r @_ tVnt?&NnLnN.- Ll?,Ll>WTJJ f @v! a d c @r@m DFhERROR :Closing Link8DPD ,KD:!,rD! ,|D}hhpMvReporter2: D:,'-*(7&apA(zD &ERRORpMvReporter2: D:,'LzP433NpJSeppNICK Ne ozP4747a A(zPKICKzD ,N!DzPPRIVMSGqD ,*{q~:@+q&qq&WWpWq&HKWqD h e ,/zogetglstatusTrue-I'pMvReporter2: Joining Channel: !ppJOIN !-eppppPRIVMSG Q@cserve.quakenet.org :AUTH r ]MvReporter2: Successfully logged in to IRC Network!V{`p`{_p_{^p^7,a@( -i Oi ,Jzi,PING ppPONG i,zi &ERRORpMvReporter2: i:,'zO433NpJSeppNICK Ne nzO451%-OMvReporter2 Debug: sending USER and NICKppNICK NppppUSER O 0 * :` zONICKVi~@,|VOVi:,'NVJO%MvReporter2: Switching state to 'LoggedIn'q!,8i i g +J6-:ppPASS cppppUSER O 0 * :`ppNICK J -k cy. ,MvReporter2: Lost connection to server P[ ke p** Team Status Information:%x.k%nk, {k r{*dd{-:{X{[:{)r}*}k dd}{}k kg:ppppppppppTeam-Name, | a,  | Ping,  | PL,  | PPL,  |%_.XX.[[.pppppppppppppppppppp>> =(, | =SD.,  |  SX,  |  pS[%,  |  S.,  |pppppppppppBest Player is} } with SD} Frags! l bq =MvReporter2: Link to IRC Server opened...u!q!+ n aj- 0MvReporter2: Failed to resolve IRC server! w o m`Z6q6mVd%MvReporter2: Failed to resolve IRC server port! MvReporter2: Successfully resolved Server IP Address...Fq x OC&*Reporter quit!-*(A ifih s p iIC$$ -'"( G !A#F0pThis match is being broadcasted to: !-f' u @v @@*g/9/gj-*(NJ`ppp/D (Build /y)V=-:OwOmvrk%k,OpO쒧, ,0kpMvReporter2: Created new UserIdent: O6q\_M S y lSh/ a0 ledzVlMvReporter2.MvReporterl10 ~ z 4f+MSkr*1OERROR : [Mv] Reporter Class not found! |4mvr|4B1GMvr Admin 1!BugAddressrush@u.one.pl4&  "rootU41K >menuX41K ZmainZ41K {main_menu[41K start\41K stop]41K reconnectM41K generalB41K ircQ41K +teamR41K HcolorN41K  nH | @ U[\rMenuURImenurMainURImainrmvr_root.uhtm rO@ C Xd wkAdminURIServerAdminkReporterURIrootkmvr_menu.uhtmk kA @B cZq; PcPagegenerallIndexURImain_menulMainURIPlmvr_main.uhtml nU F .ynrB*yR,ppn was looking good, until he killed himself!yR%@B@R,pppppB's Killing Spree was ended by n!@R%yR&yR ,ppn is on a Killing Spree! , ppn is on a Rampage! ,ppn is Dominating! H,ppn is Unstoppable! ,ppn is Godlike!  J E `[~ ~^`PageircQ%GeneralURImain?Page=generalQIRCURImain?Page=ircQTeamURImain?Page=teamQ!ColorURImain?Page=colorQ!StartURImain?Page=startQStopURImain?Page=stopQ)ReconnectURImain?Page=reconnectQmvr_main_menu.uhtmQ X b:OO ;br Q@I N \D[-gm=MessageThe bot is already running. Nothing to do...m;MessageStarting [Mv] Reporter Bot, please wait...-g'bmmvr_message.uhtmmB- S mf^AW)}^Hp^H,...O}^H^p[^)^  M Q ] ,v-go;MessageStopping [Mv] Reporter Bot, please wait...-g(bo9MessageThe bot is not running. Nothing to do...omvr_message.uhtmo*- S o@P T M({-gp]MessageThe [Mv] Reporter Bot will reconnect to IRC in 5 seconds. Please stand by...pWMessageThe bot is not running, can not reconnect. Please start the bot first.pmvr_message.uhtmp-g0[Mv] Reporter - http://www.mvreporter.de- S0[Mv] Reporter - http://www.mvreporter.de pSW +WwE*EEEpppEEMJwG*DGGpppGDMJQppJWYZEG]wE*EE#wG*GDQ S FB SsF#AdminPasswordBHAdminPasswordstF#bPublicComsT-5uFbMutedT-2vF"bAdvertiseT-{sFbDebugT-OG-gHstatusrunninggHstatusstopped/{FApplyBs &tFbPublicComsfalse|tTRUE-5'-5(uFbMutedfalse\|uTRUE-2'm-2(vFbAdvertisefalse|vTRUE-{'-{(sFbDebugfalse|sTRUE-O'#-O(bd|tTRUEHbPublicComschecked|uTRUEHbMutedchecked|vTRUEHbAdvertisechecked|sTRUEHbDebugcheckedHPostActiongeneralHmvr_main_general.uhtmH @_ UNV%&1UVX\ W O bJW)}bMpbM,...O}bMbpba)b  @` OizO I %Npp[ ]mNpp[ ]-dKOKppppZN9 O K Z HWWCD?H?,<BD?H?,<ppSC,0:SB,0 V Q< { ServerAddrMServerAddr{|!ServerPortS\ServerPort|}Channel!Channel}NickNameJNickNametbUseLoginuUserNamewUserNameuvPasswordcPasswordvxbUseAuthyAuthNamerAuthNameyz"AuthPassword]AuthPasswordzGbSecondaryLinkLNickName2TNickName2LRUserName2GUserName2RSPassword2gPassword2SUbExtra1on1StatsXbPublicSayAPerform1`Perform1ACPerform2_Perform2CFPerform3^Perform3F {ApplyM{ &\J| &!} &J &tbUseLoginfalsexbUseAuthfalseGbSecondaryLinkfalseUbExtra1on1StatsfalseXbPublicSayfalse|tTRUE-:'-:(wu &cv &A|xTRUE-e'R-e(ry &]z &|GTRUE- '- ( |UTRUE-H'-H(@|XTRUE-u'Q-u(TL &'GR &'gS &'`A &'_C &'^F &'b -ebUseAuthchecked -:bUseLoginchecked& - bSecondaryLinkcheckeda -H bExtra1on1Statschecked -ubPublicSaycheckedPostActionircmvr_main_irc.uhtm d lov*&lke_T fWQ1 vPDQ{vnt}P%ppppQQ:  P C@] VDa $rV*rV*EaVJrE*v!l,p,.E e:ew@*,p,.E s@v!m,p,.E f:e&v!O,p,.E O:egv!p,p,.E O:e,v!t,p,.Ek:eDeathmatch,p,.E g:eEa, h En}q &&/EA}-| c E@@m xu Fz!rxDw&*&3xz-I Tjj @C[L!%C[DYIUzzz ,j )C-H Ca iT_wT*H~VTMvReporterMutator_1on1_\TT}.iT}bD}`Cj hzz j @zV,BT-zV,CTF-BT-j cKzz j fzzz j \j h&ajr&*MvReporter2: Unable to spawn Stats Class!#&D&gID_IDo>w}*}-.)&C- DLCl?,DLCl&Y&C&&M&6 Ls u3.-^(ju:&}j%wu:,'R%R, AR rA*zAjA--^'ppp j: wRZ -^pp* u~uentered the game%ju &R%R, AR wA*zAjRR%Rd M////////////////////////////////////////////////////////////////////////// // // 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(); } o { T}p 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 g [////////////////////////////////////////////////////////////////////////// // // 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!"); } ZN////////////////////////////////////////////////////////////////////////// // // 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!"); } |L6-| .Mq2a@@' ^ dRh/?YdteamRedmGteamRedYZdteamBluefGteamBlueZ[dteamGreen\GteamGreen[\dteamGoldoGteamGold\GPostActionteamzdApplyApplymYfZ\[o\b zdApplyReset All TeamsmRed TeamfBlue Team\Green TeamoGold TeambGCMessageAll Team Names have been reset to standard values!Gmvr_message.uhtmG Gmvr_main_team.uhtmG u////////////////////////////////////////////////////////////////////////// // // 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); } Lg////////////////////////////////////////////////////////////////////////// // // 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); } @s////////////////////////////////////////////////////////////////////////// // // 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!"); } MF vMpGame has ended!** Final Score Information:' U////////////////////////////////////////////////////////////////////////// // // 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); } t LN5]LcolGen<colGen]_LcolTimeZ<colTime_`LcolHead<colHead`aLcolBody <colBodyabLcolHigh<colHighbcLcolRedS<colRedceLcolBluep<colBlueegLcolGreenQ<colGreengdLcolGoldb<colGolddm{LApply] &Z_ &` & a &b &Sc &pe &Qg &bd &4<PostActionteam<mvr_main_color.uhtm< X;////////////////////////////////////////////////////////////////////////// // // 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) { } wF////////////////////////////////////////////////////////////////////////// // // 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 GameReplicationInfo GRI; local Class StatsClass; local MvReporterMutator_1on1 Mut1on1; local Actor OutActor; local Mutator M; Controller = InController; Link = InLink; Link2 = InLink2; // OK, now determine the gametype and spawn the specific Reporter Class, we are able to access from here! GRI = Level.Game.GameReplicationInfo; if (GRI.GameName == class'DeathMatchPlus'.Default.GameName) { if (Level.Game.MaxPlayers == 2) { StatsClass = class'MvReporterStats_1on1'; if( Controller.conf.bExtra1on1Stats ) { 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; } } else StatsClass = class'MvReporterStats_DM'; } else if (GRI.GameName == class'TeamGamePlus'.Default.GameName) { StatsClass = class'MvReporterStats_TDM'; } else if (Left(string(Level), 3)=="BT-" || Left(string(Level), 5)=="CTF-BT-") { StatsClass = class'MvReporterStats_BT'; } else if (GRI.GameName == class'CTFGame'.Default.GameName) { StatsClass = class'MvReporterStats_CTF'; } else if (GRI.GameName == class'Domination'.Default.GameName) { StatsClass = class'MvReporterStats_DOM'; } else StatsClass = class'MvReporterStats_DM'; // 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!"); //} Cclass 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); } Dclass 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 } G ////////////////////////////////////////////////////////////////////////// // // 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; } }////////////////////////////////////////////////////////////////////////// // // 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); } B q bC 87zэ g C////////////////////////////////////////////////////////////////////////// // // 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; K3////////////////////////////////////////////////////////////////////////// // // 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(); } @ G G Fc Gg G Fw FC F` F{ FC Ff FB F~ Fm {u FZ Fd wq fw Fb Gv Fv fm FO G^ FF F} Fk |r ` F_ Fd {u wK wM {p {f Fl Ge FL ~x FH FS Fb FA ~w ~z fy F| }} Fz fx f |r tJ ~R w] FB {d {c FQ Fy {T Fc wx w] }V FD F@ F ~O Fn ~P ~m Fe {U {^ yF wA |L f@ ~n F| Fx F\ Fa }g Fi F[ f' FY ff wS fc ` ~y fa f` Fd F] ~o fb {s w` f {w F ~M FI ~| yI Fy fS wN }B }D ~~ {h {W wl wV {f wt ff {@ fm ~e f? f f; fo |{ fP fn fN |W }X FNcQZm%F ksF xs{ EtaXQtFiyF w%fDT[ RK _dL l_xz F F STW `%Qmu {a Gb T o`Fn} |v I`RVT hOT uuBT Pr]jT kT xE Dj QT ^j k]s x\ak$cLh Zt fh[ZsA M] Za gcs%t Aa MrZ|u hv ugA|v OK \D iD vI C%s Oz \~iuwyQE=] S=g`A nD {=~H=I WeH cYpv~uLuZO ho tTh@v N%p [J hF up BuOq ] pjD x\EES-p aH n%G {F HrU cTV p@ } J~ W( dv pH |p I{ V@ cQ p[q }gH J|W[~fJ uA B]O~ ]GrieR w[p Dh QE^F l[]y[I GyCT_^br@jrNOr\jEjrxT FhXLSr _r l$ay$QG]UOh cgpE ~-T Kr X ce=\sI AE Nu [-r gw to Ay Mj ZXKg8j uGEBr Pq ]| jkvn EF Qs ^Tl kF wq Ds Pl ]vjJxM FB S%ZG`^kg_ Rjq _R k[gwrEq Sx _n lH xN Ek Rs ^A kV x"j E R}_J mf z}G_ V] b;N o;r|;QJ @X M g;M tTZ AC M k Z%X fQS r%q R L%} Y[\fgf tel AV NU Zq g[o s[p @gi MeS YjU fi sU jV LL XOV eV qC}Y KOU WW dOq pH |C HJ TV aGq n;q zU Gu Tuau oq |u Hu U-J b;R ou |K Iv VJ cw o(_ |l H;P UJ b;O oC |X_ H_ UH aq mi y"k EY Ra _Ws lW]xW~FV UU ak ng {q H j T R apjnR Xya eH r_ ~X KU XZ d` qq }cI"r WJd"l r0e ~-_ J-X Ww d\ q^ ~GcJT\ XVH e%CqeU [J K[q Xxq ezu qK ~I KGXE fJsu Ar Nz [V hl uXJ B{ OH \F iI vn Cj Pr]o k@ x~ DgQ _} l| x@ EE Rx _$C l{ y~ FD Rx _[ lf yt FKRC `B mWI zE GKTspbF RA ^@ k x~ E} Qq ^| k{ xz Eu Ry _v lx xi Ew Qb ^j k_ w% D) Q7 ^Lkj yUF*m T$w a*n m.Dy-LG d Up bs o L |V HY U%6Yb] {Aj HLTBb_ ps }j IWgVW\dTY rw [ LY Y^H feQ r$G FFW L@ YH ft rH %K\ pK}BKz YA f~sI BE OJ \\iH wgCvQE _i lvyv G]T%1bxyquMqv[xPiI w~Dnn SJ`[s n{5MWeT d%q^T N2^[A y[ FZ_ RT&Q^Z oB|^ JV VOg c%/pkdMs qLz ~J^ KJ_ XDe=s sn8$@_ d^ p?f |s H%3UDr<G @[ MZ Z/Ig<f p%:|%&Y{v4xD5f R0s ^zk.s yyF@Uz Tg Ny[Gi%9wPTQ b@Y}on ls y@Wc F^ i\ v[ CQ P%]f zT F%8S'`pz P@\]Ey'|GACED*8Iq AT N2[@&MG8j s-]S JR WY df qy;k:}yGahIIZ R,V_W[ uvP+VFcY\bdua]YyKcv` Ya fL$M s`M@ Z MPQZ9k?q dZ UVb"fx_ ^e j@ vq5mvW cN oM |L IK VR c#ipI Y"Z fI sE @=+My&|x>Hto'k |.^ g.V sq`@Q/M`-q m<Yz2f S-_4Z LSkX*7C } z m}G PqD nu 4ScL)$|vCrWUu@Z JZVu)2LpD|JZ @s L=` Y=a fM \rPqNV ^ L `XQZ x"fDq jLe wA CDDPRXq bTX oHd/|'F`pfs V`9OcV rS:|WV {Z Q^ ]^i@&G~mI |[` I[a V]cfZq,_KhCj+VmcHCP_KbSjaL}gI`mW8DrZ |f(Hi8p!Uhqr }qr Jqs W\ cCpS!sSkTKfgMI tBAUiOvxR FXSvRZ `ZSmI @.WMA d[fqJ W$BdZ f\\svO%^]]P{vKZ YM\evA gOBHvZ ~$N6Jx@%^NZ lkx%`cQY C$o9\f1lUZ A%DnN^ |$n7HV Z L_ Y$Le~q^ V L_ Y$LX eL3i}r4YfTp- r4go r4eNV |69{ Re t r4AY r4WgZ_ qr4}M \|)r4`XNv x%r4c;n$r4BGQr4NSyr4Par4vqr4Sgr4H zb\Br4N^ r4V3l_ B