diff --git a/.gitignore b/.gitignore index 3ea9b355..59400500 100644 --- a/.gitignore +++ b/.gitignore @@ -223,4 +223,6 @@ global.min.js bootstrap-custom.css bootstrap-custom.min.css **/Master/static -**/Master/dev_env \ No newline at end of file +**/Master/dev_env +/WebfrontCore/Views/Plugins/Stats +/WebfrontCore/wwwroot/images/icons diff --git a/Application/Manager.cs b/Application/Manager.cs index 2e741eb6..60fbb902 100644 --- a/Application/Manager.cs +++ b/Application/Manager.cs @@ -20,6 +20,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Text; using IW4MAdmin.Application.API.Master; +using System.Reflection; namespace IW4MAdmin.Application { @@ -510,5 +511,7 @@ namespace IW4MAdmin.Application { OnEvent.Set(); } + + public IList GetPluginAssemblies() => SharedLibraryCore.Plugins.PluginImporter.PluginAssemblies; } } diff --git a/Application/Server.cs b/Application/Server.cs index 34a263a8..883a37fe 100644 --- a/Application/Server.cs +++ b/Application/Server.cs @@ -308,7 +308,7 @@ namespace IW4MAdmin List matchingPlayers; - if (E.Target == null) // Find active player including quotes (multiple words) + if (E.Target == null && C.RequiresTarget) // Find active player including quotes (multiple words) { matchingPlayers = GetClientByName(E.Data.Trim()); if (matchingPlayers.Count > 1) @@ -333,7 +333,7 @@ namespace IW4MAdmin } } - if (E.Target == null) // Find active player as single word + if (E.Target == null && C.RequiresTarget) // Find active player as single word { matchingPlayers = GetClientByName(Args[0]); if (matchingPlayers.Count > 1) diff --git a/Plugins/IW4ScriptCommands/Commands/Balance.cs b/Plugins/IW4ScriptCommands/Commands/Balance.cs index 10fea7fd..d878a7cb 100644 --- a/Plugins/IW4ScriptCommands/Commands/Balance.cs +++ b/Plugins/IW4ScriptCommands/Commands/Balance.cs @@ -1,5 +1,8 @@ using SharedLibraryCore; using SharedLibraryCore.Objects; +using System.Collections.Generic; +using System.Linq; +using System.Text; using System.Threading.Tasks; namespace IW4ScriptCommands.Commands @@ -12,6 +15,48 @@ namespace IW4ScriptCommands.Commands public override async Task ExecuteAsync(GameEvent E) { + List teamAssignments = new List(); + + var clients = E.Owner.GetPlayersAsList().Select(c => new + { + Num = c.ClientNumber, + Elo = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(c.ClientId, E.Owner.GetHashCode()).EloRating, + CurrentTeam = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(c.ClientId, E.Owner.GetHashCode()).Team + }) + .OrderByDescending(c => c.Elo) + .ToList(); + + int team = 0; + for (int i = 0; i < clients.Count(); i++) + { + if (i == 0) + { + team = 1; + continue; + } + if (i == 1) + { + team = 2; + continue; + } + if (i == 2) + { + team = 2; + continue; + } + if (i % 2 == 0) + { + if (team == 1) + team = 2; + else + team = 1; + } + + teamAssignments.Add($"{clients[i].Num},{team}"); + } + + string args = string.Join(",", teamAssignments); + await E.Owner.SetDvarAsync("sv_iw4madmin_commandargs", args); await E.Owner.ExecuteCommandAsync("sv_iw4madmin_command balance"); await E.Origin.Tell("Balance command sent"); } diff --git a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj b/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj index 5102af65..e50fa904 100644 --- a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj +++ b/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj @@ -13,6 +13,7 @@ + diff --git a/Plugins/Stats/Cheat/Thresholds.cs b/Plugins/Stats/Cheat/Thresholds.cs index d9a0d74a..de0919ad 100644 --- a/Plugins/Stats/Cheat/Thresholds.cs +++ b/Plugins/Stats/Cheat/Thresholds.cs @@ -27,7 +27,7 @@ namespace IW4MAdmin.Plugins.Stats.Cheat public const int HighSampleMinKills = 100; public const double KillTimeThreshold = 0.2; - public const double MaxStrainBan = 0.4; + public const double MaxStrainBan = 1.12; public const double MaxOffset = 1.2; public const double MaxStrainFlag = 0.36; diff --git a/Plugins/Stats/Config/StatsConfiguration.cs b/Plugins/Stats/Config/StatsConfiguration.cs index 6729b6ea..232df85b 100644 --- a/Plugins/Stats/Config/StatsConfiguration.cs +++ b/Plugins/Stats/Config/StatsConfiguration.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; namespace IW4MAdmin.Plugins.Stats.Config { - class StatsConfiguration : IBaseConfiguration + public class StatsConfiguration : IBaseConfiguration { public bool EnableAntiCheat { get; set; } public List KillstreakMessages { get; set; } diff --git a/Plugins/Stats/Helpers/StatManager.cs b/Plugins/Stats/Helpers/StatManager.cs index 6d38d0fd..90a5c93b 100644 --- a/Plugins/Stats/Helpers/StatManager.cs +++ b/Plugins/Stats/Helpers/StatManager.cs @@ -11,6 +11,9 @@ using SharedLibraryCore.Objects; using SharedLibraryCore.Commands; using IW4MAdmin.Plugins.Stats.Models; using System.Text.RegularExpressions; +using IW4MAdmin.Plugins.Stats.Web.Dtos; +using SharedLibraryCore.Database; +using Microsoft.EntityFrameworkCore; namespace IW4MAdmin.Plugins.Stats.Helpers { @@ -36,6 +39,90 @@ namespace IW4MAdmin.Plugins.Stats.Helpers Servers = null; } + public EFClientStatistics GetClientStats(int clientId, int serverId) => Servers[serverId].PlayerStats[clientId]; + + public async Task> GetTopStats(int start, int count) + { + using (var context = new DatabaseContext()) + { + context.ChangeTracker.AutoDetectChangesEnabled = false; + context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; + + var thirtyDaysAgo = DateTime.UtcNow.AddMonths(-1); + var iqClientIds = (from stat in context.Set() + join client in context.Clients + on stat.ClientId equals client.ClientId +#if !DEBUG + where stat.TimePlayed >= 3600 + where client.Level != Player.Permission.Banned + where client.LastConnection >= thirtyDaysAgo + where stat.Performance > 60 +#endif + group stat by stat.ClientId into s + orderby s.Average(cs => cs.Performance) descending + select s.First().ClientId) + .Skip(start) + .Take(count); + + var clientIds = await iqClientIds.ToListAsync(); + + var iqStats = (from stat in context.Set() + join client in context.Clients + on stat.ClientId equals client.ClientId + where clientIds.Contains(client.ClientId) + select new + { + client.CurrentAlias.Name, + client.ClientId, + stat.Kills, + stat.Deaths, + stat.EloRating, + stat.Skill, + stat.TimePlayed, + client.LastConnection, + client.TotalConnectionTime + }); + + var stats = await iqStats.ToListAsync(); + + var groupedSelection = stats.GroupBy(s => s.ClientId).Select(s => + new TopStatsInfo() + { + Name = s.Select(c => c.Name).FirstOrDefault(), + // weighted based on time played + Performance = Math.Round + (s + .Where(c => (c.Skill + c.EloRating) / 2.0 > 0) + .Sum(c => (c.Skill + c.EloRating) / 2.0 * c.TimePlayed) / + s.Where(c => (c.Skill + c.EloRating) / 2.0 > 0) + .Sum(c => c.TimePlayed), 2), + // ditto + KDR = Math.Round(s + .Where(c => c.Deaths > 0) + .Sum(c => ((c.Kills / (double)c.Deaths) * c.TimePlayed) / + s.Where(d => d.Deaths > 0) + .Sum(d => d.TimePlayed)), 2), + ClientId = s.Select(c => c.ClientId).FirstOrDefault(), + Deaths = s.Sum(cs => cs.Deaths), + Kills = s.Sum(cs => cs.Kills), + LastSeen = Utilities.GetTimePassed(s.First().LastConnection, false), + TimePlayed = Math.Round(s.First().TotalConnectionTime / 3600.0, 1).ToString("#,##0"), + }); + + var statList = groupedSelection.OrderByDescending(s => s.Performance).ToList(); + + // set the ranking numerically + int i = start + 1; + foreach (var stat in statList) + { + stat.Ranking = i; + i++; + } + + return statList; + } + } + /// /// Add a server to the StatManager server pool /// @@ -495,35 +582,35 @@ namespace IW4MAdmin.Plugins.Stats.Helpers // calulate elo if (Servers[attackerStats.ServerId].PlayerStats.Count > 1) { - /* var validAttackerLobbyRatings = Servers[attackerStats.ServerId].PlayerStats - .Where(cs => cs.Value.ClientId != attackerStats.ClientId) - .Where(cs => - Servers[attackerStats.ServerId].IsTeamBased ? - cs.Value.Team != attackerStats.Team : - cs.Value.Team != IW4Info.Team.Spectator) - .Where(cs => cs.Value.Team != IW4Info.Team.Spectator); - - double attackerLobbyRating = validAttackerLobbyRatings.Count() > 0 ? - validAttackerLobbyRatings.Average(cs => cs.Value.EloRating) : - attackerStats.EloRating; - - var validVictimLobbyRatings = Servers[victimStats.ServerId].PlayerStats - .Where(cs => cs.Value.ClientId != victimStats.ClientId) - .Where(cs => - Servers[attackerStats.ServerId].IsTeamBased ? - cs.Value.Team != victimStats.Team : - cs.Value.Team != IW4Info.Team.Spectator) + /* var validAttackerLobbyRatings = Servers[attackerStats.ServerId].PlayerStats + .Where(cs => cs.Value.ClientId != attackerStats.ClientId) + .Where(cs => + Servers[attackerStats.ServerId].IsTeamBased ? + cs.Value.Team != attackerStats.Team : + cs.Value.Team != IW4Info.Team.Spectator) .Where(cs => cs.Value.Team != IW4Info.Team.Spectator); - double victimLobbyRating = validVictimLobbyRatings.Count() > 0 ? - validVictimLobbyRatings.Average(cs => cs.Value.EloRating) : - victimStats.EloRating;*/ + double attackerLobbyRating = validAttackerLobbyRatings.Count() > 0 ? + validAttackerLobbyRatings.Average(cs => cs.Value.EloRating) : + attackerStats.EloRating; + + var validVictimLobbyRatings = Servers[victimStats.ServerId].PlayerStats + .Where(cs => cs.Value.ClientId != victimStats.ClientId) + .Where(cs => + Servers[attackerStats.ServerId].IsTeamBased ? + cs.Value.Team != victimStats.Team : + cs.Value.Team != IW4Info.Team.Spectator) + .Where(cs => cs.Value.Team != IW4Info.Team.Spectator); + + double victimLobbyRating = validVictimLobbyRatings.Count() > 0 ? + validVictimLobbyRatings.Average(cs => cs.Value.EloRating) : + victimStats.EloRating;*/ double attackerEloDifference = Math.Log(Math.Max(1, victimStats.EloRating)) - Math.Log(Math.Max(1, attackerStats.EloRating)); double winPercentage = 1.0 / (1 + Math.Pow(10, attackerEloDifference / Math.E)); - // double victimEloDifference = Math.Log(Math.Max(1, attackerStats.EloRating)) - Math.Log(Math.Max(1, victimStats.EloRating)); - // double lossPercentage = 1.0 / (1 + Math.Pow(10, victimEloDifference/ Math.E)); + // double victimEloDifference = Math.Log(Math.Max(1, attackerStats.EloRating)) - Math.Log(Math.Max(1, victimStats.EloRating)); + // double lossPercentage = 1.0 / (1 + Math.Pow(10, victimEloDifference/ Math.E)); attackerStats.EloRating += 6.0 * (1 - winPercentage); victimStats.EloRating -= 6.0 * (1 - winPercentage); diff --git a/Plugins/Stats/Plugin.cs b/Plugins/Stats/Plugin.cs index 77196a0f..f159d20f 100644 --- a/Plugins/Stats/Plugin.cs +++ b/Plugins/Stats/Plugin.cs @@ -16,7 +16,7 @@ using IW4MAdmin.Plugins.Stats.Models; namespace IW4MAdmin.Plugins.Stats { - class Plugin : IPlugin + public class Plugin : IPlugin { public string Name => "Simple Stats"; diff --git a/Plugins/Stats/Stats.csproj b/Plugins/Stats/Stats.csproj index 690c5a40..7ea7c212 100644 --- a/Plugins/Stats/Stats.csproj +++ b/Plugins/Stats/Stats.csproj @@ -14,12 +14,9 @@ Debug;Release;Prerelease - - - - + @@ -30,4 +27,8 @@ + + + + diff --git a/Plugins/Stats/Web/Controllers/StatsController.cs b/Plugins/Stats/Web/Controllers/StatsController.cs new file mode 100644 index 00000000..658f15d2 --- /dev/null +++ b/Plugins/Stats/Web/Controllers/StatsController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Mvc; +using SharedLibraryCore; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using WebfrontCore.Controllers; + +namespace IW4MAdmin.Plugins.Stats.Web.Controllers +{ + public class StatsController : BaseController + { + [HttpGet] + public async Task TopPlayersAsync() + { + ViewBag.Title = Utilities.CurrentLocalization.LocalizationIndex.Set["WEBFRONT_STATS_INDEX_TITLE"]; + ViewBag.Description = Utilities.CurrentLocalization.LocalizationIndex.Set["WEBFRONT_STATS_INDEX_DESC"]; + + return View("Index", await Plugin.Manager.GetTopStats(0, 15)); + } + + [HttpGet] + public async Task GetTopPlayersAsync(int count, int offset) + { + return View("_List", await Plugin.Manager.GetTopStats(offset, count)); + } + } +} diff --git a/Plugins/Stats/Web/Dtos/TopStatsInfo.cs b/Plugins/Stats/Web/Dtos/TopStatsInfo.cs new file mode 100644 index 00000000..5c58ec6b --- /dev/null +++ b/Plugins/Stats/Web/Dtos/TopStatsInfo.cs @@ -0,0 +1,20 @@ +using SharedLibraryCore.Dtos; +using System; +using System.Collections.Generic; +using System.Text; + +namespace IW4MAdmin.Plugins.Stats.Web.Dtos +{ + public class TopStatsInfo : SharedInfo + { + public int Ranking { get; set; } + public string Name { get; set; } + public int ClientId { get; set; } + public double KDR { get; set; } + public double Performance { get; set; } + public string TimePlayed { get; set; } + public string LastSeen { get; set; } + public int Kills { get; set; } + public int Deaths { get; set; } + } +} diff --git a/Plugins/Stats/Web/Views/Stats/Index.cshtml b/Plugins/Stats/Web/Views/Stats/Index.cshtml new file mode 100644 index 00000000..2c5b4a1f --- /dev/null +++ b/Plugins/Stats/Web/Views/Stats/Index.cshtml @@ -0,0 +1,13 @@ +@model List +

@ViewBag.Title

+ +
+ @await Html.PartialAsync("_List", Model) +
+ + @section scripts { + + + + + } \ No newline at end of file diff --git a/Plugins/Stats/Web/Views/Stats/_List.cshtml b/Plugins/Stats/Web/Views/Stats/_List.cshtml new file mode 100644 index 00000000..086be36b --- /dev/null +++ b/Plugins/Stats/Web/Views/Stats/_List.cshtml @@ -0,0 +1,50 @@ +@model List +@{ + Layout = null; + var loc = SharedLibraryCore.Utilities.CurrentLocalization.LocalizationIndex.Set; + double getDeviation(double deviations) => Math.Pow(Math.E, 5.0813 + (deviations * 0.8694)); + string rankIcon(double elo) + { + if (elo >= getDeviation(-1) && elo < getDeviation(-0.25)) + return "0_no-place/menu_div_no_place.png"; + if (elo >= getDeviation(-0.25) && elo < getDeviation(0.25)) + return "1_iron/menu_div_iron_sub03.png"; + if (elo >= getDeviation(0.25) && elo < getDeviation(0.6875)) + return "2_bronze/menu_div_bronze_sub03.png"; + if (elo >= getDeviation(0.6875) && elo < getDeviation(1)) + return "3_silver/menu_div_silver_sub03.png"; + if (elo >= getDeviation(1) && elo < getDeviation(1.25)) + return "4_gold/menu_div_gold_sub03.png"; + if (elo >= getDeviation(1.25) && elo < getDeviation(1.5)) + return "5_platinum/menu_div_platinum_sub03.png"; + if (elo >= getDeviation(1.5) && elo < getDeviation(1.75)) + return "6_semipro/menu_div_semipro_sub03.png"; + if (elo >= getDeviation(1.75)) + return "7_pro/menu_div_pro_sub03.png"; + + return "0_no-place/menu_div_no_place.png"; + } +} + + @foreach (var stat in Model) + { + + + + + } +
+
+

#@stat.Ranking — @Html.ActionLink(stat.Name, "ProfileAsync", "Client", new { id = stat.ClientId })

+ @stat.Performance @loc["PLUGINS_STATS_COMMANDS_PERFORMANCE"]
+ @stat.KDR @loc["PLUGINS_STATS_TEXT_KDR"] + @stat.Kills @loc["PLUGINS_STATS_TEXT_KILLS"] + @stat.Deaths @loc["PLUGINS_STATS_TEXT_DEATHS"]
+ @loc["WEBFRONT_PROFILE_PLAYER"] @stat.TimePlayed @loc["GLOBAL_HOURS"]
+ @loc["WEBFRONT_PROFILE_LSEEN"] @stat.LastSeen @loc["WEBFRONT_PENALTY_TEMPLATE_AGO"] +
+
+
+ +
+
diff --git a/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/dds/menu_div_no_place.dds b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/dds/menu_div_no_place.dds new file mode 100644 index 00000000..62af07b1 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/dds/menu_div_no_place.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/dds/menu_div_no_place_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/dds/menu_div_no_place_64.dds new file mode 100644 index 00000000..592f42c8 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/dds/menu_div_no_place_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/menu_div_no_place.png b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/menu_div_no_place.png new file mode 100644 index 00000000..cc9e0e56 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/menu_div_no_place.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png new file mode 100644 index 00000000..64b6dfe6 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/0_no-place/menu_div_no_place_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron.dds new file mode 100644 index 00000000..5f1bc4d2 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_64.dds new file mode 100644 index 00000000..7a4c47cb Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub01.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub01.dds new file mode 100644 index 00000000..180c8217 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub01.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub01_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub01_64.dds new file mode 100644 index 00000000..61b54c4a Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub01_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub02.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub02.dds new file mode 100644 index 00000000..e5ce688e Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub02.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub02_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub02_64.dds new file mode 100644 index 00000000..48da2cd8 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub02_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub03.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub03.dds new file mode 100644 index 00000000..204182d1 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub03.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub03_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub03_64.dds new file mode 100644 index 00000000..25847823 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/dds/menu_div_iron_sub03_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron.png new file mode 100644 index 00000000..0e3fb3c0 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_64.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_64.png new file mode 100644 index 00000000..4fd07dd0 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png new file mode 100644 index 00000000..c440d454 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub01.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png new file mode 100644 index 00000000..77a60574 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub01_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png new file mode 100644 index 00000000..01f36607 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub02.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png new file mode 100644 index 00000000..52e9f604 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub02_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub03.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub03.png new file mode 100644 index 00000000..9ee5d882 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub03.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png new file mode 100644 index 00000000..e04bd522 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/1_iron/menu_div_iron_sub03_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze.dds new file mode 100644 index 00000000..c2c4a760 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_64.dds new file mode 100644 index 00000000..bf0710f8 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub01.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub01.dds new file mode 100644 index 00000000..2a6a56d8 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub01.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub01_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub01_64.dds new file mode 100644 index 00000000..e1729d70 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub01_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub02.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub02.dds new file mode 100644 index 00000000..d52d3af2 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub02.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub02_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub02_64.dds new file mode 100644 index 00000000..e8c3ec97 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub02_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub03.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub03.dds new file mode 100644 index 00000000..e61f4fe8 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub03.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub03_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub03_64.dds new file mode 100644 index 00000000..c758ac83 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/dds/menu_div_bronze_sub03_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze.png new file mode 100644 index 00000000..daa65c02 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png new file mode 100644 index 00000000..374beb5a Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png new file mode 100644 index 00000000..801d2385 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png new file mode 100644 index 00000000..b647d0e7 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub01_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png new file mode 100644 index 00000000..d3c10819 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png new file mode 100644 index 00000000..eb270fb4 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub02_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03.png new file mode 100644 index 00000000..c644c8ed Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png new file mode 100644 index 00000000..06cd5e2f Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/2_bronze/menu_div_bronze_sub03_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver.dds new file mode 100644 index 00000000..202ac48c Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_64.dds new file mode 100644 index 00000000..80093e1e Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub01.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub01.dds new file mode 100644 index 00000000..eceae447 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub01.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub01_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub01_64.dds new file mode 100644 index 00000000..1ea0d48c Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub01_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub02.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub02.dds new file mode 100644 index 00000000..1fd1e149 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub02.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub02_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub02_64.dds new file mode 100644 index 00000000..dab4f1a9 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub02_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub03.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub03.dds new file mode 100644 index 00000000..be41ccf6 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub03.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub03_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub03_64.dds new file mode 100644 index 00000000..d9eb930e Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/dds/menu_div_silver_sub03_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver.png new file mode 100644 index 00000000..87683e19 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_64.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_64.png new file mode 100644 index 00000000..19b996d8 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png new file mode 100644 index 00000000..1b7123b5 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub01.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png new file mode 100644 index 00000000..e6b9b29b Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub01_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png new file mode 100644 index 00000000..77b66efc Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub02.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png new file mode 100644 index 00000000..ac03e9c1 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub02_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub03.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub03.png new file mode 100644 index 00000000..8eb75894 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub03.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png new file mode 100644 index 00000000..4b88f605 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/3_silver/menu_div_silver_sub03_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold.dds new file mode 100644 index 00000000..772bc370 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_64.dds new file mode 100644 index 00000000..dcf3252a Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub01.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub01.dds new file mode 100644 index 00000000..8cb336e1 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub01.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub01_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub01_64.dds new file mode 100644 index 00000000..b520c6cb Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub01_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub02.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub02.dds new file mode 100644 index 00000000..1966c2cc Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub02.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub02_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub02_64.dds new file mode 100644 index 00000000..0c3215dc Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub02_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub03.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub03.dds new file mode 100644 index 00000000..ce7a3988 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub03.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub03_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub03_64.dds new file mode 100644 index 00000000..b707b2af Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/dds/menu_div_gold_sub03_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold.png new file mode 100644 index 00000000..9b572f6d Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_64.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_64.png new file mode 100644 index 00000000..2cfd7a53 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png new file mode 100644 index 00000000..a4ed5d3f Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub01.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png new file mode 100644 index 00000000..a9c6b90e Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub01_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png new file mode 100644 index 00000000..198ce4c5 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub02.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png new file mode 100644 index 00000000..d9e2b862 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub02_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub03.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub03.png new file mode 100644 index 00000000..f44ef164 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub03.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png new file mode 100644 index 00000000..2b858d04 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/4_gold/menu_div_gold_sub03_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum.dds new file mode 100644 index 00000000..74603011 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_64.dds new file mode 100644 index 00000000..ff2a37b4 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub01.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub01.dds new file mode 100644 index 00000000..2622aa29 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub01.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub01_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub01_64.dds new file mode 100644 index 00000000..bdce4570 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub01_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub02.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub02.dds new file mode 100644 index 00000000..51fcd45f Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub02.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub02_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub02_64.dds new file mode 100644 index 00000000..275c0926 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub02_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub03.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub03.dds new file mode 100644 index 00000000..109d0319 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub03.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub03_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub03_64.dds new file mode 100644 index 00000000..cb671b36 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/dds/menu_div_platinum_sub03_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum.png new file mode 100644 index 00000000..58ad2ada Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png new file mode 100644 index 00000000..de94aa26 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png new file mode 100644 index 00000000..b726af86 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png new file mode 100644 index 00000000..321166e8 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub01_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png new file mode 100644 index 00000000..36cfc5e2 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png new file mode 100644 index 00000000..9de5cd27 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub02_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03.png new file mode 100644 index 00000000..5738a84a Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png new file mode 100644 index 00000000..e2ef3b7d Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/5_platinum/menu_div_platinum_sub03_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro.dds new file mode 100644 index 00000000..38884ba5 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_64.dds new file mode 100644 index 00000000..ce319236 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub01.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub01.dds new file mode 100644 index 00000000..c0f0449e Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub01.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub01_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub01_64.dds new file mode 100644 index 00000000..395411ab Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub01_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub02.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub02.dds new file mode 100644 index 00000000..ffb3b9db Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub02.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub02_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub02_64.dds new file mode 100644 index 00000000..3f9a10c4 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub02_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub03.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub03.dds new file mode 100644 index 00000000..39b6bf83 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub03.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub03_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub03_64.dds new file mode 100644 index 00000000..265b4955 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/dds/menu_div_semipro_sub03_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro.png new file mode 100644 index 00000000..d9a01691 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png new file mode 100644 index 00000000..e5cc66ec Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png new file mode 100644 index 00000000..e2ccae01 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png new file mode 100644 index 00000000..ba95f301 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub01_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png new file mode 100644 index 00000000..fb6dff40 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png new file mode 100644 index 00000000..7c57bef0 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub02_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03.png new file mode 100644 index 00000000..284818b7 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png new file mode 100644 index 00000000..ea241caf Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/6_semipro/menu_div_semipro_sub03_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro.dds new file mode 100644 index 00000000..5721f81d Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_64.dds new file mode 100644 index 00000000..a2e24086 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub01.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub01.dds new file mode 100644 index 00000000..1f362891 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub01.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub01_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub01_64.dds new file mode 100644 index 00000000..4090510a Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub01_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub02.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub02.dds new file mode 100644 index 00000000..a59f2138 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub02.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub02_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub02_64.dds new file mode 100644 index 00000000..59fbaafc Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub02_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub03.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub03.dds new file mode 100644 index 00000000..6caa1079 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub03.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub03_64.dds b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub03_64.dds new file mode 100644 index 00000000..422c91f3 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/dds/menu_div_pro_sub03_64.dds differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro.png new file mode 100644 index 00000000..26e69611 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_64.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_64.png new file mode 100644 index 00000000..b6243820 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png new file mode 100644 index 00000000..f70b3638 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub01.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png new file mode 100644 index 00000000..2bac9521 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub01_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png new file mode 100644 index 00000000..4af26287 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub02.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png new file mode 100644 index 00000000..baabc426 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub02_64.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub03.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub03.png new file mode 100644 index 00000000..23ba7eae Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub03.png differ diff --git a/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png new file mode 100644 index 00000000..3ac6ffb9 Binary files /dev/null and b/Plugins/Stats/Web/wwwroot/images/icons/7_pro/menu_div_pro_sub03_64.png differ diff --git a/SharedLibraryCore/Interfaces/IManager.cs b/SharedLibraryCore/Interfaces/IManager.cs index 2e0797d4..8b18e118 100644 --- a/SharedLibraryCore/Interfaces/IManager.cs +++ b/SharedLibraryCore/Interfaces/IManager.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using SharedLibraryCore.Objects; using SharedLibraryCore.Services; using SharedLibraryCore.Configuration; +using System.Reflection; namespace SharedLibraryCore.Interfaces { @@ -33,5 +34,6 @@ namespace SharedLibraryCore.Interfaces /// void SetHasEvent(); bool ShutdownRequested(); + IList GetPluginAssemblies(); } } diff --git a/SharedLibraryCore/PluginImporter.cs b/SharedLibraryCore/PluginImporter.cs index 0afa0a86..04f5d0b7 100644 --- a/SharedLibraryCore/PluginImporter.cs +++ b/SharedLibraryCore/PluginImporter.cs @@ -10,6 +10,7 @@ namespace SharedLibraryCore.Plugins { public static List ActiveCommands = new List(); public static List ActivePlugins = new List(); + public static List PluginAssemblies = new List(); public static bool Load(IManager Manager) { @@ -24,7 +25,7 @@ namespace SharedLibraryCore.Plugins ICollection assemblies = new List(dllFileNames.Length); foreach (string dllFile in dllFileNames) { - // byte[] rawDLL = File.ReadAllBytes(dllFile); + // byte[] rawDLL = File.ReadAllBytes(dllFile); //Assembly assembly = Assembly.Load(rawDLL); assemblies.Add(Assembly.LoadFrom(dllFile)); } @@ -58,6 +59,7 @@ namespace SharedLibraryCore.Plugins if (ActivePlugins.Find(x => x.Name == newNotify.Name) == null) { ActivePlugins.Add(newNotify); + PluginAssemblies.Add(Plugin); Manager.GetLogger().WriteDebug($"Loaded plugin \"{ newNotify.Name }\" [{newNotify.Version}]"); LoadedPlugins++; } diff --git a/WebfrontCore/Startup.cs b/WebfrontCore/Startup.cs index dcfa163a..570ba69c 100644 --- a/WebfrontCore/Startup.cs +++ b/WebfrontCore/Startup.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -8,6 +9,7 @@ using Microsoft.Extensions.Logging; using SharedLibraryCore.Database; using System; using System.IO; +using System.Reflection; namespace WebfrontCore { @@ -31,7 +33,16 @@ namespace WebfrontCore public void ConfigureServices(IServiceCollection services) { // Add framework services. - services.AddMvc(); + var mvcBulder = services.AddMvc(); + + foreach (var asm in Program.Manager.GetPluginAssemblies()) + mvcBulder.AddApplicationPart(asm); + + services.Configure(o => + { + o.ViewLocationFormats.Add("/Views/Plugins/{1}/{0}" + RazorViewEngine.ViewExtension); + }); + services.AddEntityFrameworkSqlite() .AddDbContext(); diff --git a/WebfrontCore/bundleconfig.json b/WebfrontCore/bundleconfig.json index b234f2d4..a38a40a0 100644 --- a/WebfrontCore/bundleconfig.json +++ b/WebfrontCore/bundleconfig.json @@ -22,7 +22,8 @@ "wwwroot/js/penalty.js", "wwwroot/js/profile.js", "wwwroot/js/server.js", - "wwwroot/js/search.js" + "wwwroot/js/search.js", + "wwwroot/js/loader.js" ], // Optionally specify minification options "minify": { diff --git a/WebfrontCore/wwwroot/css/bootstrap-custom.scss b/WebfrontCore/wwwroot/css/bootstrap-custom.scss index 0de85b11..d0ccf771 100644 --- a/WebfrontCore/wwwroot/css/bootstrap-custom.scss +++ b/WebfrontCore/wwwroot/css/bootstrap-custom.scss @@ -67,6 +67,10 @@ a.nav-link { border-bottom: 2px solid $primary !important; } +.border-top { + border-top: 1px solid $primary !important; +} + #client_search { background-color: #222222 !important; border-radius: 0; @@ -174,3 +178,8 @@ select { border-bottom: 1px solid $secondary; margin-top: -3px; } + +.stats-ranking-icon { + width: 32px; + height: 32px; +} diff --git a/WebfrontCore/wwwroot/js/loader.js b/WebfrontCore/wwwroot/js/loader.js new file mode 100644 index 00000000..09ed54a9 --- /dev/null +++ b/WebfrontCore/wwwroot/js/loader.js @@ -0,0 +1,84 @@ +let offset = 15; +let loadCount = 15; +let isLoading = false; +let loadUri = ''; +let loaderResponseId = ''; + +function initLoader(location, loaderId) { + loadUri = location; + loaderResponseId = loaderId; + setupListeners(); +} + +function loadMoreItems() { + if (isLoading) { + return false; + } + + showLoader(); + isLoading = true; + $.get(loadUri, { offset: offset, count : loadCount }) + .done(function (response) { + $(loaderResponseId).append(response); + if (response.trim().length === 0) { + staleLoader(); + } + hideLoader(); + isLoading = false; + }) + .fail(function (jqxhr, statis, error) { + errorLoader(); + isLoading = false; + }); + offset += loadCount; +} + +function setupListeners() { +if ($(loaderResponseId).length === 1) { +/* + https://stackoverflow.com/questions/19731730/jquery-js-detect-users-scroll-attempt-without-any-window-overflow-to-scroll + */ + + $('html').bind('mousewheel DOMMouseScroll', function (e) { + var delta = (e.originalEvent.wheelDelta || -e.originalEvent.detail); + + if (delta < 0 && !hasScrollBar) { + loadMoreItems(); + } + }); + + /* + https://stackoverflow.com/questions/3898130/check-if-a-user-has-scrolled-to-the-bottom + */ + + var _throttleTimer = null; + var _throttleDelay = 100; + var $window = $(window); + var $document = $(document); + var hasScrollBar = false; + + $document.ready(function () { + $window + .off('scroll', ScrollHandler) + .on('scroll', ScrollHandler); + + /*$('#load_penalties_button').click(function () { + loadMorePenalties(); + });*/ + }); + + function ScrollHandler(e) { + //throttle event: + hasScrollBar = true; + clearTimeout(_throttleTimer); + _throttleTimer = setTimeout(function () { + + //do work + if ($window.scrollTop() + $window.height() > $document.height() - 100) { + loadMoreItems(); + } + + }, _throttleDelay); + } +} +} \ No newline at end of file diff --git a/_commands.gsc b/_commands.gsc index bda9f3a9..551474f8 100644 --- a/_commands.gsc +++ b/_commands.gsc @@ -12,19 +12,45 @@ WaitForCommand() for(;;) { command = getDvar("sv_iw4madmin_command"); + commandArgs = strtok(getDvar("sv_iw4madmin_commandargs"), ","); + switch(command) { case "balance": - if (isRoundBased()) - { - iPrintLnBold("Balancing Teams.."); - level maps\mp\gametypes\_teams::balanceTeams(); - } + BalanceTeams(commandArgs); break; } setDvar("sv_iw4madmin_command", ""); + setDvar("sv_iw4madmin_commandargs", ""); wait(1); } +} + +BalanceTeams(commandArgs) +{ + if (isRoundBased()) + { + iPrintLnBold("Balancing Teams.."); + + for (i = 0; i < commandArgs.size; i+= 2) + { + newTeam = i + 1 = "1" ? axis : allies; + player = level.players[i]; + + if (!isPlayer(player)) + continue; + + switch (newTeam) + { + case "axis": + player[[level.axis]](); + break; + case "allies": + player[[level.allies]](); + break; + } + } + } } \ No newline at end of file