diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cbbd0b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/ +obj/ \ No newline at end of file diff --git a/.vs/StatKeeper/v14/.suo b/.vs/StatKeeper/v14/.suo new file mode 100644 index 0000000..97b3320 Binary files /dev/null and b/.vs/StatKeeper/v14/.suo differ diff --git a/CommandStats.cs b/CommandStats.cs new file mode 100644 index 0000000..056e693 --- /dev/null +++ b/CommandStats.cs @@ -0,0 +1,236 @@ +using System.Collections.Generic; +using Rocket.API; +using Rocket.Unturned.Player; +using UnityEngine; + +namespace StatKeeper +{ + public class CommandStats : IRocketCommand + { + public AllowedCaller AllowedCaller + { + get + { + return AllowedCaller.Player; + } + } + + public List Permissions + { + get + { + return new List() { + "statkeeper.stats" + }; + } + } + public bool RunFromConsole + { + get { return false; } + } + + public string Name + { + get { return "stats"; } + } + public string Syntax + { + get + { + return " "; + } + } + public string Help + { + get { return "Enter player name to see stats of player or no player name to view your stats."; } + } + public List Aliases + { + get { return new List { "stats" }; } + } + + private string showPVP(UnturnedPlayer player,Stats stats) + { + return player.CharacterName + "'s PvP Stats: Total Kills [" + stats.TotalKills + "]" + + ", Total Deaths [" + stats.TotalDeaths + "]" + ", KD [" + stats.KDRatio + "]" + ", Gun Kills [" + stats.GetKills(SDG.Unturned.EDeathCause.GUN.ToString()) + "]" + + ", Melee Kills [" + stats.GetKills(SDG.Unturned.EDeathCause.MELEE.ToString()) + "]" + ", Punch Kills [" + stats.GetKills(SDG.Unturned.EDeathCause.PUNCH.ToString()) + "]" + ", Road Kills [" + stats.GetKills(SDG.Unturned.EDeathCause.ROADKILL.ToString()) + "]" + + ", Gun Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.GUN.ToString()) + "]" + ", Melee Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.MELEE.ToString()) + "]" + ", Punch Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.PUNCH.ToString()) + "]" + + ", Road Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.ROADKILL.ToString()) + "]" + ", Suicides [" + stats.GetDeaths(SDG.Unturned.EDeathCause.SUICIDE.ToString()) + "]"; + } + + private string showPVE(UnturnedPlayer player, Stats stats) + { + return player.CharacterName + "'s PvE Stats: Total Deaths [" + stats.TotalDeaths + "]" + + ", Zombie Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.ZOMBIE.ToString()) + "]" + ", Vehicle Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.VEHICLE.ToString()) + "]" + ", Food Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.FOOD.ToString()) + "]" + + ", Water Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.WATER.ToString()) + "]" + ", Infection Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.INFECTION.ToString()) + "]" + ", Bleeding Deaths [" + stats.GetDeaths(SDG.Unturned.EDeathCause.BLEEDING.ToString()) + "]"; + } + + private string showTK(UnturnedPlayer player, Stats stats) + { + return player.CharacterName + "'s Total Kills: [" + stats.TotalKills + "]"; + } + + private string showTD(UnturnedPlayer player, Stats stats) + { + return player.CharacterName + "'s Total Deaths: PvP[" + stats.TotalDeaths + "]"; + } + + private string showKD(UnturnedPlayer player, Stats stats) + { + return player.CharacterName + "'s KD: [" + stats.KDRatio + "]"; + } + + + + public void Execute(IRocketPlayer caller, string[] command) + { + UnturnedPlayer player = (UnturnedPlayer)caller; + + Stats stats = player.GetComponent().Stats.Instance; + + if (command.Length < 1) + { + return; + } + if (command[0].ToString().ToLower() == "pvp") + { + if (command.Length == 1) + { + Rocket.Unturned.Chat.UnturnedChat.Say(player, showPVP(player, stats), Color.yellow); + } + if (command.Length == 2) + { + if(player.HasPermission("stats.admin")) + { + UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); + if (target == null) + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "Player does not exist or is offline!", Color.yellow); + } + else + { + Stats targetStats = target.GetComponent().Stats.Instance; + Rocket.Unturned.Chat.UnturnedChat.Say(player, showPVP(target, targetStats), Color.yellow); + } + } + else + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "You do not have permission to use this command!", Color.red); + } + } + } + else if (command[0].ToString().ToLower() == "pve") + { + if (command.Length == 1) + { + Rocket.Unturned.Chat.UnturnedChat.Say(player, showPVE(player, stats), Color.yellow); + } + if (command.Length == 2) + { + if(player.HasPermission("stats.admin")) + { + UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); + if (target == null) + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "Player does not exist or is offline!", Color.yellow); + } + else + { + Stats targetStats = target.GetComponent().Stats.Instance; + Rocket.Unturned.Chat.UnturnedChat.Say(player, showPVE(target, targetStats), Color.yellow); + } + } + else + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "You do not have permission to use this command!", Color.red); + } + } + } + else if (command[0].ToString().ToLower() == "tk") + { + if (command.Length == 1) + { + Rocket.Unturned.Chat.UnturnedChat.Say(player, showTK(player, stats), Color.yellow); + } + else if (command.Length == 2) + { + if(player.HasPermission("stats.admin")) + { + UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); + if (target == null) + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "Player does not exist or is offline!", Color.yellow); + } + else + { + Stats targetStats = target.GetComponent().Stats.Instance; + Rocket.Unturned.Chat.UnturnedChat.Say(player, showTK(target, targetStats), Color.yellow); + } + } + else + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "You do not have permission to use this command!", Color.red); + } + } + } + else if (command[0].ToString().ToLower() == "td") + { + if (command.Length == 1) + { + Rocket.Unturned.Chat.UnturnedChat.Say(player, showTD(player, stats), Color.yellow); + } + else if (command.Length == 2) + { + if(player.HasPermission("stats.admin")) + { + UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); + if (target == null) + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "Player does not exist or is offline!", Color.yellow); + } + else + { + Stats targetStats = target.GetComponent().Stats.Instance; + Rocket.Unturned.Chat.UnturnedChat.Say(player, showTD(target, targetStats), Color.yellow); + } + } + else + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "You do not have permission to use this command!", Color.red); + } + } + } + else if (command[0].ToString().ToLower() == "kd") + { + if (command.Length == 1) + { + Rocket.Unturned.Chat.UnturnedChat.Say(player, showKD(player, stats), Color.yellow); + } + else if (command.Length == 2) + { + if(player.HasPermission("stats.admin")) + { + UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); + if (target == null) + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "Player does not exist or is offline!", Color.yellow); + } + else + { + Stats targetStats = target.GetComponent().Stats.Instance; + Rocket.Unturned.Chat.UnturnedChat.Say(player, showKD(target, targetStats), Color.yellow); + } + } + else + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "You do not have permission to use this command!", Color.red); + } + } + } + else + { + Rocket.Unturned.Chat.UnturnedChat.Say (player, "Not a valid mode or stat node! Select mode: pvp or pve, or a stat node: tk, td, or kd.", Color.yellow); + } + } + } +} \ No newline at end of file diff --git a/Commands/Stats.cs b/Commands/Stats.cs deleted file mode 100644 index fa94e63..0000000 --- a/Commands/Stats.cs +++ /dev/null @@ -1,275 +0,0 @@ -using System; -using System.Data; -using System.Xml; -using System.Windows.Forms; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.IO; -using System.Threading; -using System.Windows; -using draw = System.Drawing; -using Rocket.API; -using Rocket.Unturned; -using Rocket.Unturned.Commands; -using Rocket.Unturned.Player; -using Rocket.Unturned.Chat; -using SDG.Unturned; -using UnityEngine; - -namespace StatKeeperCommands -{ - public class StatsCommand : IRocketCommand - { - public bool AllowFromConsole - { - get - { - return false; - } - } - public List Permissions - { - get - { - return new List() { - "statkeeper.stats" - }; - } - } - public bool RunFromConsole - { - get { return false; } - } - - public string Name - { - get { return "stats"; } - } - public string Syntax - { - get - { - return " "; - } - } - public string Help - { - get { return "Enter player name to see stats of player or no player name to view your stats."; } - } - public List Aliases - { - get { return new List { "stats" }; } - } - - public void Execute(IRocketPlayer caller, string[] command) - { - UnturnedPlayer cPlayer = (UnturnedPlayer)caller; - - if (command.Length < 1) - { - return; - } - if (command[0].ToString().ToLower() == "pvp") - { - if (command.Length == 1) - { - UnturnedPlayer target = (UnturnedPlayer)caller; - StatKeeper.Utility.readPVPNode(target); - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == false) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readPVPNode(target); - } - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == true) - { - if(cPlayer.HasPermission("stats.admin")) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readPVPNode(target); - } - } - else - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "You do not have permission to use this command!", Color.red); - } - } - } - else if (command[0].ToString().ToLower() == "pve") - { - if (command.Length == 1) - { - UnturnedPlayer target = (UnturnedPlayer)caller; - StatKeeper.Utility.readPVENode(target); - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == false) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readPVENode(target); - } - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == true) - { - if(cPlayer.HasPermission("stats.admin")) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readPVENode(target); - } - } - else - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "You do not have permission to use this command!", Color.red); - } - } - } - else if (command[0].ToString().ToLower() == "tk") - { - if (command.Length == 1) - { - UnturnedPlayer target = (UnturnedPlayer)caller; - StatKeeper.Utility.readTKNode(target); - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == false) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readTKNode(target); - } - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == true) - { - if(cPlayer.HasPermission("stats.admin")) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readTKNode(target); - } - } - else - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "You do not have permission to use this command!", Color.red); - } - } - } - else if (command[0].ToString().ToLower() == "td") - { - if (command.Length == 1) - { - UnturnedPlayer target = (UnturnedPlayer)caller; - StatKeeper.Utility.readTDNode(target); - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == false) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readTDNode(target); - } - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == true) - { - if(cPlayer.HasPermission("stats.admin")) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readTDNode(target); - } - } - else - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "You do not have permission to use this command!", Color.red); - } - } - } - else if (command[0].ToString().ToLower() == "kd") - { - if (command.Length == 1) - { - UnturnedPlayer target = (UnturnedPlayer)caller; - StatKeeper.Utility.readKDNode(target); - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == false) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readKDNode(target); - } - } - if (command.Length == 2 && StatKeeper.Configuration.Instance.AdminView == true) - { - if(cPlayer.HasPermission("stats.admin")) - { - UnturnedPlayer target = UnturnedPlayer.FromName(command[1].ToString().ToLower()); - if (target == null) - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Player does not exist or is offline!", Color.yellow); - } - else - { - StatKeeper.Utility.readKDNode(target); - } - } - else - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "You do not have permission to use this command!", Color.red); - } - } - } - else - { - Rocket.Unturned.Chat.UnturnedChat.Say (cPlayer, "Not a valid mode or stat node! Select mode: pvp or pve, or a stat node: tk, td, or kd.", Color.yellow); - } - } - } -} \ No newline at end of file diff --git a/Config.cs b/Config.cs index 0133de8..46308d9 100644 --- a/Config.cs +++ b/Config.cs @@ -1,40 +1,11 @@ -using System; -using System.Xml; -using System.Windows.Forms; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.IO; -using System.Reflection; -using System.ComponentModel; -using Rocket.Core; -using Rocket.Core.Logging; -using Rocket.Unturned; -using Rocket.Unturned.Chat; -using Rocket.Unturned.Player; -using Rocket.Unturned.Commands; -using Rocket.Unturned.Enumerations; -using Rocket.Unturned.Events; -using Rocket.API; -using Rocket.API.Collections; -using Rocket.Core.Plugins; -using Rocket.Unturned.Plugins; -using SDG; -using SDG.Unturned; -using UnityEngine; +using Rocket.API; namespace StatKeeper { public class Configuration : IRocketPluginConfiguration { - public static Configuration Instance; - - public bool AdminView; - public void LoadDefaults() { - AdminView = false; } } } diff --git a/Plugin.cs b/Plugin.cs index adb4f5b..e5f8519 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -1,28 +1,9 @@ -using System; -using System.Xml; -using System.Windows.Forms; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.IO; -using System.Reflection; -using System.ComponentModel; -using Rocket.Core; +using System.Xml; using Rocket.Core.Logging; using Rocket.Unturned; -using Rocket.Unturned.Chat; using Rocket.Unturned.Player; -using Rocket.Unturned.Commands; -using Rocket.Unturned.Enumerations; -using Rocket.Unturned.Events; -using Rocket.API; -using Rocket.API.Collections; using Rocket.Core.Plugins; -using Rocket.Unturned.Plugins; -using SDG; -using SDG.Unturned; -using UnityEngine; +using System.IO; namespace StatKeeper { @@ -34,386 +15,8 @@ protected override void Load() { Instance = this; Logger.Log("StatKeeper has been loaded!"); - U.Events.OnPlayerConnected += Events_OnPlayerConnected; - U.Events.OnPlayerDisconnected += Events_OnPlayerDisconnected; - Rocket.Unturned.Events.UnturnedPlayerEvents.OnPlayerDeath += UnturnedPlayerEvents_OnPlayerDeath; - - string currentPath = System.IO.Directory.GetCurrentDirectory(); - System.IO.Directory.CreateDirectory(currentPath + "\\Plugins\\StatKeeper\\Stats"); - } - protected override void Unload() - { - U.Events.OnPlayerConnected -= Events_OnPlayerConnected; - U.Events.OnPlayerDisconnected -= Events_OnPlayerDisconnected; - base.Unload (); - } - private void Events_OnPlayerConnected(UnturnedPlayer player) - { - string currentPath = System.IO.Directory.GetCurrentDirectory(); - - //create initial stat file - string filePath = currentPath + "\\Plugins\\StatKeeper\\Stats\\"; - string statFile = filePath + player.CSteamID + ".xml"; - - if (!System.IO.File.Exists (statFile)) - { - XmlTextWriter writer = new XmlTextWriter (statFile, System.Text.Encoding.UTF8); - writer.WriteStartDocument (true); - writer.Formatting = Formatting.Indented; - writer.Indentation = 2; - writer.WriteStartElement ("Stats"); - writer.WriteStartElement ("PvP"); - StatKeeper.Utility.createPVPNode("0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", writer); - writer.WriteEndElement (); - writer.WriteStartElement ("PvE"); - StatKeeper.Utility.createPVENode("0", "0", "0", "0", "0", "0", "0", writer); - writer.WriteEndElement (); - writer.WriteEndElement (); - writer.WriteEndDocument (); - writer.Close (); - } - } - private void Events_OnPlayerDisconnected(UnturnedPlayer player) - { - + System.IO.Directory.CreateDirectory(Path.Combine(Directory, "Stats/")); } - private void UnturnedPlayerEvents_OnPlayerDeath(Rocket.Unturned.Player.UnturnedPlayer player, SDG.Unturned.EDeathCause cause, SDG.Unturned.ELimb limb, Steamworks.CSteamID murderer) - { - UnturnedPlayer killer = Rocket.Unturned.Player.UnturnedPlayer.FromCSteamID(murderer); - string currentPath = System.IO.Directory.GetCurrentDirectory(); - string filePath = currentPath + "\\Plugins\\StatKeeper\\Stats\\"; - string playerStatFile = filePath + player.CSteamID + ".xml"; - string killerStatFile = filePath + killer.CSteamID + ".xml"; - - XmlDocument playerDoc = new XmlDocument(); - playerDoc.Load(playerStatFile); - XmlElement playerPvPRoot = playerDoc.DocumentElement; - XmlNodeList playerPvPNodes = playerPvPRoot.SelectNodes("/Stats/PvP"); - XmlElement playerPvERoot = playerDoc.DocumentElement; - XmlNodeList playerPvENodes = playerPvERoot.SelectNodes("/Stats/PvE"); - - XmlDocument killerDoc = new XmlDocument(); - killerDoc.Load(killerStatFile); - XmlElement killerPvPRoot = killerDoc.DocumentElement; - XmlNodeList killerPvPNodes = killerPvPRoot.SelectNodes("/Stats/PvP"); - XmlElement killerPvERoot = killerDoc.DocumentElement; - XmlNodeList killerPvENodes = playerPvERoot.SelectNodes("/Stats/PvE"); - if (cause.ToString() == "ZOMBIE") - { - foreach (XmlNode node in playerPvENodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int zDeaths = int.Parse(node["ZombieDeaths"].InnerText); - int newtDeaths = tDeaths + 1; - int newzDeaths = zDeaths + 1; - - XmlNode totDeaths = playerPvERoot.SelectSingleNode("TotalDeaths"); - totDeaths.Value = newtDeaths + ""; - XmlNode zomDeaths = playerPvERoot.SelectSingleNode("ZombieDeaths"); - zomDeaths.Value = newzDeaths + ""; - - playerDoc.Save(playerStatFile); - } - } - else if (cause.ToString() == "GUN") - { - foreach (XmlNode node in playerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int gDeaths = int.Parse(node["GunDeaths"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtDeaths = tDeaths + 1; - int newgDeaths = gDeaths + 1; - float newKDRatio; - if(tKills > 0 && tDeaths == 0) - { - newKDRatio = tKills/1; - } - else - { - newKDRatio = tKills/newtDeaths; - } - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["GunDeaths"].InnerText = newgDeaths + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(playerStatFile); - } - foreach (XmlNode node in killerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int gKills = int.Parse(node["GunKills"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtKills = tKills + 1; - int newgKills = gKills + 1; - float newKDRatio; - if(newtKills > 0 && tDeaths == 0) - { - newKDRatio = newtKills/1; - } - else - { - newKDRatio = newtKills/tDeaths; - } - - node["TotalKills"].InnerText = newtKills + ""; - node["GunKills"].InnerText = newgKills + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(killerStatFile); - } - } - else if (cause.ToString() == "MELEE") - { - foreach (XmlNode node in playerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int mDeaths = int.Parse(node["MeleeDeaths"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtDeaths = tDeaths + 1; - int newmDeaths = mDeaths + 1; - float newKDRatio; - if(tKills > 0 && tDeaths == 0) - { - newKDRatio = tKills/1; - } - else - { - newKDRatio = tKills/newtDeaths; - } - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["MeleeDeaths"].InnerText = newmDeaths + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(playerStatFile); - } - foreach (XmlNode node in killerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int mKills = int.Parse(node["MeleeKills"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtKills = tKills + 1; - int newmKills = mKills + 1; - float newKDRatio; - if(newtKills > 0 && tDeaths == 0) - { - newKDRatio = newtKills/1; - } - else - { - newKDRatio = newtKills/tDeaths; - } - - node["TotalKills"].InnerText = newtKills + ""; - node["MeleeKills"].InnerText = newmKills + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(killerStatFile); - } - } - else if (cause.ToString() == "PUNCH") - { - foreach (XmlNode node in playerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int pDeaths = int.Parse(node["PunchDeaths"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtDeaths = tDeaths + 1; - int newpDeaths = pDeaths + 1; - float newKDRatio; - if(tKills > 0 && tDeaths == 0) - { - newKDRatio = tKills/1; - } - else - { - newKDRatio = tKills/newtDeaths; - } - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["PunchDeaths"].InnerText = newpDeaths + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(playerStatFile); - } - foreach (XmlNode node in killerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int pKills = int.Parse(node["PunchKills"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtKills = tKills + 1; - int newpKills = pKills + 1; - float newKDRatio; - if(newtKills > 0 && tDeaths == 0) - { - newKDRatio = newtKills/1; - } - else - { - newKDRatio = newtKills/tDeaths; - } - - node["TotalKills"].InnerText = newtKills + ""; - node["PunchKills"].InnerText = newpKills + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(killerStatFile); - } - } - else if (cause.ToString() == "ROADKILL") - { - foreach (XmlNode node in playerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int rDeaths = int.Parse(node["RoadDeaths"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtDeaths = tDeaths + 1; - int newrDeaths = rDeaths + 1; - float newKDRatio; - if(tKills > 0 && tDeaths == 0) - { - newKDRatio = tKills/1; - } - else - { - newKDRatio = tKills/newtDeaths; - } - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["RoadDeaths"].InnerText = newrDeaths + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(playerStatFile); - } - foreach (XmlNode node in killerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int rKills = int.Parse(node["RoadKills"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtKills = tKills + 1; - int newrKills = rKills + 1; - float newKDRatio; - if(newtKills > 0 && tDeaths == 0) - { - newKDRatio = newtKills/1; - } - else - { - newKDRatio = newtKills/tDeaths; - } - - node["TotalKills"].InnerText = newtKills + ""; - node["RoadKills"].InnerText = newrKills + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(killerStatFile); - } - } - else if (cause.ToString() == "VEHICLE") - { - foreach (XmlNode node in playerPvENodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int vDeaths = int.Parse(node["VehicleDeaths"].InnerText); - int newtDeaths = tDeaths + 1; - int newvDeaths = vDeaths + 1; - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["VehicleDeaths"].InnerText = newvDeaths + ""; - - playerDoc.Save(playerStatFile); - } - } - else if (cause.ToString() == "FOOD") - { - foreach (XmlNode node in playerPvENodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int fDeaths = int.Parse(node["FoodDeaths"].InnerText); - int newtDeaths = tDeaths + 1; - int newfDeaths = fDeaths + 1; - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["FoodDeaths"].InnerText = newfDeaths + ""; - - playerDoc.Save(playerStatFile); - } - } - else if (cause.ToString() == "WATER") - { - foreach (XmlNode node in playerPvENodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int wDeaths = int.Parse(node["FoodDeaths"].InnerText); - int newtDeaths = tDeaths + 1; - int newwDeaths = wDeaths + 1; - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["WaterDeaths"].InnerText = newwDeaths + ""; - - playerDoc.Save(playerStatFile); - } - } - else if (cause.ToString() == "INFECTION") - { - foreach (XmlNode node in playerPvENodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int iDeaths = int.Parse(node["InfectionDeaths"].InnerText); - int newtDeaths = tDeaths + 1; - int newiDeaths = iDeaths + 1; - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["InfectionDeaths"].InnerText = newiDeaths + ""; - - playerDoc.Save(playerStatFile); - } - } - else if (cause.ToString() == "BLEEDING") - { - foreach (XmlNode node in playerPvENodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int bDeaths = int.Parse(node["BleedingDeaths"].InnerText); - int newtDeaths = tDeaths + 1; - int newbDeaths = bDeaths + 1; - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["BleedingDeaths"].InnerText = newbDeaths + ""; - - playerDoc.Save(playerStatFile); - } - } - else if (cause.ToString() == "SUICIDE") - { - foreach (XmlNode node in playerPvPNodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int sDeaths = int.Parse(node["SuicideDeaths"].InnerText); - int tKills = int.Parse(node["TotalKills"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int newtDeaths = tDeaths + 1; - int newsDeaths = sDeaths + 1; - float newKDRatio = tKills/newtDeaths; - - node["TotalDeaths"].InnerText = newtDeaths + ""; - node["SuicideDeaths"].InnerText = newsDeaths + ""; - node["KDRatio"].InnerText = newKDRatio + ""; - - playerDoc.Save(playerStatFile); - } - } - } - } + } } diff --git a/StatKeeper.csproj b/StatKeeper.csproj index ff0310b..a12fe14 100644 --- a/StatKeeper.csproj +++ b/StatKeeper.csproj @@ -1,4 +1,4 @@ - + Debug @@ -7,7 +7,7 @@ Library StatKeeper StatKeeper - v4.5 + v4.0 true @@ -28,38 +28,48 @@ false - - ..\Rocket API\Assembly-CSharp.dll + lib\Assembly-CSharp.dll + False - ..\Rocket API\Assembly-CSharp-firstpass.dll + lib\Assembly-CSharp-firstpass.dll + False - ..\Rocket API\Rocket.API.dll + lib\Rocket.API.dll + False - ..\Rocket API\Rocket.Core.dll + lib\Rocket.Core.dll + False - ..\Rocket API\Rocket.Unturned.dll - - - ..\Rocket API\UnityEngine.dll + lib\Rocket.Unturned.dll + False + + + lib\UnityEngine.dll + False + + + lib\UnityEngine.CoreModule.dll + False + - - - + + + - + \ No newline at end of file diff --git a/StatKeeper.sln b/StatKeeper.sln new file mode 100644 index 0000000..a965d13 --- /dev/null +++ b/StatKeeper.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatKeeper", "StatKeeper.csproj", "{3D863C41-966B-4259-A540-91DE32B3C13D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3D863C41-966B-4259-A540-91DE32B3C13D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D863C41-966B-4259-A540-91DE32B3C13D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D863C41-966B-4259-A540-91DE32B3C13D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D863C41-966B-4259-A540-91DE32B3C13D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Stats.cs b/Stats.cs new file mode 100644 index 0000000..3543b36 --- /dev/null +++ b/Stats.cs @@ -0,0 +1,122 @@ +using Rocket.API; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Xml; +using System.Xml.Serialization; + +namespace StatKeeper +{ + [XmlRoot("Dictionary")] + public class SerializableDictionary + : Dictionary, IXmlSerializable + { + #region IXmlSerializable Members + public System.Xml.Schema.XmlSchema GetSchema() + { + return null; + } + + public void ReadXml(System.Xml.XmlReader reader) + { + XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); + XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); + + bool wasEmpty = reader.IsEmptyElement; + reader.Read(); + + if (wasEmpty) + return; + + while (reader.NodeType != System.Xml.XmlNodeType.EndElement) + { + reader.ReadStartElement("Item"); + + reader.ReadStartElement("Key"); + TKey key = (TKey)keySerializer.Deserialize(reader); + reader.ReadEndElement(); + + reader.ReadStartElement("Value"); + TValue value = (TValue)valueSerializer.Deserialize(reader); + reader.ReadEndElement(); + + this.Add(key, value); + + reader.ReadEndElement(); + reader.MoveToContent(); + } + reader.ReadEndElement(); + } + + public void WriteXml(System.Xml.XmlWriter writer) + { + XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); + XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); + + foreach (TKey key in this.Keys) + { + writer.WriteStartElement("Item"); + + writer.WriteStartElement("Key"); + keySerializer.Serialize(writer, key); + writer.WriteEndElement(); + + writer.WriteStartElement("Value"); + TValue value = this[key]; + valueSerializer.Serialize(writer, value); + writer.WriteEndElement(); + + writer.WriteEndElement(); + } + } + #endregion + } + + public class Stats : IDefaultable { + public int GetKills(string cause) + { + if (!Kills.ContainsKey(cause)) return 0; + return Kills[cause]; + } + + public int GetDeaths(string cause) + { + if (!Deaths.ContainsKey(cause)) return 0; + return Deaths[cause]; + } + + public ulong SteamID { get; set; } = 0; + public DateTime LastUpdated { get; set; } = DateTime.Now; + public DateTime Created { get; set; } = DateTime.Now; + + public SerializableDictionary Kills { get; set; } = new SerializableDictionary(); + public SerializableDictionary Deaths { get; set; } = new SerializableDictionary(); + + public double KDRatio { get; set; } = 0; + public int TotalKills { get; set; } = 0; + public int TotalDeaths { get; set; } = 0; + + public void RecalculateStats() + { + TotalDeaths = Deaths.Values.Sum(); + TotalKills = Kills.Values.Sum(); + if(TotalDeaths != 0) + KDRatio = TotalKills / TotalDeaths; + LastUpdated = DateTime.Now; + } + + public Stats() { } + + public void LoadDefaults() + { + SteamID = 0; + LastUpdated = DateTime.Now; + Created = DateTime.Now; + Kills = new SerializableDictionary(); + Deaths = new SerializableDictionary(); + KDRatio = 0; + TotalKills = 0; + TotalDeaths = 0; + } + } +} diff --git a/StatsPlayerComponent.cs b/StatsPlayerComponent.cs new file mode 100644 index 0000000..d8cd13c --- /dev/null +++ b/StatsPlayerComponent.cs @@ -0,0 +1,40 @@ +using Rocket.Core.Assets; +using Rocket.Unturned.Player; +using SDG.Unturned; +using Steamworks; +using System.IO; + +namespace StatKeeper +{ + public class StatsPlayerComponent : UnturnedPlayerComponent + { + public XMLFileAsset Stats; + public void Start() + { + Stats = new XMLFileAsset(Path.Combine(Plugin.Instance.Directory,"Stats/"+Player.Id+".xml")); + Stats.Instance.SteamID = (ulong)Player.CSteamID; + Player.Events.OnDeath += (UnturnedPlayer player, SDG.Unturned.EDeathCause cause, SDG.Unturned.ELimb limb, Steamworks.CSteamID m) => + { + UnturnedPlayer murderer = UnturnedPlayer.FromCSteamID(m); + if (murderer != null && PlayerTool.getSteamPlayer(m) != null) + { + XMLFileAsset killerStats = murderer.GetComponent().Stats; + + killerStats.Instance.Kills[cause.ToString()] = killerStats.Instance.GetKills(cause.ToString()) + 1; + killerStats.Instance.RecalculateStats(); + killerStats.Save(); + } + Stats.Instance.Deaths[cause.ToString()] = Stats.Instance.GetDeaths(cause.ToString()) + 1; + Stats.Instance.RecalculateStats(); + Stats.Save(); + }; + Stats.Instance.RecalculateStats(); + } + + public void OnDisable() + { + Stats.Instance.RecalculateStats(); + Stats.Save(); + } + } +} diff --git a/Utility.cs b/Utility.cs deleted file mode 100644 index 11f598f..0000000 --- a/Utility.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.Data; -using System.Xml; -using System.Windows.Forms; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.IO; -using System.Threading; -using System.Windows; -using Rocket.API; -using Rocket.Unturned; -using Rocket.Unturned.Commands; -using Rocket.Unturned.Player; -using SDG.Unturned; -using UnityEngine; - -namespace StatKeeper -{ - public class Utility - { - public static Utility Instance; - - public static void createPVPNode(string tKills, string gKills, string mKills, string pKills, string rKills, string tDeaths, - string gDeaths, string mDeaths, string pDeaths, string rDeaths, string sDeaths, string kdRatio, XmlTextWriter writer) - { - writer.WriteStartElement("TotalKills"); - writer.WriteString(tKills); - writer.WriteEndElement(); - writer.WriteStartElement("GunKills"); - writer.WriteString(gKills); - writer.WriteEndElement(); - writer.WriteStartElement("MeleeKills"); - writer.WriteString(mKills); - writer.WriteEndElement(); - writer.WriteStartElement("PunchKills"); - writer.WriteString(pKills); - writer.WriteEndElement(); - writer.WriteStartElement("RoadKills"); - writer.WriteString(rKills); - writer.WriteEndElement(); - writer.WriteStartElement("TotalDeaths"); - writer.WriteString(tDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("GunDeaths"); - writer.WriteString(gDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("MeleeDeaths"); - writer.WriteString(mDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("PunchDeaths"); - writer.WriteString(pDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("RoadDeaths"); - writer.WriteString(rDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("SuicideDeaths"); - writer.WriteString(sDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("KDRatio"); - writer.WriteString(kdRatio); - writer.WriteEndElement(); - } - public static void createPVENode(string tDeaths, string zDeaths, string vDeaths, string fDeaths, string wDeaths, - string iDeaths, string bDeaths, XmlTextWriter writer) - { - writer.WriteStartElement("TotalDeaths"); - writer.WriteString(tDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("ZombieDeaths"); - writer.WriteString(zDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("VehicleDeaths"); - writer.WriteString(vDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("FoodDeaths"); - writer.WriteString(fDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("WaterDeaths"); - writer.WriteString(wDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("InfectionDeaths"); - writer.WriteString(iDeaths); - writer.WriteEndElement(); - writer.WriteStartElement("BleedingDeaths"); - writer.WriteString(bDeaths); - writer.WriteEndElement(); - } - public static void readPVPNode(UnturnedPlayer target) - { - string currentPath = System.IO.Directory.GetCurrentDirectory(); - string filePath = currentPath + "\\Plugins\\StatKeeper\\Stats\\"; - string targetStatFile = filePath + target.CSteamID + ".xml"; - - XmlDocument targetDoc = new XmlDocument(); - targetDoc.Load(targetStatFile); - XmlElement targetPvPRoot = targetDoc.DocumentElement; - XmlNodeList targetPvPNodes = targetPvPRoot.SelectNodes("/Stats/PvP"); - - foreach (XmlNode node in targetPvPNodes) - { - int tKills = int.Parse(node["TotalKills"].InnerText); - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int kdRatio = int.Parse(node["KDRatio"].InnerText); - int gKills = int.Parse(node["GunKills"].InnerText); - int mKills = int.Parse(node["MeleeKills"].InnerText); - int pKills = int.Parse(node["PunchKills"].InnerText); - int rKills = int.Parse(node["RoadKills"].InnerText); - int gDeaths = int.Parse(node["GunDeaths"].InnerText); - int mDeaths = int.Parse(node["MeleeDeaths"].InnerText); - int pDeaths = int.Parse(node["PunchDeaths"].InnerText); - int rDeaths = int.Parse(node["RoadDeaths"].InnerText); - int sDeaths = int.Parse(node["SuicideDeaths"].InnerText); - - Rocket.Unturned.Chat.UnturnedChat.Say (target, target.CharacterName + "'s PvP Stats: Total Kills [" + tKills + "]" - + ", Total Deaths [" + tDeaths + "]" + ", KD [" + kdRatio + "]" + ", Gun Kills [" + gKills + "]" - + ", Melee Kills [" + mKills + "]" + ", Punch Kills [" + pKills + "]" + ", Road Kills [" + rKills + "]" - + ", Gun Deaths [" + gDeaths + "]" + ", Melee Deaths [" + mDeaths + "]" + ", Punch Deaths [" + pDeaths + "]" - + ", Road Deaths [" + rDeaths + "]" + ", Suicides [" + sDeaths + "]", Color.yellow); - } - } - public static void readPVENode(UnturnedPlayer target) - { - string currentPath = System.IO.Directory.GetCurrentDirectory(); - string filePath = currentPath + "\\Plugins\\StatKeeper\\Stats\\"; - string targetStatFile = filePath + target.CSteamID + ".xml"; - - XmlDocument targetDoc = new XmlDocument(); - targetDoc.Load(targetStatFile); - XmlElement targetPvERoot = targetDoc.DocumentElement; - XmlNodeList targetPvENodes = targetPvERoot.SelectNodes("/Stats/PvE"); - - foreach (XmlNode node in targetPvENodes) - { - int tDeaths = int.Parse(node["TotalDeaths"].InnerText); - int zDeaths = int.Parse(node["ZombieDeaths"].InnerText); - int vDeaths = int.Parse(node["VehicleDeaths"].InnerText); - int fDeaths = int.Parse(node["FoodDeaths"].InnerText); - int wDeaths = int.Parse(node["WaterDeaths"].InnerText); - int iDeaths = int.Parse(node["InfectionDeaths"].InnerText); - int bDeaths = int.Parse(node["BleedingDeaths"].InnerText); - - Rocket.Unturned.Chat.UnturnedChat.Say (target, target.CharacterName + "'s PvE Stats: Total Deaths [" + tDeaths + "]" - + ", Zombie Deaths [" + zDeaths + "]" + ", Vehicle Deaths [" + vDeaths + "]" + ", Food Deaths [" + fDeaths + "]" - + ", Water Deaths [" + wDeaths + "]" + ", Infection Deaths [" + iDeaths + "]" + ", Bleeding Deaths [" + bDeaths + "]", Color.yellow); - } - } - public static void readTKNode(UnturnedPlayer target) - { - string currentPath = System.IO.Directory.GetCurrentDirectory(); - string filePath = currentPath + "\\Plugins\\StatKeeper\\Stats\\"; - string targetStatFile = filePath + target.CSteamID + ".xml"; - - XmlDocument targetDoc = new XmlDocument(); - targetDoc.Load(targetStatFile); - XmlElement targetPvPRoot = targetDoc.DocumentElement; - XmlNodeList targetPvPNodes = targetPvPRoot.SelectNodes("/Stats/PvP"); - - foreach (XmlNode node in targetPvPNodes) - { - int tKills = int.Parse(node["TotalKills"].InnerText); - - Rocket.Unturned.Chat.UnturnedChat.Say (target, target.CharacterName + "'s Total Kills: [" + tKills + "]", Color.yellow); - } - } - public static void readTDNode(UnturnedPlayer target) - { - string currentPath = System.IO.Directory.GetCurrentDirectory(); - string filePath = currentPath + "\\Plugins\\StatKeeper\\Stats\\"; - string targetStatFile = filePath + target.CSteamID + ".xml"; - - XmlDocument targetDoc = new XmlDocument(); - targetDoc.Load(targetStatFile); - XmlElement targetPvPRoot = targetDoc.DocumentElement; - XmlNodeList targetPvPNodes = targetPvPRoot.SelectNodes("/Stats/PvP"); - - foreach (XmlNode node in targetPvPNodes) - { - int tDeathsPVP = int.Parse(node["TotalDeaths"].InnerText); - Rocket.Unturned.Chat.UnturnedChat.Say (target, target.CharacterName + "'s Total Deaths: PvP[" + tDeathsPVP + "]", Color.yellow); - } - } - public static void readKDNode(UnturnedPlayer target) - { - string currentPath = System.IO.Directory.GetCurrentDirectory(); - string filePath = currentPath + "\\Plugins\\StatKeeper\\Stats\\"; - string targetStatFile = filePath + target.CSteamID + ".xml"; - - XmlDocument targetDoc = new XmlDocument(); - targetDoc.Load(targetStatFile); - XmlElement targetPvPRoot = targetDoc.DocumentElement; - XmlNodeList targetPvPNodes = targetPvPRoot.SelectNodes("/Stats/PvP"); - - foreach (XmlNode node in targetPvPNodes) - { - int kdRatio = int.Parse(node["KDRatio"].InnerText); - - Rocket.Unturned.Chat.UnturnedChat.Say (target, target.CharacterName + "'s KD: [" + kdRatio+ "]", Color.yellow); - } - } - } -} - diff --git a/lib/Assembly-CSharp-firstpass.dll b/lib/Assembly-CSharp-firstpass.dll new file mode 100644 index 0000000..0f3748a Binary files /dev/null and b/lib/Assembly-CSharp-firstpass.dll differ diff --git a/lib/Assembly-CSharp.dll b/lib/Assembly-CSharp.dll new file mode 100644 index 0000000..d4c8200 Binary files /dev/null and b/lib/Assembly-CSharp.dll differ diff --git a/lib/Rocket.API.dll b/lib/Rocket.API.dll new file mode 100644 index 0000000..c197c6f Binary files /dev/null and b/lib/Rocket.API.dll differ diff --git a/lib/Rocket.Core.dll b/lib/Rocket.Core.dll new file mode 100644 index 0000000..7197fcd Binary files /dev/null and b/lib/Rocket.Core.dll differ diff --git a/lib/Rocket.Unturned.dll b/lib/Rocket.Unturned.dll new file mode 100644 index 0000000..08ebe4c Binary files /dev/null and b/lib/Rocket.Unturned.dll differ diff --git a/lib/UnityEngine.CoreModule.dll b/lib/UnityEngine.CoreModule.dll new file mode 100644 index 0000000..f1e9533 Binary files /dev/null and b/lib/UnityEngine.CoreModule.dll differ diff --git a/lib/UnityEngine.dll b/lib/UnityEngine.dll new file mode 100644 index 0000000..6d6e44f Binary files /dev/null and b/lib/UnityEngine.dll differ