*E@ c/:VuH!None GetTimeStampLogEventString BufferLogGetID GameStartedGetWeaponName LogSpree LogComboCoreEngineUTStatsBeta4_2System AddToBufferIPOnly FindMutator AddMutatorLogStandardInfoLogKillLogMutatorListzzSetup SpectatorLogIPSetIPConsoleCommandGetIPFixAssaultGameCode TeamGamePlusAssaultLogAssaultObj GetFortNameProcessBufferCriticalEventClientMessage GetShotCount GetHitCount GetDamage GetAccuracy PreBeginPlayPostBeginPlayGetRIGetAccu PlayerInfoUTStats InstaGibDM UTStatsAHPawn FortStandard PlayerPawnUTStatsHTTPClientUserbHidden LogPickup LogGameEnd LogSuicide UTStatsSAClientVoiceMessage UBrowser GetLocalIP FortInfoIpAddrToString StartLogGetLogFileNameLogPlayerConnectLogPlayerInfoTick LogTeamKillLogMapParametersLogItemActivateLogServerInfoTouchLogItemDeactivate zzVersionLogPlayerDisconnectLogGameParameters LogPingsGetAbsoluteTimeIpDrv LogGameStartLogSpecialEvent TeamMessage UTGLCatcherGetNextIntDescTypeGetPlayerNetworkAddress DeltaTimeOtherNum EventTypeIndexMItem NumPlayersScorebWorld MessageTypePRI RecipientGame KillerIDKillerWeaponNameVictimWeaponName InstigatorArg2Arg3Arg4Reason nextPawnSpreebBeep TimeSecondsEngineVersion PawnList CurrentID BaseMutator LocalLogLocalLogFileName NextMutator PlayerIDSender MessageID Checksum VictimIDArg1 GameName InternetLinkKilledMessagingSpectatorIpAddr DamageTypeUBrowserHTTPClientPartTeams TeamInfo MaxTeams TimeLimitFBotpackDeathMatchPlusAji CountDown bTournament FortName ScriptText bFinalFort bFirstBlood GameCodeUTSAccuBeta4_2S ReturnValuePiMutator LevelInfo GameInfoPlayerReplicationInfoUTSReplicationInfo UTSDamageMutStatLog StatLogFileUTSDMzzPID bDeleteObjbUTStatsRunningzzIndexzzRIbInstazzIP InventoryLevelActorPlayerTag zzLogger zzAssault bEndGame bFinalObj zzNumForts zzRemFortsEventzzFSbTaken zzFortNamezzFIClassPackage bObjFound bUTGLEnabled bGameStarted zzComboCode zzBuffer TextBufferzzGLTagzzMutatorList zzEndTime zzWarmupTimezzPHPoszzPawnzzIDzzSpreezzCombozzKills zzDeaths zzSuicides zzTeamKills zzLastKill zzJoinTime bHasFlagzzLoginUTSAHUTSHTTPzzServerActors zzUTGLVer zzMutatorObjectzzMyIP zzKillerID zzVictimID FunctionStruct bDisconnectzzNow zzKilledNewPawn UnrealShare bReconnected StrProperty zzPlayerID zzAccuracy zzEfficiencyzzTTLzzTimeOnServerStructPropertyzzTagzzTypezzValueClassProperty NamePropertyPID zzGLInfo zzOffsetObjectProperty zzFortIDFloatProperty BoolPropertyzzEntryzzDesczzNum IntPropertyMutName ByteProperty bIsPlayer1!@{Y:HA+!JԝD=$:e-%n-%n}"#}"#8LNt8LNtt{#U"{"{"{"{"{"{"{"{"{"{"{7̮7̮t> Yt{#Uttt{#Uttt{#Ut{#Utt{#Ut{#U=$:e8LN73^73^ H]0.4.2I) @p 4@d0TzZ@Slb- 67̮ oE=btE=btE=bԑE=bt{#UE=bE=bE=bE=bԓ ԓ  25!~@3@_@*@"y@O@US@@@@k[E173^釅m 9M %@QfW`AB[@j-BE<7cMO#$_9K@KF@]?PxNs e({@/gh@i@Lmo,;rt=Lu@@q@J.*f@@@A@@C}C@C@D@8H@P@I@]+>13+~+:++~+:+ @MN2"pp, game_start PX52[fw1*zXAssault succeeded!1-k'1 !! X%, 6,!' 6x NRQ 6r6.* 6(6.Sr* Y6%6.O?D6BD]6%MO?6MO]666!6*%KK?6?666!6*Bstat_playeraccuracy6UYstat_playerscore6SD6.stat_playerfrags6S66!stat_playerkills6S6stat_playerdeaths6S6stat_playersuicides6S6!stat_playerteamkills6S6*stat_playerefficiency6UKstat_playertime_on_server6U6Bstat_playerttl6UM % |  translocatorweap_shotcount  6S " weap_hitcount  6S # weap_damagegiven  6S $ weap_accuracy  6U )  D-' BA// ============================================================================= // # # ### ### ### # ### ### // # # # # # # # # # // # # # ### # # # # ### // # # # # # ### # # // ### # ### # # # # ### // Beta 4.2 // ============================================================================= // UTStats Team: // * Azazel (Main PHP Coder) // * Toa (PHP Coder) // * AnthraX (Unrealscript Coder) // UTStats Forum: // * http://www.unrealadmin.org/forums/forumdisplay.php?f=173 // Released under the Unreal Open MOD License (included in zip package) // ============================================================================= class UTStatsSA extends Actor; var UTStats LocalLog; var UTStatsAH UTSAH; var UTSDamageMut UTSDM; // ============================================================================= // PreBeginPlay ~ Call the gamecode fix before the assault class sets it // ============================================================================= function PreBeginPlay() { Super.PreBeginPlay(); if (!Level.Game.IsA('Assault')) return; FixAssaultGameCode(); } // ============================================================================= // PostBeginPlay ~ Setup UTStats // ============================================================================= function PostBeginPlay() { local Mutator M; // Spawn the mutator that will handle the accuracy UTSDM = UTSDamageMut(FindMutator("UTSDamageMut")); if (UTSDM == None) { Level.Game.BaseMutator.AddMutator(Level.Spawn(class'UTSDamageMut')); UTSDM = UTSDamageMut(FindMutator("UTSDamageMut")); if (UTSDM == None) { Log("### ERROR: UTStats cannot run without the UTSAccu package!"); return; } } //Log("### UTSAccu package linked!"); UTSDM.bUTStatsRunning = true; // Spawn the statlog class and log standard info LocalLog = spawn(Class'UTStats'); LocalLog.bWorld = False; LocalLog.UTSDM = UTSDM; LocalLog.StartLog(); LocalLog.LogStandardInfo(); LocalLog.LogServerInfo(); LocalLog.LogMapParameters(); for (M = Level.Game.BaseMutator; M != None; M = M.NextMutator) LocalLog.AddMutator(M); LocalLog.LogMutatorList(); Level.Game.LogGameParameters(LocalLog); Level.Game.LocalLog = LocalLog; Level.Game.LocalLogFileName = LocalLog.GetLogFileName(); // Spawn the messaging spectator that will parse assault messages if (!Level.Game.IsA('Assault')) return; UTSAH = Level.Spawn(class'UTStatsAH'); UTSAH.zzLogger = LocalLog; UTSAH.zzAssault = Assault(Level.Game); UTSAH.zzSetup(); LocalLog.UTSAH = UTSAH; } // ============================================================================= // FindMutator function // ============================================================================= function Mutator FindMutator (string MutName) { local Mutator M; M = Level.Game.BaseMutator; while (M != None) { if (InStr(M.class,MutName) != -1) return M; else M = M.NextMutator; } return M; } // ============================================================================= // FixAssaultGameCode ~ Cratos' fix for some epic fuckup // ============================================================================= function FixAssaultGameCode() { local int i; local int num; if (Assault(Level.Game).GameCode == "") { while (i<8) { Num = Rand(123); if ( ((Num >= 48) && (Num <= 57)) || ((Num >= 65) && (Num <= 91)) || ((Num >= 97) && (Num <= 123)) ) { Assault(Level.Game).GameCode = Assault(Level.Game).GameCode $ Chr(Num); i++; } } } } // ============================================================================= // Defaultproperties // ============================================================================= pG8%Gpppp, assault_timelimit, S5\pppppp, assault_gamecode, 5, S5/ a0 G69Ge{69Tpppppp, assault_objname, S, 696,G-6U(10S OWXUR7.Z|ZԝX   =$:e=$:e=$:e8LNԃ=$:eԔ=$:eԃԃ7̮7̮7̮ԃ 3Gclass UTStatsHTTPClient extends UBrowserHTTPClient; function string GetIP () { local IPAddr IPAddr; // Added by Cratos GetLocalIP(IpAddr); return IpAddrToString(IPAddr); } TGw@Cpppppppp:::G, D, SC, } ^F/1Fa/!0-.F@-0.0.0.0--pppppppp, player, IP, SF, - eEA.E?w*-?@? @6\QQA2a~:::Q~:::pp, QQ,pp, 0a/!$%0$.pppppp, teamscore, S$, SD$.$ mY8bP  a|3DE&%=&, 36&|&& nObb*d~transloc4~dom_%ztranslocateJ3-6(3@A-   $zflag_takenzflag_pickedupJ3-6'bbzflag_capturedJ3-6( &cdiFE_FQ Fz ,UTGLJOIN~ , Z  &~ , TJ   &~ , 4 {4_T6z_4pppppppp, player, GLLogin, ST, 4  g@jR4class UTStatsAH extends MessagingSpectator; var UTStats zzLogger; var Assault zzAssault; var bool bEndGame,bFinalObj; var int zzNumForts, zzRemForts; struct FortInfo { var FortStandard zzFS; var bool bTaken; var string zzFortName; }; var FortInfo zzFI[16]; // ============================================================================= // zzSetup ~ Setup the class // ============================================================================= function zzSetup() { local FortStandard zzFS; local string zzFortName; zzNumForts = 0; zzLogger.LogEventString(zzLogger.GetTimeStamp()$Chr(9)$"assault_timelimit"$chr(9)$zzAssault.TimeLimit); zzLogger.LogEventString(zzLogger.GetTimeStamp()$Chr(9)$"assault_gamecode"$chr(9)$zzAssault.GameCode$chr(9)$zzAssault.Part); foreach Level.AllActors(class'FortStandard',zzFS) { zzFI[zzNumForts].zzFortName = GetFortName(zzFS); if (zzFI[zzNumForts].zzFortName != "") zzLogger.LogEventString(zzLogger.GetTimeStamp()$Chr(9)$"assault_objname"$chr(9)$zzNumForts$chr(9)$zzFI[zzNumForts].zzFortName); zzFI[zzNumForts].zzFS = zzFS; zzFI[zzNumForts++].bTaken = false; } zzRemForts = zzNumForts; } // ============================================================================= // GetFortName ~ Added by cratos // ============================================================================= function string GetFortName(FortStandard F) { if ((F.FortName == "Assault Target") || (F.FortName == "") || (F.FortName == " ")) return ""; else return F.FortName; } // ============================================================================= // ClientMessage ~ Parse assault events // ============================================================================= event ClientMessage( coerce string S, optional name Type, optional bool bBeep ) { local int i; local bool bObjFound; if (Type != 'CriticalEvent' || (bEndGame && bFinalObj)) return; bObjFound = true; while (bObjFound) { bObjFound = false; for (i=0;i 1)) // Combo was still going on when player disconnected LogEventString(GetTimeStamp()$chr(9)$"spree"$chr(9)$zzComboCode[Clamp(PI[KillerID].zzCombo-2,0,3)]$chr(9)$PI[KillerID].zzID); else PI[KillerID].zzCombo++; } else { if (PI[KillerID].zzCombo > 1) LogEventString(GetTimeStamp()$chr(9)$"spree"$chr(9)$zzComboCode[Clamp(PI[KillerID].zzCombo-2,0,3)]$chr(9)$PI[KillerID].zzID); PI[KillerID].zzCombo = 1; } PI[KillerID].zzLastKill = zzNow; } // ============================================================================= // LogTeamKill ~ :/ // ============================================================================= function LogTeamKill( int KillerID, int VictimID, string KillerWeaponName, string VictimWeaponName, name DamageType ) { local int zzKillerID, zzVictimID; if (!Level.Game.IsA('TeamGamePlus')) { LogKill(KillerID,VictimID,KillerWeaponName,VictimWeaponName,DamageType); return; } if (!bGameStarted && !GameStarted()) return; zzKillerID = GetID(KillerID); zzVictimID = GetID(VictimID); PI[zzKillerID].zzTeamKills++; PI[zzVictimID].zzDeaths++; super.LogTeamKill(KillerID,VictimID,KillerWeaponName,VictimWeaponName,DamageType); if (PI[zzVictimID].bHasFlag) PI[zzVictimID].bHasFlag = false; } // ============================================================================= // LogSuicide // ============================================================================= function LogSuicide (Pawn Killed, name DamageType, Pawn Instigator) { local int zzKilled; if (!bGameStarted && !GameStarted()) return; zzKilled = GetID(Killed.PlayerReplicationInfo.PlayerID); PI[zzKilled].zzSuicides++; Super.LogSuicide(Killed,DamageType,Instigator); if (PI[zzKilled].bHasFlag) PI[zzKilled].bHasFlag = false; } // ============================================================================= // LogPlayerConnect ~ We don't like spectators // ============================================================================= function LogPlayerConnect(Pawn Player, optional string Checksum) { if (Player.IsA('Spectator')) return; super.LogPlayerConnect(Player,Checksum); } // ============================================================================= // LogPlayerDisconnect ~ Handle sprees/combos, then add to the buffer // ============================================================================= function LogPlayerDisconnect(Pawn Player) { local int i; if (Player.IsA('Spectator')) return; i = GetID(Player.PlayerReplicationInfo.PlayerID); LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Disconnect"$Chr(9)$Player.PlayerReplicationInfo.PlayerID); PI[i].zzEndTime = Level.TimeSeconds; if (!bGameStarted && !GameStarted()) return; LogSpree(33,i); LogCombo(i,,true); AddToBuffer(i); PI[i].zzID = -1; } // ============================================================================= // LogSpecialEvent ~ Any gametype-specific event goes trough this function // Note: we don't log translocation events as it's a lot of spam and it's not // usefull at all // ============================================================================= function LogSpecialEvent(string EventType, optional coerce string Arg1, optional coerce string Arg2, optional coerce string Arg3, optional coerce string Arg4) { local int i; local string event; if ((InStr(EventType,"transloc") != -1) || (InStr(EventType,"dom_") != -1) && (Level.Game.NumPlayers == 0)) { if (EventType=="translocate") { i = GetID(int(Arg1)); PI[i].bHasFlag = false; } } else { super.LogSpecialEvent(EventType,Arg1,Arg2,Arg3,Arg4); } if (!bGameStarted && !GameStarted()) return; if (EventType=="flag_taken" || EventType=="flag_pickedup") { i = GetID(int(Arg1)); PI[i].bHasFlag = true; } else if (EventType=="flag_captured") { i = GetID(int(Arg1)); PI[i].bHasFlag = false; } } // ============================================================================= // We're using the tick function to set IP's // ============================================================================= function Tick (float DeltaTime) { local pawn NewPawn; super.Tick(DeltaTime); if (Level.Game.CurrentID > currentID) { for( NewPawn = Level.PawnList ; NewPawn!=None ; NewPawn = NewPawn.NextPawn ) { if(NewPawn.bIsPlayer && NewPawn.PlayerReplicationInfo.PlayerID == currentID) { SetIP(NewPawn); break; } } ++currentID; } } function SetIP( Pawn Player) { local string zzIP; local int i,j; local bool bReconnected; if (Player.IsA('PlayerPawn')) zzIP = PlayerPawn(Player).GetPlayerNetworkAddress(); else zzIP = "0.0.0.0"; zzIP = IPOnly(zzIP); LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"IP"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$zzIP); } function string IPOnly (string zzIP) { if (InStr(zzIP,":") != -1) zzIP = Left(zzIP,InStr(zzIP,":")); return zzIP; } // ============================================================================= // Game Start/End functions // ============================================================================= function LogGameStart() { LogEventString(GetTimeStamp()$Chr(9)$"game_start"); } function LogGameEnd( string Reason ) { local int i; zzEndTime = Level.TimeSeconds; if ((UTSAH != None) && (Reason == "Assault succeeded!")) { UTSAH.bEndGame = true; UTSAH.ClientMessage("",'CriticalEvent'); } Super.LogGameEnd(Reason); for (i=0;i<32;++i) { if (PI[i].zzID != -1) // Player is still on the server { LogSpree(33,i); LogCombo(i,true); AddToBuffer(i); PI[i].zzID = -1; } } ProcessBuffer(); } // ============================================================================= // Some lame code here. We want UTStats to log all playerstats at the end of the // game, not during the game. That's why we'll use a buffer. // ============================================================================= function AddToBuffer ( int zzPlayerID ) { local float zzAccuracy,zzEfficiency,zzTTL,zzTimeOnServer; local UTSReplicationInfo zzRI; local int i; if (PI[zzPlayerID].zzPawn == none) return; zzRI = UTSDM.GetRI(PI[zzPlayerID].zzPawn.PlayerReplicationInfo); if (zzRI == None) return; zzAccuracy = UTSDM.GetAccuracy(PI[zzPlayerID].zzPawn.PlayerReplicationInfo); zzTimeOnServer = Min(Level.TimeSeconds-PI[zzPlayerID].zzJoinTime,Level.TimeSeconds-zzWarmupTime); if (PI[zzPlayerID].zzDeaths != 0) zzTTL = zzTimeOnServer/(PI[zzPlayerID].zzDeaths) ; else zzTTL = zzTimeOnServer; if ((PI[zzPlayerID].zzKills+PI[zzPlayerID].zzDeaths+PI[zzPlayerID].zzSuicides+PI[zzPlayerID].zzTeamKills) == 0) zzEfficiency = 0.0; else zzEfficiency = float(PI[zzPlayerID].zzKills)/float(PI[zzPlayerID].zzKills+PI[zzPlayerID].zzDeaths+PI[zzPlayerID].zzSuicides+PI[zzPlayerID].zzTeamKills)*100.0; BufferLog("stat_player","accuracy",PI[zzPlayerID].zzID,string(zzAccuracy)); BufferLog("stat_player","score",PI[zzPlayerID].zzID,string(int(PI[zzPlayerID].zzPawn.PlayerReplicationInfo.Score))); BufferLog("stat_player","frags",PI[zzPlayerID].zzID,string(PI[zzPlayerID].zzKills - PI[zzPlayerID].zzSuicides)); BufferLog("stat_player","kills",PI[zzPlayerID].zzID,string(PI[zzPlayerID].zzKills)); BufferLog("stat_player","deaths",PI[zzPlayerID].zzID,string(PI[zzPlayerID].zzDeaths)); BufferLog("stat_player","suicides",PI[zzPlayerID].zzID,string(PI[zzPlayerID].zzSuicides)); BufferLog("stat_player","teamkills",PI[zzPlayerID].zzID,string(PI[zzPlayerID].zzTeamKills)); BufferLog("stat_player","efficiency",PI[zzPlayerID].zzID,string(zzEfficiency)); BufferLog("stat_player","time_on_server",PI[zzPlayerID].zzID,string(Level.TimeSeconds-PI[zzPlayerID].zzJoinTime)); BufferLog("stat_player","ttl",PI[zzPlayerID].zzID,string(zzTTL)); for (i=0;i 0) return false; else { if (!bGameStarted) { zzWarmupTime = Level.TimeSeconds; LogEventString(GetTimeStamp()$Chr(9)$"game"$chr(9)$"realstart"); } bGameStarted = true; return true; } } // ============================================================================= // AddMutator ~ Add mutatorclass to our list // ============================================================================= function AddMutator (Mutator M) { zzMutatorList = zzMutatorList$":::"$M.class; } // ============================================================================= // LogMutatorList ~ Log the list // ============================================================================= function LogMutatorList() { local string zzEntry,zzDesc; local int zzNum; zzEntry = "(none)"; while (zzEntry != "") { if ((InStr(CAPS(zzMutatorList),CAPS(zzEntry)) != -1) && zzDesc != "") { if (InStr(zzDesc,",") != -1) zzDesc = Left(zzDesc,InStr(zzDesc,",")); LogEventString(GetTimeStamp()$chr(9)$"game"$chr(9)$"GoodMutator"$chr(9)$zzDesc); } GetNextIntDesc("Engine.Mutator",zzNum++,zzEntry,zzDesc); } } // ============================================================================= // Defaultproperties // ============================================================================= B@&/'a/!  K''0p.UTSDamageMutr*a .UTSDamageMutr*### ERROR: UTStats cannot run without the UTSAccu package! -'a -(6=EC'w'* '''c J>*a/! )a ))5.)1) TJ!@'B! -k-L -0'-0-0( % u-6U &6, a/!.(6, a/!/-6U 'SS%6, --L'j{69 <-L6,  -0' G/ LJc_ phw*Q~VJe @NVyFz.V,,{,0 ,9,A ,[,a ,{.p.V# G>q-   8>%Wpppppppppppp, kill, S>, K, SW, I, WH686%-cpppp, first_blood, S>-c'8%8o-6%pppp, flag_kill, S>-6%( V;1iXz;Assault Targetz;z; g;  z z yZ yy yk zI yc y. y[ rj yr zU y_ rb y[ y\ y/ yu y yY y] y^ yt r\ tn yJ yv y0 y` y yn yW y@ yy cT cP yi rr yi rf ru my [& [@ [O [? y\ u^ y [6 yE za yB [4 [D [K z9 [A [5 [B [G [T [P [ yq [I ct [R [ [N zM y} \@ co [8 c| t] t] [! y\ [F rp rD rk yG yF yN nm uO yC uR [' rs u| y{ ye uc ug udX_<d m<{G z<+k F=M qHs ~Hf KIxXIM fI} rIp ~Ic JJM WJe cJ{P pJ }Jr JKM WKW cK-foKn UP{K bP{J nP{I zPZ FQw SQ` `QX mQM yQa FRM SR~ _R{L kRl wRM CSM OSZ [SM gSZ sS^ @TR MT{M ZTh gTputTh BU{F OUZ \U{ hUR tUv AV{ MVQ ZVofVa tV1ZAWY [Xpw gX{H sXHXM MY_ ZYc fYq sY{N @Z{C MZ{O ZZB fZl sZz @[l M[uZ[c h[S u[| B\f O\q \\g h\g u\h A]z M]Y Y]l e]s r]b ~]pv K^M W^z c^j p^e |^H I_C V_@c_D q_c }_q J`lV`Vd`~r`S @ap La] YaT eaY raA ~ae Kbd Xbp eb[rbV @c[McV [c;hc[zcV HdA Udf bdb odq |dZ Iey VeX be{Q ne*{eo Nfl [fx gfg sfh @gi MgS Ygd fgk sgU @hA Lhj YhA fhe rhz hd Lis Yi>eib cjW ojN8{j5uskL hnM un XBoQ4MAZ~@g_ gatwB7gP7Q4RwPIVYAMot |E HsT8 Gm gIsOZ|W VS bFIoK xV E`RQ4]4`P }IL]]i?7F{h }6pIK4yD;mVhBi~G;gl bM n4:{U uqBRsW E7QTHB\w ^m jv7)uW ^@[kQ4OFL UV a&9n'Yg!\@e\x AW NW [tg[[kv