Engine
Class StatLog

source: C:\XIII\Engine\Classes\StatLog.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Info
         |
         +--Engine.StatLog
Direct Known Subclasses:StatLogFile

class StatLog
extends Engine.Info

//============================================================================= // Logs game events for stat collection // // ngLog, ngStats, and ngWorldStats are registered trademarks of // NetGames USA, Inc. at http://www.netgamesusa.com All rights reserved. A // ny and all occurrences of code related to supporting their products and // services appears with their express permission. //=============================================================================
Variables
 int Context
 string DecoderRingURL
           URL to log format decoder ring.
 string GameCreator
           Name of game creator.
 string GameCreatorURL
           URL to info on game creator.
 string GameName
           Name of this game.
 string LocalBatcherParams
           Batcher command line parameters.
 string LocalBatcherURL
           Batcher URL.
 StatLog LocalLog
           used by world log when also logging to local log
 string LocalLogDir
           URL to world stats information.
 string LocalStandard
           The standard this log is compliant to.
 string LocalStatsURL
           URL to local stats information.
 string LogInfoURL
           URL to info on logging standard.
 string LogVersion
           Version of the log standard.
 string WorldBatcherParams
           Batcher command line parameters.
 string WorldBatcherURL
           Batcher URL.
 string WorldLogDir
           URL to world stats information.
 string WorldStandard
           The standard this log is compliant to.
 string WorldStatsURL
           URL to world stats information.
 bool bBatchLocal
           An error occured last time we tried to process stats.
 bool bWorld
 bool bWorldBatcherError
           An error occured last time we tried to process stats.


Function Summary
 void BatchLocal()
 void BeginPlay()
     
// Object
 void BrowseRelativeLocalURL(string URL)
 void Destroyed()
 void ExecuteLocalLogBatcher()
     
// Batching
 void ExecuteSilentLogBatcher()
 void ExecuteWorldLogBatcher()
 void FlushLog()
 void GenerateLogs(bool bLogLocal, bool bLogWorld)
 string GetAbsoluteTime()
     
// Return absolute time.
 string GetGMTRef()
     
// Time
 string GetMapFileName()
 void GetPlayerChecksum(PlayerController P, out string)
 string GetShortAbsoluteTime()
     
// A less verbose version...
 string GetTimeStamp()
     
// Return a timestamp relative to last absolute time.
 void InitialCheck(GameInfo Game)
     
// Special
 void LogEventString(string EventString)
 void LogGameEnd(string Reason)
 void LogGameStart()
 void LogItemActivate(Inventory Item, Pawn Other)
 void LogItemDeactivate(Inventory Item, Pawn Other)
 void LogMapParameters()
 void LogMutator(Mutator M)
 void LogNameChange(Controller Other)
 void LogPickup(Pickup Item, Pawn Other)
 void LogPings()
 void LogPlayerConnect(Controller Player, optional string)
 void LogPlayerDisconnect(Controller Player)
 void LogPlayerInfo(Controller Player)
 void LogServerInfo()
 void LogSpecialEvent(string EventType, optional coerce, optional coerce, optional coerce, optional coerce)
 void LogStandardInfo()
     
// Standard Log Entries
 void LogTeamChange(Controller Other)
 void LogTypingEvent(bool bTyping, Controller Other)
 void LogWorldEventString(string EventString)
 void StartLog()
     
// Logging
 void StopLog()
 void Tick(float Delta)
     
// Track relative timestamps.
 void Timer()



Source Code


00001	//=============================================================================
00002	// Logs game events for stat collection
00003	//
00004	// ngLog, ngStats, and ngWorldStats are registered trademarks of 
00005	// NetGames USA, Inc. at http://www.netgamesusa.com All rights reserved. A
00006	// ny and all occurrences of code related to supporting their products and 
00007	// services appears with their express permission.
00008	//=============================================================================
00009	class StatLog extends Info
00010		native;
00011	
00012	// Internal
00013	var int		Context;
00014	
00015	// State
00016	var bool	bWorld;
00017	
00018	// Time
00019	var	float	TimeStamp;
00020	
00021	// Log Variables
00022	var() string LocalStandard;		// The standard this log is compliant to.
00023	var() string WorldStandard;		// The standard this log is compliant to.
00024	var() string LogVersion;		// Version of the log standard.
00025	var() string LogInfoURL;		// URL to info on logging standard.
00026	var() string GameName;			// Name of this game.
00027	var() string GameCreator;		// Name of game creator.
00028	var() string GameCreatorURL;	// URL to info on game creator.
00029	var() string DecoderRingURL;	// URL to log format decoder ring.
00030	
00031	var() globalconfig string	    LocalBatcherURL;		// Batcher URL.
00032	var() globalconfig string	    LocalBatcherParams;		// Batcher command line parameters.
00033	var() globalconfig string	    LocalStatsURL;			// URL to local stats information.
00034	var() globalconfig string	    WorldBatcherURL;		// Batcher URL.
00035	var() globalconfig string	    WorldBatcherParams;		// Batcher command line parameters.
00036	var() globalconfig string	    WorldStatsURL;			// URL to world stats information.
00037	var() globalconfig string		LocalLogDir;
00038	var() globalconfig string		WorldLogDir;
00039	
00040	var globalconfig bool			bWorldBatcherError;		// An error occured last time we tried to process stats.
00041	var globalconfig bool			bBatchLocal;
00042	
00043	var StatLog LocalLog;	// used by world log when also logging to local log
00044	
00045	// Object
00046	function BeginPlay()
00047	{
00048		SetTimer(30.0, True);
00049	}
00050	
00051	function Destroyed()
00052	{
00053		if ( LocalLog != None )
00054			LocalLog.Destroy();
00055	}
00056	
00057	function Timer()
00058	{
00059		LogPings();
00060	}
00061	
00062	function GenerateLogs(bool bLogLocal, bool bLogWorld )
00063	{
00064		if ( bLogWorld )
00065		{
00066			bWorld = true;
00067			if ( bLogLocal )
00068				LocalLog = spawn(class);
00069		}
00070	}
00071	
00072	// Logging
00073	function StartLog()
00074	{
00075		// Implemented in subclass.
00076	}
00077	
00078	function StopLog()
00079	{
00080		// Implemented in subclass.
00081	}
00082	
00083	function FlushLog()
00084	{
00085		// Implemented in subclass.
00086	}
00087	
00088	function LogEventString( string EventString )
00089	{
00090		Log( EventString );
00091		if ( LocalLog != None )
00092			LocalLog.Log(EventString);
00093	}
00094	
00095	function LogWorldEventString( string EventString )
00096	{
00097		// don't send this event to a local log
00098		Log( EventString );
00099	}
00100	
00101	// Batching
00102	native final function ExecuteLocalLogBatcher();
00103	native final function ExecuteSilentLogBatcher();
00104	native final static function BatchLocal();
00105	native final function ExecuteWorldLogBatcher();
00106	native static function BrowseRelativeLocalURL(string URL);
00107	
00108	// Special
00109	native final function InitialCheck( GameInfo Game );
00110	native final function LogMutator( Mutator M );
00111	native static function GetPlayerChecksum( PlayerController P, out string Checksum );
00112	
00113	// Time
00114	native final function string GetGMTRef();
00115	
00116	// Return absolute time.
00117	function string GetAbsoluteTime()
00118	{
00119		local string AbsoluteTime;
00120		local string GMTRef;
00121	
00122		AbsoluteTime = string(Level.Year);
00123	
00124		if (Level.Month < 10)
00125			AbsoluteTime = AbsoluteTime$".0"$Level.Month;
00126		else
00127			AbsoluteTime = AbsoluteTime$"."$Level.Month;
00128	
00129		if (Level.Day < 10)
00130			AbsoluteTime = AbsoluteTime$".0"$Level.Day;
00131		else
00132			AbsoluteTime = AbsoluteTime$"."$Level.Day;
00133	
00134		if (Level.Hour < 10)
00135			AbsoluteTime = AbsoluteTime$".0"$Level.Hour;
00136		else
00137			AbsoluteTime = AbsoluteTime$"."$Level.Hour;
00138	
00139		if (Level.Minute < 10)
00140			AbsoluteTime = AbsoluteTime$".0"$Level.Minute;
00141		else
00142			AbsoluteTime = AbsoluteTime$"."$Level.Minute;
00143	
00144		if (Level.Second < 10)
00145			AbsoluteTime = AbsoluteTime$".0"$Level.Second;
00146		else
00147			AbsoluteTime = AbsoluteTime$"."$Level.Second;
00148	
00149		if (Level.Millisecond < 10)
00150			AbsoluteTime = AbsoluteTime$".0"$Level.Millisecond;
00151		else
00152			AbsoluteTime = AbsoluteTime$"."$Level.Millisecond;
00153	
00154		GMTRef = GetGMTRef();
00155	
00156		AbsoluteTime = AbsoluteTime$"."$GMTRef;
00157	
00158		TimeStamp = 0;
00159	
00160		return AbsoluteTime;
00161	}
00162	
00163	// A less verbose version...
00164	function string GetShortAbsoluteTime()
00165	{
00166		local string AbsoluteTime;
00167	
00168		AbsoluteTime = string(Level.Year);
00169	
00170		if (Level.Month < 10)
00171			AbsoluteTime = AbsoluteTime$".0"$Level.Month;
00172		else
00173			AbsoluteTime = AbsoluteTime$"."$Level.Month;
00174	
00175		if (Level.Day < 10)
00176			AbsoluteTime = AbsoluteTime$".0"$Level.Day;
00177		else
00178			AbsoluteTime = AbsoluteTime$"."$Level.Day;
00179	
00180		if (Level.Hour < 10)
00181			AbsoluteTime = AbsoluteTime$".0"$Level.Hour;
00182		else
00183			AbsoluteTime = AbsoluteTime$"."$Level.Hour;
00184	
00185		if (Level.Minute < 10)
00186			AbsoluteTime = AbsoluteTime$".0"$Level.Minute;
00187		else
00188			AbsoluteTime = AbsoluteTime$"."$Level.Minute;
00189	
00190		if (Level.Second < 10)
00191			AbsoluteTime = AbsoluteTime$".0"$Level.Second;
00192		else
00193			AbsoluteTime = AbsoluteTime$"."$Level.Second;
00194	
00195		TimeStamp = 0;
00196	
00197		return AbsoluteTime;
00198	}
00199	
00200	// Return a timestamp relative to last absolute time.
00201	function string GetTimeStamp()
00202	{
00203		local string Time;
00204		local int Pos;
00205	
00206		Time = string(TimeStamp);
00207		Time = Left(Time, InStr(Time, ".") + 3);
00208		return Time;
00209	}
00210	
00211	// Return a logfile name if relevant.
00212	event string GetLocalLogFileName()
00213	{
00214		return "";
00215	}
00216	
00217	// Track relative timestamps.
00218	function Tick(float Delta)
00219	{
00220		TimeStamp += Delta;
00221	}
00222	
00223	// Standard Log Entries
00224	function LogStandardInfo()
00225	{
00226		if (bWorld)
00227		{
00228			LogWorldEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Standard"$Chr(9)$WorldStandard);
00229			if ( LocalLog != None )
00230				LocalLog.LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Standard"$Chr(9)$LocalStandard);
00231		}
00232		else
00233			LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Standard"$Chr(9)$LocalStandard);
00234		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Version"$Chr(9)$LogVersion);
00235		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Log_Info_URL"$Chr(9)$LogInfoURL);
00236		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Name"$Chr(9)$GameName);
00237		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Version"$Chr(9)$Level.EngineVersion);
00238		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Creator"$Chr(9)$GameCreator);
00239		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Creator_URL"$Chr(9)$GameCreatorURL);
00240		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Game_Decoder_Ring_URL"$Chr(9)$DecoderRingURL);
00241		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Absolute_Time"$Chr(9)$GetAbsoluteTime());	
00242		if (bWorld)
00243		{
00244			if( Level.ConsoleCommand("get UdpServerUplink douplink") ~= string(true) )
00245				LogWorldEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Public"$Chr(9)$"1");
00246			else
00247				LogWorldEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Public"$Chr(9)$"0");
00248		}
00249	}
00250	
00251	function LogServerInfo()
00252	{
00253		local string NetworkNumber;
00254	
00255		NetworkNumber = Level.Game.GetNetworkNumber();
00256	
00257		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_ServerName"$Chr(9)$Level.Game.GameReplicationInfo.ServerName);
00258		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_AdminName"$Chr(9)$Level.Game.GameReplicationInfo.AdminName);
00259		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_AdminEmail"$Chr(9)$Level.Game.GameReplicationInfo.AdminEmail);
00260		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Region"$Chr(9)$Level.Game.GameReplicationInfo.Region);
00261		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine1"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine1);
00262		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine2"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine2);
00263		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine3"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine3);
00264		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_MOTDLine4"$Chr(9)$Level.Game.GameReplicationInfo.MOTDLine4);
00265		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_IP"$Chr(9)$NetworkNumber);
00266		LogEventString(GetTimeStamp()$Chr(9)$"info"$Chr(9)$"Server_Port"$Chr(9)$Level.Game.GetServerPort());
00267	}
00268	
00269	final event LogGameSpecial(String SpecialID, String SpecialParam)
00270	{
00271		LogEventString(GetTimeStamp()$Chr(9)$"game"$Chr(9)$SpecialID$Chr(9)$SpecialParam);
00272	}
00273	
00274	final event LogGameSpecial2(String SpecialID, String SpecialParam, String SpecialParam2)
00275	{
00276		LogEventString(GetTimeStamp()$Chr(9)$"game"$Chr(9)$SpecialID$Chr(9)$SpecialParam$Chr(9)$SpecialParam2);
00277	}
00278	
00279	native final function string GetMapFileName();
00280	
00281	function LogMapParameters()
00282	{
00283		local string MapName;
00284	
00285		MapName = GetMapFileName();
00286	
00287		LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"Name"$Chr(9)$MapName);
00288		LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"Title"$Chr(9)$Level.Title);
00289		LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"Author"$Chr(9)$Level.Author);
00290		LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"IdealPlayerCount"$Chr(9)$Level.IdealPlayerCount);
00291		LogEventString(GetTimeStamp()$Chr(9)$"map"$Chr(9)$"LevelEnterText"$Chr(9)$Level.LevelEnterText);
00292	}
00293	
00294	function LogPlayerConnect(Controller Player, optional string Checksum)
00295	{
00296		LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Connect"$Chr(9)$Player.PlayerReplicationInfo.PlayerName$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.IsA('Admin'));
00297		LogPlayerInfo(Player);
00298	}
00299	
00300	function LogPlayerInfo(Controller Player)
00301	{
00302		if ( Player.PlayerReplicationInfo.Team  != None )
00303		{
00304			LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"TeamName"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.Team.TeamName);
00305			LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Team"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.Team.TeamIndex);
00306			LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"TeamID"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.TeamID);
00307		}
00308		LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Ping"$Chr(9)$Player.PlayerReplicationInfo.PlayerID$Chr(9)$Player.PlayerReplicationInfo.Ping);
00309	}
00310	
00311	function LogPlayerDisconnect(Controller Player)
00312	{
00313		LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Disconnect"$Chr(9)$Player.PlayerReplicationInfo.PlayerID);
00314	}
00315	
00316	function LogKill( PlayerReplicationInfo KillerPRI, PlayerReplicationInfo VictimPRI, string KillerWeaponName, string VictimWeaponName, class<DamageType> DamageType )
00317	{
00318		local string KillType;
00319	
00320		if (VictimPRI == None)
00321			return;
00322	
00323		if ( KillerPRI == VictimPRI )
00324		{
00325			LogEventString(GetTimeStamp()$Chr(9)$"suicide"$Chr(9)$KillerPRI.PlayerID$Chr(9)$KillerWeaponName$Chr(9)$DamageType$Chr(9)$"None");
00326			return;
00327		}
00328		if ( KillerPRI.Team == VictimPRI.Team )
00329			KillType = "teamkill";
00330		else
00331			KillType = "kill";
00332		LogEventString(GetTimeStamp()$Chr(9)$KillType$Chr(9)$KillerPRI.PlayerID$Chr(9)$KillerWeaponName$Chr(9)$VictimPRI.PlayerID$Chr(9)$VictimWeaponName$Chr(9)$DamageType);
00333	}
00334	
00335	function LogNameChange(Controller Other)
00336	{
00337		LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Rename"$Chr(9)$Other.PlayerReplicationInfo.PlayerName$Chr(9)$Other.PlayerReplicationInfo.PlayerID);
00338	}
00339	
00340	function LogTeamChange(Controller Other)
00341	{
00342		LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Teamchange"$Chr(9)$Other.PlayerReplicationInfo.PlayerID$Chr(9)$Other.PlayerReplicationInfo.Team);
00343	}
00344	
00345	function LogTypingEvent(bool bTyping, Controller Other)
00346	{
00347		LogEventString(GetTimeStamp()$Chr(9)$"typing"$Chr(9)$bTyping$Chr(9)$Other.PlayerReplicationInfo.PlayerID);
00348	}
00349	
00350	function LogPickup(Pickup Item, Pawn Other)
00351	{
00352		if ( (Item.InventoryType != None) && (Item.InventoryType.Default.ItemName != "") )
00353			LogEventString(GetTimeStamp()$Chr(9)$"item_get"$Chr(9)$Item.InventoryType.Default.ItemName$Chr(9)$Other.PlayerReplicationInfo.PlayerID);
00354		else
00355			LogEventString(GetTimeStamp()$Chr(9)$"item_get"$Chr(9)$Item$Chr(9)$Other.PlayerReplicationInfo.PlayerID);
00356	}
00357	
00358	function LogItemActivate(Inventory Item, Pawn Other)
00359	{
00360		if ( (Other == None) || (Other.PlayerReplicationInfo == None) || (Item == None) )
00361			return;
00362		LogEventString(GetTimeStamp()$Chr(9)$"item_activate"$Chr(9)$Item.ItemName$Chr(9)$Other.PlayerReplicationInfo.PlayerID);
00363	}
00364	
00365	function LogItemDeactivate(Inventory Item, Pawn Other)
00366	{
00367		LogEventString(GetTimeStamp()$Chr(9)$"item_deactivate"$Chr(9)$Item.ItemName$Chr(9)$Other.PlayerReplicationInfo.PlayerID);
00368	}
00369	
00370	function LogSpecialEvent(string EventType, optional coerce string Arg1, optional coerce string Arg2, optional coerce string Arg3, optional coerce string Arg4)
00371	{
00372		local string Event;
00373	
00374		Event = EventType;
00375		if (Arg1 != "")
00376			Event = Event$Chr(9)$Arg1;
00377		if (Arg2 != "")
00378			Event = Event$Chr(9)$Arg2;
00379		if (Arg3 != "")
00380			Event = Event$Chr(9)$Arg3;
00381		if (Arg4 != "")
00382			Event = Event$Chr(9)$Arg4;
00383	
00384		LogEventString(GetTimeStamp()$Chr(9)$Event);
00385	}
00386	
00387	function LogPings()
00388	{
00389		local PlayerReplicationInfo PRI;
00390	
00391		foreach DynamicActors(class'PlayerReplicationInfo', PRI)
00392			LogEventString(GetTimeStamp()$Chr(9)$"player"$Chr(9)$"Ping"$Chr(9)$PRI.PlayerID$Chr(9)$PRI.Ping);
00393	}
00394	
00395	function LogGameStart()
00396	{
00397		LogEventString(GetTimeStamp()$Chr(9)$"game_start");
00398	}
00399	
00400	function LogGameEnd( string Reason )
00401	{
00402		LogEventString(GetTimeStamp()$Chr(9)$"game_end"$Chr(9)$Reason);
00403	}
00404	
00405	defaultproperties
00406	{
00407	     LocalStandard="ngLog"
00408	     WorldStandard="ngLog"
00409	     LogVersion="1.2"
00410	     LogInfoURL="http://www.netgamesusa.com/ngLog/"
00411	     GameName="Unreal"
00412	     GameCreator="Epic MegaGames, Inc."
00413	     GameCreatorURL="http://www.epicgames.com/"
00414	     DecoderRingURL="http://unreal.epicgames.com/Unreal_Log_Decoder_Ring.html"
00415	     LocalBatcherURL="../NetGamesUSA.com/ngStats/ngStatsUT.exe"
00416	     LocalStatsURL="../NetGamesUSA.com/ngStats/html/ngStats_Main.html"
00417	     WorldBatcherURL="../NetGamesUSA.com/ngWorldStats/bin/ngWorldStats.exe"
00418	     WorldBatcherParams="-d ../NetGamesUSA.com/ngWorldStats/logs -g UT"
00419	     WorldStatsURL="http://www.netgamesusa.com"
00420	     LocalLogDir="../Logs"
00421	     WorldLogDir="../NetGamesUSA.com/ngWorldStats/logs"
00422	}

End Source Code