Class ExtStatList extends Object config(ServerExtStats) abstract; struct FTopPlayers { var config string N,Id; var config int V; }; var config array TopPlaytimes,TopKills,TopExp; static final function SetTopPlayers(ExtPlayerController Other) { local ExtPerkManager PM; local bool bDirty; PM = Other.ActivePerkManager; bDirty = CheckBestTrack(Other.PlayerReplicationInfo,PM.TotalPlayTime,Default.TopPlaytimes); bDirty = CheckBestTrack(Other.PlayerReplicationInfo,PM.TotalKills,Default.TopKills) || bDirty; bDirty = CheckBestTrack(Other.PlayerReplicationInfo,PM.TotalEXP,Default.TopExp) || bDirty; if (bDirty) StaticSaveConfig(); } static final function bool CheckBestTrack(PlayerReplicationInfo PRI, int Value, out array V) { local string S; local int i,l; S = class'OnlineSubsystem'.Static.UniqueNetIdToString(PRI.UniqueId); l = class'ServerExtMut'.Default.MaxTopPlayers; if (V.Length>l) // See if list has overflown incase an admin has changed the max stats value. V.Length = l; i = V.Find('ID',S); // First see if we have an entry from before. if (i>=0) { if (V[i].V==Value) // Stat unchanged. { if (V[i].N!=PRI.PlayerName) // Name has changed, update that. { V[i].N = PRI.PlayerName; return true; } return false; } // Remove entry and insert it back in list only if rank changed. if ((i>0 && V[i-1].VValue)) V.Remove(i,1); else // No change in rank. { if (V[i].N!=PRI.PlayerName) // Name has changed, update that. { V[i].N = PRI.PlayerName; return true; } return false; } } for (i=0; il) // See if list has overflown. V.Length = l; return true; } } return false; } static final function bool GetStat(ExtPlayerController PC, byte ListNum, int StatIndex) { local UniqueNetId ID; switch (ListNum) { case 0: if (StatIndex>=Default.TopPlaytimes.Length) return false; class'OnlineSubsystem'.Static.StringToUniqueNetId(Default.TopPlaytimes[StatIndex].ID,ID); PC.ClientGetStat(ListNum,false,Default.TopPlaytimes[StatIndex].N,ID,Default.TopPlaytimes[StatIndex].V); return true; case 1: if (StatIndex>=Default.TopKills.Length) return false; class'OnlineSubsystem'.Static.StringToUniqueNetId(Default.TopKills[StatIndex].ID,ID); PC.ClientGetStat(ListNum,false,Default.TopKills[StatIndex].N,ID,Default.TopKills[StatIndex].V); return true; case 2: if (StatIndex>=Default.TopExp.Length) return false; class'OnlineSubsystem'.Static.StringToUniqueNetId(Default.TopExp[StatIndex].ID,ID); PC.ClientGetStat(ListNum,false,Default.TopExp[StatIndex].N,ID,Default.TopExp[StatIndex].V); return true; default: return false; } }