diff --git a/IW4MAdmin.sln b/IW4MAdmin.sln index 45e827556..55ee55aef 100644 --- a/IW4MAdmin.sln +++ b/IW4MAdmin.sln @@ -17,8 +17,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WelcomePlugin", "Plugins\We EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VotemapPlugin", "Plugins\VoteMap\VotemapPlugin.csproj", "{428D8EB9-ECA3-4A66-AA59-3A944378C33F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessageboardPlugin", "Plugins\MessageBoard\MessageboardPlugin.csproj", "{E46C85BD-A99C-484E-BCCE-0F1831C5925E}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{26E8B310-269E-46D4-A612-24601F16065F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FastRestartPlugin", "Plugins\FastRestart\FastRestartPlugin.csproj", "{1479DE87-ACB5-4046-81C8-A0BA5041227D}" @@ -180,30 +178,6 @@ Global {428D8EB9-ECA3-4A66-AA59-3A944378C33F}.Release-Stable|x64.Build.0 = Release-Stable|Any CPU {428D8EB9-ECA3-4A66-AA59-3A944378C33F}.Release-Stable|x86.ActiveCfg = Release-Stable|Any CPU {428D8EB9-ECA3-4A66-AA59-3A944378C33F}.Release-Stable|x86.Build.0 = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Debug|Mixed Platforms.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Debug|x64.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Debug|x86.ActiveCfg = Debug|x86 - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Debug|x86.Build.0 = Debug|x86 - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|Any CPU.ActiveCfg = Release-Nightly|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|Any CPU.Build.0 = Release-Nightly|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|Mixed Platforms.ActiveCfg = Release-Stable|x86 - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|Mixed Platforms.Build.0 = Release-Stable|x86 - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|x64.ActiveCfg = Release-Nightly|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|x64.Build.0 = Release-Nightly|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|x86.ActiveCfg = Release-Stable|x86 - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release|x86.Build.0 = Release-Stable|x86 - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Nightly|Any CPU.ActiveCfg = Release-Nightly|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Nightly|Mixed Platforms.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Nightly|x64.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Nightly|x86.ActiveCfg = Release-Nightly|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Nightly|x86.Build.0 = Release-Nightly|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Stable|Any CPU.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Stable|Mixed Platforms.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Stable|x64.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Stable|x86.ActiveCfg = Release-Stable|Any CPU - {E46C85BD-A99C-484E-BCCE-0F1831C5925E}.Release-Stable|x86.Build.0 = Release-Stable|Any CPU {1479DE87-ACB5-4046-81C8-A0BA5041227D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1479DE87-ACB5-4046-81C8-A0BA5041227D}.Debug|Any CPU.Build.0 = Debug|Any CPU {1479DE87-ACB5-4046-81C8-A0BA5041227D}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 @@ -304,7 +278,6 @@ Global {4785AB75-66F3-4391-985D-63A5A049A0FA} = {26E8B310-269E-46D4-A612-24601F16065F} {AF097E6B-48D5-4452-9CCF-0A81A21F341D} = {26E8B310-269E-46D4-A612-24601F16065F} {428D8EB9-ECA3-4A66-AA59-3A944378C33F} = {26E8B310-269E-46D4-A612-24601F16065F} - {E46C85BD-A99C-484E-BCCE-0F1831C5925E} = {26E8B310-269E-46D4-A612-24601F16065F} {1479DE87-ACB5-4046-81C8-A0BA5041227D} = {26E8B310-269E-46D4-A612-24601F16065F} {B8C2A759-8663-4F6F-9BA4-19595F5E12C1} = {26E8B310-269E-46D4-A612-24601F16065F} EndGlobalSection diff --git a/Plugins/SimpleStats/Cheat/Detection.cs b/Plugins/SimpleStats/Cheat/Detection.cs index a810e4746..c740b2b0d 100644 --- a/Plugins/SimpleStats/Cheat/Detection.cs +++ b/Plugins/SimpleStats/Cheat/Detection.cs @@ -1,5 +1,7 @@ -using SharedLibrary.Interfaces; +using SharedLibrary.Helpers; +using SharedLibrary.Interfaces; using SharedLibrary.Objects; +using StatsPlugin.Helpers; using StatsPlugin.Models; using System; using System.Collections.Generic; @@ -34,7 +36,8 @@ namespace StatsPlugin.Cheat public DetectionPenaltyResult ProcessKill(EFClientKill kill) { if ((kill.DeathType != IW4Info.MeansOfDeath.MOD_PISTOL_BULLET && - kill.DeathType != IW4Info.MeansOfDeath.MOD_RIFLE_BULLET) || + kill.DeathType != IW4Info.MeansOfDeath.MOD_RIFLE_BULLET && + kill.DeathType != IW4Info.MeansOfDeath.MOD_HEAD_SHOT) || kill.HitLoc == IW4Info.HitLocation.none) return new DetectionPenaltyResult() { @@ -46,7 +49,19 @@ namespace StatsPlugin.Cheat Kills++; AverageKillTime = (AverageKillTime + (DateTime.UtcNow - LastKill).TotalSeconds) / Kills; -#region SESSION_RATIOS + #region VIEWANGLES + double distance = Vector3.Distance(kill.KillOrigin, kill.DeathOrigin); + double x = kill.KillOrigin.X + distance * Math.Cos(kill.ViewAngles.Y.ToRadians()) * Math.Cos(kill.ViewAngles.X.ToRadians()); + double y = kill.KillOrigin.Y + (distance * Math.Sin((360.0f - kill.ViewAngles.Y).ToRadians())); + double z = kill.KillOrigin.Z + (distance * Math.Cos(kill.ViewAngles.Y.ToRadians()) * Math.Sin((360.0f - kill.ViewAngles.X).ToRadians())); + var trueVector = Vector3.Subtract(kill.KillOrigin, kill.DeathOrigin); + var calculatedVector = Vector3.Subtract(kill.KillOrigin, new Vector3((float)x, (float)y, (float)z)); + double angle = trueVector.AngleBetween(calculatedVector); + Console.WriteLine(((float)angle).ToDegrees()); + + #endregion + + #region SESSION_RATIOS if (Kills >= Thresholds.LowSampleMinKills) { double marginOfError = Thresholds.GetMarginOfError(Kills); diff --git a/Plugins/SimpleStats/Helpers/Extensions.cs b/Plugins/SimpleStats/Helpers/Extensions.cs new file mode 100644 index 000000000..ef46f1091 --- /dev/null +++ b/Plugins/SimpleStats/Helpers/Extensions.cs @@ -0,0 +1,26 @@ +using SharedLibrary.Helpers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StatsPlugin.Helpers +{ + static class Extensions + { + + public static Vector3 FixIW4Angles(this Vector3 vector) + { + float X = vector.X > 0 ? 360.0f - vector.X : Math.Abs(vector.X); + float Y = vector.Y > 0 ? 360.0f - vector.Y : Math.Abs(vector.Y); + float Z = vector.Z > 0 ? 360.0f - vector.Z : Math.Abs(vector.Z); + + return new Vector3(X, Y, Z); + } + + public static float ToRadians(this float value) => (float)Math.PI * value / 180.0f; + + public static float ToDegrees(this float value) => value * 180.0f / (float)Math.PI; + } +} diff --git a/Plugins/SimpleStats/Helpers/StatManager.cs b/Plugins/SimpleStats/Helpers/StatManager.cs index 0ae88b8fd..6a68a24fe 100644 --- a/Plugins/SimpleStats/Helpers/StatManager.cs +++ b/Plugins/SimpleStats/Helpers/StatManager.cs @@ -205,7 +205,7 @@ namespace StatsPlugin.Helpers /// /// public async Task AddScriptKill(Player attacker, Player victim, int serverId, string map, string hitLoc, string type, - string damage, string weapon, string killOrigin, string deathOrigin) + string damage, string weapon, string killOrigin, string deathOrigin, string viewAngles, string offset) { var statsSvc = ContextThreads[serverId]; @@ -221,7 +221,10 @@ namespace StatsPlugin.Helpers DeathType = ParseEnum.Get(type, typeof(IW4Info.MeansOfDeath)), Damage = Int32.Parse(damage), HitLoc = ParseEnum.Get(hitLoc, typeof(IW4Info.HitLocation)), - Weapon = ParseEnum.Get(weapon, typeof(IW4Info.WeaponName)) + Weapon = ParseEnum.Get(weapon, typeof(IW4Info.WeaponName)), + ViewAngles = Vector3.Parse(viewAngles).FixIW4Angles(), + TimeOffset = Int64.Parse(offset), + When = DateTime.UtcNow }; if (kill.DeathType == IW4Info.MeansOfDeath.MOD_SUICIDE && @@ -238,15 +241,17 @@ namespace StatsPlugin.Helpers // increment their hit count if (kill.DeathType == IW4Info.MeansOfDeath.MOD_PISTOL_BULLET || - kill.DeathType == IW4Info.MeansOfDeath.MOD_RIFLE_BULLET) + kill.DeathType == IW4Info.MeansOfDeath.MOD_RIFLE_BULLET || + kill.DeathType == IW4Info.MeansOfDeath.MOD_HEAD_SHOT) { playerStats.HitLocations.Single(hl => hl.Location == kill.HitLoc).HitCount += 1; await statsSvc.ClientStatSvc.SaveChangesAsync(); } - //statsSvc.KillStatsSvc.Insert(kill); - //await statsSvc.KillStatsSvc.SaveChangesAsync(); - if(Plugin.Config.Configuration().EnableAntiCheat) + statsSvc.KillStatsSvc.Insert(kill); + await statsSvc.KillStatsSvc.SaveChangesAsync(); + + if (Plugin.Config.Configuration().EnableAntiCheat) { async Task executePenalty(Cheat.DetectionPenaltyResult penalty) { diff --git a/Plugins/SimpleStats/Helpers/StreakMessage.cs b/Plugins/SimpleStats/Helpers/StreakMessage.cs index 37b679aad..330b4cb5f 100644 --- a/Plugins/SimpleStats/Helpers/StreakMessage.cs +++ b/Plugins/SimpleStats/Helpers/StreakMessage.cs @@ -22,7 +22,7 @@ namespace StatsPlugin.Helpers var deathstreakMessage = Plugin.Config.Configuration().DeathstreakMessages; string message = killstreakMessage.FirstOrDefault(m => m.Count == killStreak)?.Message; - message = (message == null) ? deathstreakMessage.FirstOrDefault(m => m.Count == deathStreak)?.Message : message; + message = message ?? deathstreakMessage.FirstOrDefault(m => m.Count == deathStreak)?.Message; return message ?? ""; } } diff --git a/Plugins/SimpleStats/IW4Info.cs b/Plugins/SimpleStats/IW4Info.cs index 0e0240d7a..f77ff869a 100644 --- a/Plugins/SimpleStats/IW4Info.cs +++ b/Plugins/SimpleStats/IW4Info.cs @@ -56,6 +56,7 @@ namespace StatsPlugin left_leg_lower, right_foot, left_foot, + gun, } public enum WeaponName diff --git a/Plugins/SimpleStats/Models/EFClientKill.cs b/Plugins/SimpleStats/Models/EFClientKill.cs index ea344e8f0..948c5a161 100644 --- a/Plugins/SimpleStats/Models/EFClientKill.cs +++ b/Plugins/SimpleStats/Models/EFClientKill.cs @@ -11,7 +11,7 @@ using System.ComponentModel.DataAnnotations; namespace StatsPlugin.Models { - public class EFClientKill : SharedEntity + public class EFClientKill : SharedEntity { public EFClientKill() { } @@ -36,5 +36,9 @@ namespace StatsPlugin.Models [NotMapped] public double Distance => Vector3.Distance(KillOrigin, DeathOrigin) * 0.0254; public IW4Info.MapName Map { get; set; } + [NotMapped] + public long TimeOffset { get; set; } + public Vector3 ViewAngles { get; set; } + public DateTime When { get; set; } } } diff --git a/Plugins/SimpleStats/Plugin.cs b/Plugins/SimpleStats/Plugin.cs index 7852a62ed..bea22473b 100644 --- a/Plugins/SimpleStats/Plugin.cs +++ b/Plugins/SimpleStats/Plugin.cs @@ -74,7 +74,8 @@ namespace StatsPlugin case Event.GType.Kill: string[] killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0]; if (killInfo.Length >= 9 && killInfo[0].Contains("ScriptKill") && E.Owner.CustomCallback) - await Manager.AddScriptKill(E.Origin, E.Target, S.GetHashCode(), S.CurrentMap.Name, killInfo[7], killInfo[8], killInfo[5], killInfo[6], killInfo[3], killInfo[4]); + await Manager.AddScriptKill(E.Origin, E.Target, S.GetHashCode(), S.CurrentMap.Name, killInfo[7], killInfo[8], + killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10]); else if (!E.Owner.CustomCallback) await Manager.AddStandardKill(E.Origin, E.Target); break; @@ -87,7 +88,7 @@ namespace StatsPlugin { // load custom configuration Config = new BaseConfigurationHandler("StatsPluginSettings"); - if (Config.Configuration()== null) + if (Config.Configuration() == null) { Config.Set((StatsConfiguration)new StatsConfiguration().Generate()); await Config.Save(); @@ -105,6 +106,7 @@ namespace StatsPlugin double skill = Math.Round(clientStats.Sum(c => c.Skill) / clientStats.Count, 2); double spm = Math.Round(clientStats.Sum(c => c.SPM), 1); + double headRatio = 0; double chestRatio = 0; double abdomenRatio = 0; double chestAbdomenRatio = 0; @@ -122,6 +124,10 @@ namespace StatsPlugin chestAbdomenRatio = Math.Round(clientStats.Where(c => c.HitLocations.Count > 0).Sum(cs => cs.HitLocations.First(hl => hl.Location == IW4Info.HitLocation.torso_upper).HitCount) / (double)clientStats.Where(c => c.HitLocations.Count > 0).Sum(cs => cs.HitLocations.First(hl => hl.Location == IW4Info.HitLocation.torso_lower).HitCount), 2); + + headRatio = Math.Round(clientStats.Where(c => c.HitLocations.Count > 0).Sum(cs => cs.HitLocations.First(hl => hl.Location == IW4Info.HitLocation.head).HitCount) / + (double)clientStats.Where(c => c.HitLocations.Count > 0) + .Sum(c => c.HitLocations.Where(hl => hl.Location != IW4Info.HitLocation.none).Sum(f => f.HitCount)), 2); } return new List() @@ -168,6 +174,12 @@ namespace StatsPlugin Key = "Chest To Abdomen Ratio", Value = chestAbdomenRatio, Sensitive = true + }, + new ProfileMeta() + { + Key = "Headshot Ratio", + Value = headRatio, + Sensitive = true } }; } @@ -191,7 +203,10 @@ namespace StatsPlugin return messageMeta; } - MetaService.AddMeta(getStats); + if (Config.Configuration().EnableAntiCheat) + { + MetaService.AddMeta(getStats); + } MetaService.AddMeta(getMessages); // todo: is this fast? make async? diff --git a/Plugins/SimpleStats/StatsPlugin.csproj b/Plugins/SimpleStats/StatsPlugin.csproj index 3d1a0c8a6..17a78002d 100644 --- a/Plugins/SimpleStats/StatsPlugin.csproj +++ b/Plugins/SimpleStats/StatsPlugin.csproj @@ -126,6 +126,7 @@ + diff --git a/SharedLibrary/Commands/NativeCommands.cs b/SharedLibrary/Commands/NativeCommands.cs index 193fca448..6e6985ae0 100644 --- a/SharedLibrary/Commands/NativeCommands.cs +++ b/SharedLibrary/Commands/NativeCommands.cs @@ -637,21 +637,6 @@ namespace SharedLibrary.Commands } } - public class CReload : Command - { - public CReload() : - base("reload", "reload configuration files", "rl", Player.Permission.Owner, false) - { } - - public override async Task ExecuteAsync(Event E) - { - if (E.Owner.Reload()) - await E.Origin.Tell("Sucessfully reloaded configuration files"); - else - await E.Origin.Tell("Unable to reload configuration files"); - } - } - public class CFlag : Command { public CFlag() : diff --git a/SharedLibrary/Helpers/Vector3.cs b/SharedLibrary/Helpers/Vector3.cs index 2f8959048..b51c12bdd 100644 --- a/SharedLibrary/Helpers/Vector3.cs +++ b/SharedLibrary/Helpers/Vector3.cs @@ -9,9 +9,9 @@ namespace SharedLibrary.Helpers { public class Vector3 { - public float X { get; private set; } - public float Y { get; private set; } - public float Z { get; private set; } + public float X { get; protected set; } + public float Y { get; protected set; } + public float Z { get; protected set; } public Vector3(float x, float y, float z) { @@ -41,6 +41,8 @@ namespace SharedLibrary.Helpers return Math.Round(Math.Sqrt(Math.Pow(b.X - a.X, 2) + Math.Pow(b.Y - a.Y, 2) + Math.Pow(b.Z - a.Z, 2)), 2); } + public static Vector3 Subtract(Vector3 a, Vector3 b) => new Vector3(b.X - a.X, b.Y - a.Y, b.Z - a.Z); + public double DotProduct(Vector3 a) => (a.X * this.X) + (a.Y * this.Y) + (a.Z * this.Z); public double Magnitude() => Math.Sqrt((X * X) + (Y * Y) + (Z * Z)); diff --git a/SharedLibrary/Migrations/201803030146021_Intial.Designer.cs b/SharedLibrary/Migrations/201803030146021_Intial.Designer.cs deleted file mode 100644 index f64099275..000000000 --- a/SharedLibrary/Migrations/201803030146021_Intial.Designer.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -namespace SharedLibrary.Migrations -{ - using System.CodeDom.Compiler; - using System.Data.Entity.Migrations; - using System.Data.Entity.Migrations.Infrastructure; - using System.Resources; - - [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] - public sealed partial class Intial : IMigrationMetadata - { - private readonly ResourceManager Resources = new ResourceManager(typeof(Intial)); - - string IMigrationMetadata.Id - { - get { return "201803030146021_Intial"; } - } - - string IMigrationMetadata.Source - { - get { return null; } - } - - string IMigrationMetadata.Target - { - get { return Resources.GetString("Target"); } - } - } -} diff --git a/SharedLibrary/Migrations/201803030146021_Intial.cs b/SharedLibrary/Migrations/201803030146021_Intial.cs deleted file mode 100644 index 0fa457969..000000000 --- a/SharedLibrary/Migrations/201803030146021_Intial.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace SharedLibrary.Migrations -{ - using System; - using System.Data.Entity.Migrations; - - public partial class Intial : DbMigration - { - public override void Up() - { - } - - public override void Down() - { - } - } -} diff --git a/SharedLibrary/Migrations/201803030146021_Intial.resx b/SharedLibrary/Migrations/201803030146021_Intial.resx deleted file mode 100644 index 98122108e..000000000 --- a/SharedLibrary/Migrations/201803030146021_Intial.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 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 - - - dbo - - \ No newline at end of file diff --git a/SharedLibrary/Server.cs b/SharedLibrary/Server.cs index 9b39f0c8c..17f828d3e 100644 --- a/SharedLibrary/Server.cs +++ b/SharedLibrary/Server.cs @@ -126,12 +126,6 @@ namespace SharedLibrary abstract protected Task ProcessEvent(Event E); abstract public Task ExecuteEvent(Event E); - /// - /// Reloads all the server configurations - /// - /// True on sucess - abstract public bool Reload(); - /// /// Send a message to all players /// diff --git a/SharedLibrary/SharedLibrary.csproj b/SharedLibrary/SharedLibrary.csproj index ec814ad0b..c7fa0e8ef 100644 --- a/SharedLibrary/SharedLibrary.csproj +++ b/SharedLibrary/SharedLibrary.csproj @@ -182,10 +182,6 @@ - - - 201803030146021_Intial.cs - @@ -258,11 +254,6 @@ false - - - 201803030146021_Intial.cs - - copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)BUILD\lib" diff --git a/WebfrontCore/Application/Manager.cs b/WebfrontCore/Application/Manager.cs index 22594b9d3..a59db47ef 100644 --- a/WebfrontCore/Application/Manager.cs +++ b/WebfrontCore/Application/Manager.cs @@ -187,7 +187,6 @@ namespace IW4MAdmin Commands.Add(new CFindPlayer()); Commands.Add(new CListRules()); Commands.Add(new CPrivateMessage()); - Commands.Add(new CReload()); Commands.Add(new CFlag()); Commands.Add(new CReport()); Commands.Add(new CListReports()); diff --git a/WebfrontCore/Application/Server.cs b/WebfrontCore/Application/Server.cs index 74a5a7606..ba0bdf248 100644 --- a/WebfrontCore/Application/Server.cs +++ b/WebfrontCore/Application/Server.cs @@ -31,7 +31,7 @@ namespace IW4MAdmin override public async Task AddPlayer(Player polledPlayer) { - if (polledPlayer.Ping == 999 || polledPlayer.Ping < 1 || polledPlayer.ClientNumber > (MaxClients) || polledPlayer.ClientNumber < 0) + if (/*polledPlayer.Ping == 999 ||*/ polledPlayer.Ping < 1 || polledPlayer.ClientNumber > (MaxClients) || polledPlayer.ClientNumber < 0) { //Logger.WriteDebug($"Skipping client not in connected state {P}"); return true; @@ -69,6 +69,13 @@ namespace IW4MAdmin return false; } + if (polledPlayer.Name.Where(c => Char.IsControl(c)).Count() > 0) + { + Logger.WriteDebug($"Kicking {polledPlayer} because their contains control characters"); + await this.ExecuteCommandAsync($"clientkick {polledPlayer.ClientNumber} \"Your name cannot contain control characters.\""); + return false; + } + Logger.WriteDebug($"Client slot #{polledPlayer.ClientNumber} now reserved"); try @@ -618,7 +625,7 @@ namespace IW4MAdmin #if DEBUG { basepath.Value = (GameName == Game.IW4) ? - @"Z:\" : + @"D:\" : @"\\tsclient\G\Program Files (x86)\Steam\SteamApps\common\Call of Duty 4"; } @@ -956,23 +963,6 @@ namespace IW4MAdmin await Manager.GetPenaltyService().RemoveActivePenalties(Target.AliasLink.AliasLinkId); } - public override bool Reload() - { - try - { - InitializeMaps(); - InitializeAutoMessages(); - return true; - } - catch (Exception E) - { - Logger.WriteError("Unable to reload configs! - " + E.Message); - BroadcastMessages = new List(); - Maps = new List(); - return false; - } - } - override public void InitializeTokens() { Manager.GetMessageTokens().Add(new SharedLibrary.Helpers.MessageToken("TOTALPLAYERS", Manager.GetClientService().GetTotalClientsAsync().Result.ToString)); diff --git a/WebfrontCore/Controllers/BaseController.cs b/WebfrontCore/Controllers/BaseController.cs index 9a8cda483..5c5f74135 100644 --- a/WebfrontCore/Controllers/BaseController.cs +++ b/WebfrontCore/Controllers/BaseController.cs @@ -23,7 +23,7 @@ namespace WebfrontCore.Controllers ViewBag.Authorized = Authorized; ViewBag.Url = Startup.Configuration["Web:Address"]; string inviteLink = Manager.GetApplicationSettings().Configuration().DiscordInviteCode; - ViewBag.DiscordLink = inviteLink.Contains("http") ? inviteLink : $"https://discordapp.com/invite/{inviteLink}"; + ViewBag.DiscordLink = inviteLink != null && inviteLink.Contains("http") ? inviteLink : $"https://discordapp.com/invite/{inviteLink}"; base.OnActionExecuting(context); } } diff --git a/WebfrontCore/Views/Client/Profile/Index.cshtml b/WebfrontCore/Views/Client/Profile/Index.cshtml index 1cd86a0a7..0e707b7ae 100644 --- a/WebfrontCore/Views/Client/Profile/Index.cshtml +++ b/WebfrontCore/Views/Client/Profile/Index.cshtml @@ -1,5 +1,5 @@ @model SharedLibrary.Dtos.PlayerInfo -@{ +@{ string match = System.Text.RegularExpressions.Regex.Match(Model.Name.ToUpper(), "[A-Z]").Value; string shortCode = match == string.Empty ? "?" : match; } @@ -14,47 +14,47 @@

@Model.Name - @if (Model.Aliases.Count > 0 || ViewBag.Authorized) - { - - } - - -

-
- @{ - foreach (string alias in Model.Aliases) - { - @alias
- } - - if (ViewBag.Authorized) - { - foreach (string ip in Model.IPs) + @if (Model.Aliases.Count > 0 || ViewBag.Authorized) { - @ip
+ } + + +
+ @{ + foreach (string alias in Model.Aliases) + { + @alias
+ } + + if (ViewBag.Authorized) + { + foreach (string ip in Model.IPs) + { + @ip
+ } + + } } - } +
+
+
+
@Model.Level
+
+
+ Played @Model.TimePlayed hours +
+
+ First seen @Model.FirstSeen ago +
+
+ Last seen @Model.LastSeen ago
-
-
@Model.Level
-
-
- Played @Model.TimePlayed hours -
-
- First seen @Model.FirstSeen ago -
-
- Last seen @Model.LastSeen ago -
- -
+
-
+
diff --git a/WebfrontCore/Views/Penalty/_Penalty.cshtml b/WebfrontCore/Views/Penalty/_Penalty.cshtml index 07e0d8760..213ba3ce3 100644 --- a/WebfrontCore/Views/Penalty/_Penalty.cshtml +++ b/WebfrontCore/Views/Penalty/_Penalty.cshtml @@ -34,7 +34,7 @@ Time/Left - + @{ if (Model.TimeRemaining == string.Empty) { @@ -48,7 +48,6 @@ - @Html.ActionLink(Model.OffenderName, "ProfileAsync", "Client", new { id = Model.OffenderId }, new { @class = "link-inverse" }) diff --git a/WebfrontCore/Views/Shared/_Layout.cshtml b/WebfrontCore/Views/Shared/_Layout.cshtml index 2266d6020..9c12d99c1 100644 --- a/WebfrontCore/Views/Shared/_Layout.cshtml +++ b/WebfrontCore/Views/Shared/_Layout.cshtml @@ -6,7 +6,7 @@ @ViewBag.Title | IW4MAdmin - + diff --git a/WebfrontCore/wwwroot/css/profile.css b/WebfrontCore/wwwroot/css/profile.css index fdf6db4ae..342d75941 100644 --- a/WebfrontCore/wwwroot/css/profile.css +++ b/WebfrontCore/wwwroot/css/profile.css @@ -100,7 +100,7 @@ } #profile_aliases_btn { - position: absolute; + position: relative; top: auto; margin-top: 0.7em; font-size: 0.5em; diff --git a/WebfrontCore/wwwroot/images/banner1.svg b/WebfrontCore/wwwroot/images/banner1.svg deleted file mode 100644 index 1ab32b60b..000000000 --- a/WebfrontCore/wwwroot/images/banner1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/WebfrontCore/wwwroot/images/banner2.svg b/WebfrontCore/wwwroot/images/banner2.svg deleted file mode 100644 index 9679c604d..000000000 --- a/WebfrontCore/wwwroot/images/banner2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/WebfrontCore/wwwroot/images/banner3.svg b/WebfrontCore/wwwroot/images/banner3.svg deleted file mode 100644 index 9be2c2503..000000000 --- a/WebfrontCore/wwwroot/images/banner3.svg +++ /dev/null @@ -1 +0,0 @@ -banner3b \ No newline at end of file diff --git a/WebfrontCore/wwwroot/images/banner4.svg b/WebfrontCore/wwwroot/images/banner4.svg deleted file mode 100644 index 38b3d7cd1..000000000 --- a/WebfrontCore/wwwroot/images/banner4.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/WebfrontCore/wwwroot/images/icon.png b/WebfrontCore/wwwroot/images/icon.png new file mode 100644 index 000000000..e9ca45ceb Binary files /dev/null and b/WebfrontCore/wwwroot/images/icon.png differ diff --git a/_customcallbacks.gsc b/_customcallbacks.gsc index d2d01f9af..60ef68166 100644 --- a/_customcallbacks.gsc +++ b/_customcallbacks.gsc @@ -9,6 +9,56 @@ init() level.callbackPlayerKilled = ::Callback_PlayerKilled; } +hitLocationToBone(hitloc) +{ + switch(hitloc) + { + case "helmet": + return "j_helmet"; + case "head": + return "j_head"; + case "neck": + return "j_neck"; + case "torso_upper": + return "j_spineupper"; + case "torso_lower": + return "j_spinelower"; + case "right_arm_upper": + return "j_shoulder_ri"; + case "left_arm_upper": + return "j_shoulder_le"; + case "right_arm_lower": + return "j_elbow_ri"; + case "left_arm_lower": + return "j_elbow_le"; + case "right_hand": + return "j_wrist_ri"; + case "left_hand": + return "j_wrist_le"; + case "right_leg_upper": + return "j_hip_ri"; + case "left_leg_upper": + return "j_hip_le"; + case "right_leg_lower": + return "j_knee_ri"; + case "left_leg_lower": + return "j_knee_le"; + case "right_foot": + return "j_ankle_ri"; + case "left_foot": + return "j_ankle_le"; + default: + return "tag_origin"; + } +} + +VectorScale(vector) +{ + vector[0] = vector[0]*100000; + vector[1] = vector[1]*100000; + vector[2] = vector[2]*100000; + return vector; +} Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) { @@ -19,6 +69,11 @@ Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vD else if(!isPlayer(attacker) && sMeansOfDeath == "MOD_FALLING") _attacker = victim; - logPrint("ScriptKill;" + _attacker.guid + ";" + victim.guid + ";" + _attacker.origin + ";" + victim.origin + ";" + iDamage + ";" + sWeapon + ";" + sHitLoc + ";" + sMeansOfDeath + ";" + _attacker getPlayerAngles() + ";" + vDir + ";" + gettime() + "\n"); + location = victim GetTagOrigin(hitLocationToBone(sHitLoc)); + //attacker iPrintLnBold(location); + //attacker iPrintLnBold(attacker.origin[0]); + + /*BulletTrace(_attacker GetTagOrigin("tag_eye"), VectorScale(anglesToForward(attacker getPlayerAngles())), true, attacker)["entity"]*/ + logPrint("ScriptKill;" + _attacker.guid + ";" + victim.guid + ";" + _attacker GetTagOrigin("tag_eye") + ";" + location + ";" + iDamage + ";" + sWeapon + ";" + sHitLoc + ";" + sMeansOfDeath + ";" + _attacker getPlayerAngles() + ";" + gettime() + "\n"); self maps\mp\gametypes\_damage::Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ); } \ No newline at end of file