diff --git a/Plugins/IW4ScriptCommands/CommandInfo.cs b/Plugins/IW4ScriptCommands/CommandInfo.cs new file mode 100644 index 000000000..d7e76be63 --- /dev/null +++ b/Plugins/IW4ScriptCommands/CommandInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace IW4ScriptCommands +{ + class CommandInfo + { + public string Command { get; set; } + public int ClientNumber { get; set; } + public List CommandArguments { get; set; } = new List(); + public override string ToString() => $"{Command};{ClientNumber},{string.Join(',', CommandArguments)}"; + } +} diff --git a/Plugins/IW4ScriptCommands/Commands/Balance.cs b/Plugins/IW4ScriptCommands/Commands/Balance.cs index 2c811542c..e24492ded 100644 --- a/Plugins/IW4ScriptCommands/Commands/Balance.cs +++ b/Plugins/IW4ScriptCommands/Commands/Balance.cs @@ -1,197 +1,197 @@ -using SharedLibraryCore; -using SharedLibraryCore.Objects; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +//using SharedLibraryCore; +//using SharedLibraryCore.Objects; +//using System; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; -namespace IW4ScriptCommands.Commands -{ - class Balance : Command - { - private class TeamAssignment - { - public IW4MAdmin.Plugins.Stats.IW4Info.Team CurrentTeam { get; set; } - public int Num { get; set; } - public IW4MAdmin.Plugins.Stats.Models.EFClientStatistics Stats { get; set; } - } - public Balance() : base("balance", "balance teams", "bal", Player.Permission.Trusted, false, null) - { - } +//namespace IW4ScriptCommands.Commands +//{ +// class Balance : Command +// { +// private class TeamAssignment +// { +// public IW4MAdmin.Plugins.Stats.IW4Info.Team CurrentTeam { get; set; } +// public int Num { get; set; } +// public IW4MAdmin.Plugins.Stats.Models.EFClientStatistics Stats { get; set; } +// } +// public Balance() : base("balance", "balance teams", "bal", Player.Permission.Trusted, false, null) +// { +// } - public override async Task ExecuteAsync(GameEvent E) - { - string teamsString = (await E.Owner.GetDvarAsync("sv_iw4madmin_teams")).Value; +// public override async Task ExecuteAsync(GameEvent E) +// { +// string teamsString = (await E.Owner.GetDvarAsync("sv_iw4madmin_teams")).Value; - var scriptClientTeams = teamsString.Split(';', StringSplitOptions.RemoveEmptyEntries) - .Select(c => c.Split(',')) - .Select(c => new TeamAssignment() - { - CurrentTeam = (IW4MAdmin.Plugins.Stats.IW4Info.Team)Enum.Parse(typeof(IW4MAdmin.Plugins.Stats.IW4Info.Team), c[1]), - Num = E.Owner.Players.FirstOrDefault(p => p?.NetworkId == c[0].ConvertLong())?.ClientNumber ?? -1, - Stats = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(E.Owner.Players.FirstOrDefault(p => p?.NetworkId == c[0].ConvertLong()).ClientId, E.Owner.GetHashCode()) - }) - .ToList(); +// var scriptClientTeams = teamsString.Split(';', StringSplitOptions.RemoveEmptyEntries) +// .Select(c => c.Split(',')) +// .Select(c => new TeamAssignment() +// { +// CurrentTeam = (IW4MAdmin.Plugins.Stats.IW4Info.Team)Enum.Parse(typeof(IW4MAdmin.Plugins.Stats.IW4Info.Team), c[1]), +// Num = E.Owner.Players.FirstOrDefault(p => p?.NetworkId == c[0].ConvertLong())?.ClientNumber ?? -1, +// Stats = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(E.Owner.Players.FirstOrDefault(p => p?.NetworkId == c[0].ConvertLong()).ClientId, E.Owner.GetHashCode()) +// }) +// .ToList(); - // at least one team is full so we can't balance - if (scriptClientTeams.Count(ct => ct.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Axis) >= Math.Floor(E.Owner.MaxClients / 2.0) - || scriptClientTeams.Count(ct => ct.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Allies) >= Math.Floor(E.Owner.MaxClients / 2.0)) - { - await E.Origin?.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BALANCE_FAIL"]); - return; - } +// // at least one team is full so we can't balance +// if (scriptClientTeams.Count(ct => ct.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Axis) >= Math.Floor(E.Owner.MaxClients / 2.0) +// || scriptClientTeams.Count(ct => ct.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Allies) >= Math.Floor(E.Owner.MaxClients / 2.0)) +// { +// await E.Origin?.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BALANCE_FAIL"]); +// return; +// } - List teamAssignments = new List(); +// List teamAssignments = new List(); - var activeClients = E.Owner.GetPlayersAsList().Select(c => new TeamAssignment() - { - Num = c.ClientNumber, - Stats = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(c.ClientId, E.Owner.GetHashCode()), - CurrentTeam = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(c.ClientId, E.Owner.GetHashCode()).Team - }) - .Where(c => scriptClientTeams.FirstOrDefault(sc => sc.Num == c.Num)?.CurrentTeam != IW4MAdmin.Plugins.Stats.IW4Info.Team.Spectator) - .Where(c => c.CurrentTeam != scriptClientTeams.FirstOrDefault(p => p.Num == c.Num)?.CurrentTeam) - .OrderByDescending(c => c.Stats.Performance) - .ToList(); +// var activeClients = E.Owner.GetPlayersAsList().Select(c => new TeamAssignment() +// { +// Num = c.ClientNumber, +// Stats = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(c.ClientId, E.Owner.GetHashCode()), +// CurrentTeam = IW4MAdmin.Plugins.Stats.Plugin.Manager.GetClientStats(c.ClientId, E.Owner.GetHashCode()).Team +// }) +// .Where(c => scriptClientTeams.FirstOrDefault(sc => sc.Num == c.Num)?.CurrentTeam != IW4MAdmin.Plugins.Stats.IW4Info.Team.Spectator) +// .Where(c => c.CurrentTeam != scriptClientTeams.FirstOrDefault(p => p.Num == c.Num)?.CurrentTeam) +// .OrderByDescending(c => c.Stats.Performance) +// .ToList(); - var alliesTeam = scriptClientTeams - .Where(c => c.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Allies) - .Where(c => activeClients.Count(t => t.Num == c.Num) == 0) - .ToList(); +// var alliesTeam = scriptClientTeams +// .Where(c => c.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Allies) +// .Where(c => activeClients.Count(t => t.Num == c.Num) == 0) +// .ToList(); - var axisTeam = scriptClientTeams - .Where(c => c.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Axis) - .Where(c => activeClients.Count(t => t.Num == c.Num) == 0) - .ToList(); +// var axisTeam = scriptClientTeams +// .Where(c => c.CurrentTeam == IW4MAdmin.Plugins.Stats.IW4Info.Team.Axis) +// .Where(c => activeClients.Count(t => t.Num == c.Num) == 0) +// .ToList(); - while (activeClients.Count() > 0) - { - int teamSizeDifference = alliesTeam.Count - axisTeam.Count; - double performanceDisparity = alliesTeam.Count > 0 ? alliesTeam.Average(t => t.Stats.Performance) : 0 - - axisTeam.Count > 0 ? axisTeam.Average(t => t.Stats.Performance) : 0; +// while (activeClients.Count() > 0) +// { +// int teamSizeDifference = alliesTeam.Count - axisTeam.Count; +// double performanceDisparity = alliesTeam.Count > 0 ? alliesTeam.Average(t => t.Stats.Performance) : 0 - +// axisTeam.Count > 0 ? axisTeam.Average(t => t.Stats.Performance) : 0; - if (teamSizeDifference == 0) - { - if (performanceDisparity == 0) - { - alliesTeam.Add(activeClients.First()); - activeClients.RemoveAt(0); - } - else - { - if (performanceDisparity > 0) - { - axisTeam.Add(activeClients.First()); - activeClients.RemoveAt(0); - } - else - { - alliesTeam.Add(activeClients.First()); - activeClients.RemoveAt(0); - } - } - } - else if (teamSizeDifference > 0) - { - if (performanceDisparity > 0) - { - axisTeam.Add(activeClients.First()); - activeClients.RemoveAt(0); - } +// if (teamSizeDifference == 0) +// { +// if (performanceDisparity == 0) +// { +// alliesTeam.Add(activeClients.First()); +// activeClients.RemoveAt(0); +// } +// else +// { +// if (performanceDisparity > 0) +// { +// axisTeam.Add(activeClients.First()); +// activeClients.RemoveAt(0); +// } +// else +// { +// alliesTeam.Add(activeClients.First()); +// activeClients.RemoveAt(0); +// } +// } +// } +// else if (teamSizeDifference > 0) +// { +// if (performanceDisparity > 0) +// { +// axisTeam.Add(activeClients.First()); +// activeClients.RemoveAt(0); +// } - else - { - axisTeam.Add(activeClients.Last()); - activeClients.RemoveAt(activeClients.Count - 1); - } - } - else - { - if (performanceDisparity > 0) - { - alliesTeam.Add(activeClients.First()); - activeClients.RemoveAt(0); - } +// else +// { +// axisTeam.Add(activeClients.Last()); +// activeClients.RemoveAt(activeClients.Count - 1); +// } +// } +// else +// { +// if (performanceDisparity > 0) +// { +// alliesTeam.Add(activeClients.First()); +// activeClients.RemoveAt(0); +// } - else - { - alliesTeam.Add(activeClients.Last()); - activeClients.RemoveAt(activeClients.Count - 1); - } - } - } +// else +// { +// alliesTeam.Add(activeClients.Last()); +// activeClients.RemoveAt(activeClients.Count - 1); +// } +// } +// } - alliesTeam = alliesTeam.OrderByDescending(t => t.Stats.Performance) - .ToList(); +// alliesTeam = alliesTeam.OrderByDescending(t => t.Stats.Performance) +// .ToList(); - axisTeam = axisTeam.OrderByDescending(t => t.Stats.Performance) - .ToList(); +// axisTeam = axisTeam.OrderByDescending(t => t.Stats.Performance) +// .ToList(); - while (Math.Abs(alliesTeam.Count - axisTeam.Count) > 1) - { - int teamSizeDifference = alliesTeam.Count - axisTeam.Count; - double performanceDisparity = alliesTeam.Count > 0 ? alliesTeam.Average(t => t.Stats.Performance) : 0 - - axisTeam.Count > 0 ? axisTeam.Average(t => t.Stats.Performance) : 0; +// while (Math.Abs(alliesTeam.Count - axisTeam.Count) > 1) +// { +// int teamSizeDifference = alliesTeam.Count - axisTeam.Count; +// double performanceDisparity = alliesTeam.Count > 0 ? alliesTeam.Average(t => t.Stats.Performance) : 0 - +// axisTeam.Count > 0 ? axisTeam.Average(t => t.Stats.Performance) : 0; - if (teamSizeDifference > 0) - { - if (performanceDisparity > 0) - { - axisTeam.Add(alliesTeam.First()); - alliesTeam.RemoveAt(0); - } +// if (teamSizeDifference > 0) +// { +// if (performanceDisparity > 0) +// { +// axisTeam.Add(alliesTeam.First()); +// alliesTeam.RemoveAt(0); +// } - else - { - axisTeam.Add(alliesTeam.Last()); - alliesTeam.RemoveAt(axisTeam.Count - 1); - } - } +// else +// { +// axisTeam.Add(alliesTeam.Last()); +// alliesTeam.RemoveAt(axisTeam.Count - 1); +// } +// } - else - { - if (performanceDisparity > 0) - { - alliesTeam.Add(axisTeam.Last()); - axisTeam.RemoveAt(axisTeam.Count - 1); - } +// else +// { +// if (performanceDisparity > 0) +// { +// alliesTeam.Add(axisTeam.Last()); +// axisTeam.RemoveAt(axisTeam.Count - 1); +// } - else - { - alliesTeam.Add(axisTeam.First()); - axisTeam.RemoveAt(0); - } - } - } +// else +// { +// alliesTeam.Add(axisTeam.First()); +// axisTeam.RemoveAt(0); +// } +// } +// } - foreach (var assignment in alliesTeam) - { - teamAssignments.Add($"{assignment.Num},2"); - assignment.Stats.Team = IW4MAdmin.Plugins.Stats.IW4Info.Team.Allies; - } - foreach (var assignment in axisTeam) - { - teamAssignments.Add($"{assignment.Num},3"); - assignment.Stats.Team = IW4MAdmin.Plugins.Stats.IW4Info.Team.Axis; - } +// foreach (var assignment in alliesTeam) +// { +// teamAssignments.Add($"{assignment.Num},2"); +// assignment.Stats.Team = IW4MAdmin.Plugins.Stats.IW4Info.Team.Allies; +// } +// foreach (var assignment in axisTeam) +// { +// teamAssignments.Add($"{assignment.Num},3"); +// assignment.Stats.Team = IW4MAdmin.Plugins.Stats.IW4Info.Team.Axis; +// } - if (alliesTeam.Count(ac => scriptClientTeams.First(sc => sc.Num == ac.Num).CurrentTeam != ac.CurrentTeam) == 0 && - axisTeam.Count(ac => scriptClientTeams.First(sc => sc.Num == ac.Num).CurrentTeam != ac.CurrentTeam) == 0) - { - await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BALANCE_FAIL_BALANCED"]); - return; - } +// if (alliesTeam.Count(ac => scriptClientTeams.First(sc => sc.Num == ac.Num).CurrentTeam != ac.CurrentTeam) == 0 && +// axisTeam.Count(ac => scriptClientTeams.First(sc => sc.Num == ac.Num).CurrentTeam != ac.CurrentTeam) == 0) +// { +// await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_BALANCE_FAIL_BALANCED"]); +// return; +// } - if (E.Origin?.Level > Player.Permission.Administrator) - { - await E.Origin.Tell($"Allies Elo: {(alliesTeam.Count > 0 ? alliesTeam.Average(t => t.Stats.Performance) : 0)}"); - await E.Origin.Tell($"Axis Elo: {(axisTeam.Count > 0 ? axisTeam.Average(t => t.Stats.Performance) : 0)}"); - } +// if (E.Origin?.Level > Player.Permission.Administrator) +// { +// await E.Origin.Tell($"Allies Elo: {(alliesTeam.Count > 0 ? alliesTeam.Average(t => t.Stats.Performance) : 0)}"); +// await E.Origin.Tell($"Axis Elo: {(axisTeam.Count > 0 ? axisTeam.Average(t => t.Stats.Performance) : 0)}"); +// } - string args = string.Join(",", teamAssignments); - await E.Owner.ExecuteCommandAsync($"sv_iw4madmin_command \"balance:{args}\""); - await E.Origin.Tell("Balance command sent"); - } - } -} +// string args = string.Join(",", teamAssignments); +// await E.Owner.ExecuteCommandAsync($"sv_iw4madmin_command \"balance:{args}\""); +// await E.Origin.Tell("Balance command sent"); +// } +// } +//} diff --git a/Plugins/IW4ScriptCommands/Plugin.cs b/Plugins/IW4ScriptCommands/Plugin.cs index 36888d932..37c54fbec 100644 --- a/Plugins/IW4ScriptCommands/Plugin.cs +++ b/Plugins/IW4ScriptCommands/Plugin.cs @@ -17,14 +17,29 @@ namespace IW4ScriptCommands public Task OnEventAsync(GameEvent E, Server S) { - if (E.Type == GameEvent.EventType.JoinTeam || E.Type == GameEvent.EventType.Disconnect) + //if (E.Type == GameEvent.EventType.JoinTeam || E.Type == GameEvent.EventType.Disconnect) + //{ + // E.Origin = new SharedLibraryCore.Objects.Player() + // { + // ClientId = 1, + // CurrentServer = E.Owner + // }; + // return new Commands.Balance().ExecuteAsync(E); + //} + + if (E.Type == GameEvent.EventType.Warn) { - E.Origin = new SharedLibraryCore.Objects.Player() + return S.SetDvarAsync("sv_iw4madmin_command", new CommandInfo() { - ClientId = 1, - CurrentServer = E.Owner - }; - return new Commands.Balance().ExecuteAsync(E); + ClientNumber = E.Target.ClientNumber, + Command = "alert", + CommandArguments = new List() + { + "Warning", + "ui_mp_nukebomb_timer", + E.Data + } + }.ToString()); } return Task.CompletedTask; diff --git a/SharedLibraryCore/Commands/NativeCommands.cs b/SharedLibraryCore/Commands/NativeCommands.cs index 4f08e1891..e381d4125 100644 --- a/SharedLibraryCore/Commands/NativeCommands.cs +++ b/SharedLibraryCore/Commands/NativeCommands.cs @@ -70,7 +70,20 @@ namespace SharedLibraryCore.Commands if (E.Origin.Level <= E.Target.Level) await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_WARN_FAIL"]} {E.Target.Name}"); else + { await E.Target.Warn(E.Data, E.Origin); + + var e = new GameEvent() + { + Type = GameEvent.EventType.Warn, + Data = E.Data, + Origin = E.Origin, + Target = E.Target, + Owner = E.Owner + }; + + E.Owner.Manager.GetEventHandler().AddEvent(e); + } } } diff --git a/SharedLibraryCore/Events/GameEvent.cs b/SharedLibraryCore/Events/GameEvent.cs index 141bebc25..2c9367364 100644 --- a/SharedLibraryCore/Events/GameEvent.cs +++ b/SharedLibraryCore/Events/GameEvent.cs @@ -22,6 +22,7 @@ namespace SharedLibraryCore // events "generated" by clients Say, + Warn, Report, Flag, Unflag, diff --git a/_commands.gsc b/_commands.gsc index e698333f5..c39fa2145 100644 --- a/_commands.gsc +++ b/_commands.gsc @@ -11,23 +11,35 @@ WaitForCommand() { for(;;) { - command = getDvar("sv_iw4madmin_command"); - commandArgs = strtok(getDvar("sv_iw4madmin_commandargs"), ","); + commandInfo = strtok(getDvar("sv_iw4madmin_command"), ";"); + command = commandInfo[0]; + commandArgs = strtok(commandInfo[1], ","); switch(command) { case "balance": BalanceTeams(commandArgs); break; + case "alert": + //clientId alertType sound message + SendAlert(commandArgs[0], commandArgs[1], commandArgs[2], commandArgs[3]); + break; } setDvar("sv_iw4madmin_command", ""); - setDvar("sv_iw4madmin_commandargs", ""); - wait(1); } } +SendAlert(clientId, alertType, sound, message) +{ + client = level.players[int(clientId)]; + + client thread playLeaderDialogOnPlayer(sound, client.team); + client playLocalSound(sound); + client iPrintLnBold("^1" + alertType + ": ^3" + message); +} + BalanceTeams(commandArgs) { if (isRoundBased())