diff --git a/SCPUtils/Commands/AddIps.cs b/SCPUtils/Commands/AddIps.cs index ea309c4..192e477 100644 --- a/SCPUtils/Commands/AddIps.cs +++ b/SCPUtils/Commands/AddIps.cs @@ -35,7 +35,7 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s if (!string.IsNullOrEmpty(a.Ip)) { string ipaddress = a.Ip; - string userId = string.Concat(a.Id, "@", a.Authentication); + string userId = string.Concat(a.Id, "@", a.Authentication); if (!Database.LiteDatabase.GetCollection().Exists(ip => ip.Id == ipaddress)) { ScpUtils.StaticInstance.DatabasePlayerData.AddIp(ipaddress, userId); diff --git a/SCPUtils/Commands/BadgePlayTime.cs b/SCPUtils/Commands/BadgePlayTime.cs index 50c58aa..35286a8 100644 --- a/SCPUtils/Commands/BadgePlayTime.cs +++ b/SCPUtils/Commands/BadgePlayTime.cs @@ -3,7 +3,6 @@ using System; using System.Linq; using System.Text; -using Log = Exiled.API.Features.Log; namespace SCPUtils.Commands { @@ -25,23 +24,23 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s int range; int count = 0; int playtime; - // TimeSpan playtime; + // TimeSpan playtime; if (!sender.CheckPermission("scputils.playtime") && !((CommandSender)sender).FullPermissions) { response = "You need a higher administration level to use this command!"; return false; } - if (arguments.Count < 2) - { - response = $"Usage: {Command} "; - return false; - } - else - { - badge = arguments.Array[1].ToString(); - } + if (arguments.Count < 2) + { + response = $"Usage: {Command} "; + return false; + } + else + { + badge = arguments.Array[1].ToString(); + } - int.TryParse(arguments.Array[2], out range); + int.TryParse(arguments.Array[2], out range); if (!ServerStatic.GetPermissionsHandler().GetAllGroups().ContainsKey(badge)) { @@ -52,7 +51,7 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s StringBuilder message = new StringBuilder($"Checking playtime of badge {badge}").AppendLine(); foreach (var player in ServerStatic.RolesConfig.GetStringDictionary("Members")) { - playtime = 0; + playtime = 0; if (player.Value.ToString() == badge) { var databasePlayer = player.Key.GetDatabasePlayer(); @@ -61,28 +60,28 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s response = $"Null player detected! {player.Key}"; return false; } - - for (int i = 0; i <= range; i++) + + for (int i = 0; i <= range; i++) + { + databasePlayer.PlayTimeRecords.Count(); + DateTime.TryParse((DateTime.Now.Date.AddDays(-i)).ToString(), out DateTime date); + if (databasePlayer.PlayTimeRecords.ContainsKey(date.Date.ToShortDateString())) { - databasePlayer.PlayTimeRecords.Count(); - DateTime.TryParse((DateTime.Now.Date.AddDays(-i)).ToString(), out DateTime date); - if (databasePlayer.PlayTimeRecords.ContainsKey(date.Date.ToShortDateString())) - { - playtime += databasePlayer.PlayTimeRecords[date.Date.ToShortDateString()]; - } + playtime += databasePlayer.PlayTimeRecords[date.Date.ToShortDateString()]; } - if (playtime == 0) message.AppendLine($"[{databasePlayer.Name} - {databasePlayer.Id}@{databasePlayer.Authentication}] - Playtime: [ No activity ]"); - else message.AppendLine($"[{databasePlayer.Name} - {databasePlayer.Id}@{databasePlayer.Authentication}] - Playtime: [ { new TimeSpan(0, 0, playtime).ToString() } ]"); - count++; + } + if (playtime == 0) message.AppendLine($"[{databasePlayer.Name} - {databasePlayer.Id}@{databasePlayer.Authentication}] - Playtime: [ No activity ]"); + else message.AppendLine($"[{databasePlayer.Name} - {databasePlayer.Id}@{databasePlayer.Authentication}] - Playtime: [ { new TimeSpan(0, 0, playtime).ToString() } ]"); + count++; } } - if(count==0) + if (count == 0) { response = "No players found on specified badge!"; return false; } - + response = $"{message}"; diff --git a/SCPUtils/Commands/PlayTime.cs b/SCPUtils/Commands/PlayTime.cs index 41d51a0..0e013d0 100644 --- a/SCPUtils/Commands/PlayTime.cs +++ b/SCPUtils/Commands/PlayTime.cs @@ -22,6 +22,7 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s { string target; int range; + int playtime; if (!sender.CheckPermission("scputils.ownplaytime") && !sender.CheckPermission("scputils.playtime") && !((CommandSender)sender).FullPermissions) { response = "You need a higher administration level to use this command!"; @@ -90,6 +91,7 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s + playtime = 0; for (int i = 0; i <= range; i++) { databasePlayer.PlayTimeRecords.Count(); @@ -98,13 +100,14 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s if (databasePlayer.PlayTimeRecords.ContainsKey(date.Date.ToShortDateString())) { message.Append($"{date.Date.ToShortDateString()} Playtime: [ { new TimeSpan(0, 0, databasePlayer.PlayTimeRecords[date.Date.ToShortDateString()]).ToString() } ]"); + playtime += databasePlayer.PlayTimeRecords[date.Date.ToShortDateString()]; } else { message.Append($"{date.Date.ToShortDateString()} Playtime: [ No activity ]"); } } - + message.AppendLine($"\nSpecified Period PlayTime: [ { new TimeSpan(0, 0, playtime).ToString() } ]"); response = $"{message}"; return true; diff --git a/SCPUtils/Commands/ShowWarns.cs b/SCPUtils/Commands/ShowWarns.cs index f077451..b7858ed 100644 --- a/SCPUtils/Commands/ShowWarns.cs +++ b/SCPUtils/Commands/ShowWarns.cs @@ -1,6 +1,7 @@ using CommandSystem; using Exiled.Permissions.Extensions; using System; +using System.Linq; using System.Text; namespace SCPUtils.Commands @@ -60,8 +61,16 @@ public bool Execute(ArraySegment arguments, ICommandSender sender, out s message.AppendLine($"Class: {databasePlayer.SuicideScp[currentindex]}"); message.AppendLine($"Punishment: {databasePlayer.SuicidePunishment[currentindex]}"); message.AppendLine($"Staffer: {databasePlayer.LogStaffer[currentindex]}"); - if (databasePlayer.SuicidePunishment[currentindex] == "Ban") message.AppendLine($"Expire: {databasePlayer.Expire[currentindex]}"); - if (databasePlayer.SuicidePunishment[currentindex] == "Round-Ban") message.AppendLine($"Round(s) ban: {databasePlayer.RoundsBan[currentindex]}"); + if (databasePlayer.SuicidePunishment[currentindex] == "Ban") + { + if (currentindex <= databasePlayer.Expire.Count()) message.AppendLine($"Expire: {databasePlayer.Expire[currentindex]}"); + else message.AppendLine($"Expire: Unknown"); + } + if (databasePlayer.SuicidePunishment[currentindex] == "Round-Ban") + { + if (currentindex <= databasePlayer.RoundsBan.Count()) message.AppendLine($"Round(s) ban: {databasePlayer.RoundsBan[currentindex]}"); + else message.AppendLine($"Round(s) ban: Unknown"); + } message.AppendLine($"User Notified: {databasePlayer.UserNotified[currentindex]}"); message.AppendLine(); currentindex++; diff --git a/SCPUtils/Configs.cs b/SCPUtils/Configs.cs index aa5e579..2a29374 100644 --- a/SCPUtils/Configs.cs +++ b/SCPUtils/Configs.cs @@ -1,9 +1,9 @@ using Exiled.API.Interfaces; using System.Collections.Generic; using System.ComponentModel; +using DamageTypes = Exiled.API.Enums.DamageType; using Log = Exiled.API.Features.Log; using ZoneType = Exiled.API.Enums.ZoneType; -using DamageTypes = Exiled.API.Enums.DamageType; namespace SCPUtils { @@ -257,7 +257,7 @@ public class Configs : IConfig { DamageTypes.Recontainment.ToString().ToUpper(), DamageTypes.Recontainment.ToString().ToUpper() }, { DamageTypes.Scp.ToString().ToUpper(), DamageTypes.Scp.ToString().ToUpper() }, { DamageTypes.Scp018.ToString().ToUpper(), DamageTypes.Scp018.ToString().ToUpper() }, { DamageTypes.Scp207.ToString().ToUpper(), DamageTypes.Scp207.ToString().ToUpper() }, { DamageTypes.SeveredHands.ToString().ToUpper(), DamageTypes.SeveredHands.ToString().ToUpper() }, { DamageTypes.Tesla.ToString().ToUpper(), DamageTypes.Tesla.ToString().ToUpper() }, { DamageTypes.Unknown.ToString().ToUpper(), DamageTypes.Unknown.ToString().ToUpper() }, { DamageTypes.Warhead.ToString().ToUpper(), DamageTypes.Warhead.ToString().ToUpper() }, { DamageTypes.Firearm.ToString().ToUpper(), DamageTypes.Firearm.ToString().ToUpper() } }; - + [Description("The command name for the unwarn command")] public string UnwarnCommand { get; set; } = "scputils_player_unwarn"; diff --git a/SCPUtils/Database/Database.cs b/SCPUtils/Database/Database.cs index ed4781a..2d414a7 100644 --- a/SCPUtils/Database/Database.cs +++ b/SCPUtils/Database/Database.cs @@ -93,7 +93,7 @@ public void AddIp(string ip, string uid) LiteDatabase.GetCollection().Insert(new DatabaseIp() { Id = ip, - UserIds = new List() { uid } + UserIds = new List() { uid } }); } catch (Exception ex) diff --git a/SCPUtils/Database/DatabaseIp.cs b/SCPUtils/Database/DatabaseIp.cs index 055c05e..948e241 100644 --- a/SCPUtils/Database/DatabaseIp.cs +++ b/SCPUtils/Database/DatabaseIp.cs @@ -5,6 +5,6 @@ namespace SCPUtils public class DatabaseIp { public string Id { get; set; } - public List UserIds { get; set; } = new List(); + public List UserIds { get; set; } = new List(); } } \ No newline at end of file diff --git a/SCPUtils/Database/Player.cs b/SCPUtils/Database/Player.cs index f3d5a94..7c5fa58 100644 --- a/SCPUtils/Database/Player.cs +++ b/SCPUtils/Database/Player.cs @@ -18,7 +18,7 @@ public class Player public DateTime LastSeen { get; set; } public string ColorPreference { get; set; } public string CustomNickName { get; set; } - public bool HideBadge { get; set; } + public bool HideBadge { get; set; } public bool MultiAccountWhiteList { get; set; } public string BadgeName { get; set; } public DateTime BadgeExpire { get; set; } diff --git a/SCPUtils/Functions/EventHandlers.cs b/SCPUtils/Functions/EventHandlers.cs index f2a443a..8043415 100644 --- a/SCPUtils/Functions/EventHandlers.cs +++ b/SCPUtils/Functions/EventHandlers.cs @@ -4,9 +4,9 @@ using System; using System.Collections.Generic; using System.Linq; +using DamageTypes = Exiled.API.Enums.DamageType; using Features = Exiled.API.Features; using Round = Exiled.API.Features.Round; -using DamageTypes = Exiled.API.Enums.DamageType; namespace SCPUtils { @@ -33,66 +33,69 @@ public EventHandlers(ScpUtils pluginInstance) this.pluginInstance = pluginInstance; } - internal void OnPlayerDeath(DyingEventArgs ev) + internal void OnPlayerDeath(DyingEventArgs ev) + { + if (ev.Target == null) return; + Log.Info(ev.Handler.Type); + Log.Info(ev.Handler.Damage); + Log.Info(ev.Handler.IsSuicide); + Log.Info(ev.Handler.Attacker); + if ((ev.Target.Role.Team == Team.SCP || (pluginInstance.Config.AreTutorialsSCP && ev.Target.Role.Team == Team.TUT)) && Round.IsStarted && pluginInstance.Config.EnableSCPSuicideAutoWarn && !TemporarilyDisabledWarns) { - if (ev.Target == null) return; - if ((ev.Target.Role.Team == Team.SCP || (pluginInstance.Config.AreTutorialsSCP && ev.Target.Role.Team == Team.TUT)) && Round.IsStarted && pluginInstance.Config.EnableSCPSuicideAutoWarn && !TemporarilyDisabledWarns) + if ((DateTime.Now - lastTeslaEvent).Seconds >= pluginInstance.Config.Scp079TeslaEventWait) { - if ((DateTime.Now - lastTeslaEvent).Seconds >= pluginInstance.Config.Scp079TeslaEventWait) + if (ev.Handler.Type == DamageTypes.Tesla || (ev.Handler.Type == DamageTypes.Unknown && ev.Handler.Damage >= 50000) || (ev.Handler.Type == DamageTypes.Explosion && ev.Killer == ev.Target)) { - - if (ev.Handler.Type == DamageTypes.Tesla || (ev.Handler.Type == DamageTypes.Unknown && ev.Handler.Damage >= 50000) || (ev.Handler.Type == DamageTypes.Explosion && ev.Killer == ev.Target)) - { - pluginInstance.Functions.LogWarn(ev.Target, ev.Handler.Type.ToString()); - pluginInstance.Functions.OnQuitOrSuicide(ev.Target); - } - else if ((ev.Handler.Type == DamageTypes.Unknown && ev.Handler.Damage == -1f) && ev.Killer == ev.Target && pluginInstance.Config.QuitEqualsSuicide) - { - pluginInstance.Functions.LogWarn(ev.Target, "Disconnect"); - pluginInstance.Functions.OnQuitOrSuicide(ev.Target); - } + pluginInstance.Functions.LogWarn(ev.Target, ev.Handler.Type.ToString()); + pluginInstance.Functions.OnQuitOrSuicide(ev.Target); + } + else if ((ev.Handler.Type == DamageTypes.Unknown && ev.Handler.Damage == -1f) && pluginInstance.Config.QuitEqualsSuicide) + { + pluginInstance.Functions.LogWarn(ev.Target, "Disconnect"); + pluginInstance.Functions.OnQuitOrSuicide(ev.Target); } } + } + + if (pluginInstance.Config.NotifyLastPlayerAlive) + { - if (pluginInstance.Config.NotifyLastPlayerAlive) + List team = Features.Player.Get(ev.Target.Role.Team).ToList(); + if (team.Count - 1 == 1) { - List team = Features.Player.Get(ev.Target.Role.Team).ToList(); - if (team.Count - 1 == 1) + if (team[0] == ev.Target) + { + team[1].ShowHint(pluginInstance.Config.LastPlayerAliveNotificationText, pluginInstance.Config.LastPlayerAliveMessageDuration); + } + else { - if (team[0] == ev.Target) - { - team[1].ShowHint(pluginInstance.Config.LastPlayerAliveNotificationText, pluginInstance.Config.LastPlayerAliveMessageDuration); - } - else - { - team[0].ShowHint(pluginInstance.Config.LastPlayerAliveNotificationText, pluginInstance.Config.LastPlayerAliveMessageDuration); - } + team[0].ShowHint(pluginInstance.Config.LastPlayerAliveNotificationText, pluginInstance.Config.LastPlayerAliveMessageDuration); } } + } - if (ev.Target.IsScp || ev.Target.Role == RoleType.Tutorial && pluginInstance.Config.AreTutorialsSCP) + if (ev.Target.IsScp || ev.Target.Role == RoleType.Tutorial && pluginInstance.Config.AreTutorialsSCP) + { + if (ev.Handler.IsSuicide) { - if (ev.Target.Nickname != ev.Killer.Nickname) + if (pluginInstance.Config.ScpDeathMessage.Show && ev.Target.Role != RoleType.Scp0492) { - if (pluginInstance.Config.ScpDeathMessage.Show && ev.Target.Role != RoleType.Scp0492) - { - var message = pluginInstance.Config.ScpDeathMessage.Content; - message = message.Replace("%playername%", ev.Target.Nickname).Replace("%scpname%", ev.Target.Role.ToString()).Replace("%killername%", ev.Killer.Nickname).Replace("%reason%", ev.Handler.Type.ToString()); - Map.Broadcast(pluginInstance.Config.ScpDeathMessage.Duration, message, pluginInstance.Config.ScpDeathMessage.Type); - } + var message = pluginInstance.Config.ScpDeathMessage.Content; + message = message.Replace("%playername%", ev.Target.Nickname).Replace("%scpname%", ev.Target.Role.ToString()).Replace("%killername%", ev.Killer.Nickname).Replace("%reason%", ev.Handler.Type.ToString()); + Map.Broadcast(pluginInstance.Config.ScpDeathMessage.Duration, message, pluginInstance.Config.ScpDeathMessage.Type); } - - if (ev.Target.Nickname == ev.Killer.Nickname) + } + if (!ev.Handler.IsSuicide) + { + if (pluginInstance.Config.ScpSuicideMessage.Show) { - if (pluginInstance.Config.ScpSuicideMessage.Show) - { - var message = pluginInstance.Config.ScpSuicideMessage.Content; - message = message.Replace("%playername%", ev.Target.Nickname).Replace("%scpname%", ev.Target.Role.ToString()).Replace("%reason%", ev.Handler.Type.ToString()); - Map.Broadcast(pluginInstance.Config.ScpSuicideMessage.Duration, message, pluginInstance.Config.ScpSuicideMessage.Type); - } + var message = pluginInstance.Config.ScpSuicideMessage.Content; + message = message.Replace("%playername%", ev.Target.Nickname).Replace("%scpname%", ev.Target.Role.ToString()).Replace("%reason%", ev.Handler.Type.ToString()); + Map.Broadcast(pluginInstance.Config.ScpSuicideMessage.Duration, message, pluginInstance.Config.ScpSuicideMessage.Type); } } - } + } + } internal void OnRoundRestart() @@ -142,8 +145,8 @@ internal void OnTeamRespawn(RespawningTeamEventArgs ev) } internal void OnPlayerDestroy(DestroyingEventArgs ev) - { - pluginInstance.Functions.SaveData(ev.Player); + { + pluginInstance.Functions.SaveData(ev.Player); } internal void On096AddTarget(AddingTargetEventArgs ev) @@ -167,10 +170,10 @@ internal void On079TeslaEvent(InteractingTeslaEventArgs _) } internal void OnPlayerHurt(HurtingEventArgs ev) - { - if(ev.Attacker == null || ev.Target == null) return; + { + if (ev.Attacker == null || ev.Target == null) return; if (pluginInstance.Config.CuffedImmunityPlayers?.ContainsKey(ev.Target.Role.Team) == true) - { + { ev.IsAllowed = !(pluginInstance.Functions.IsTeamImmune(ev.Target, ev.Attacker) && pluginInstance.Functions.CuffedCheck(ev.Target) && pluginInstance.Functions.CheckSafeZones(ev.Target)); } } diff --git a/SCPUtils/Functions/Functions.cs b/SCPUtils/Functions/Functions.cs index 2d04dae..1b4b419 100644 --- a/SCPUtils/Functions/Functions.cs +++ b/SCPUtils/Functions/Functions.cs @@ -480,15 +480,21 @@ public void FixBanTime(SCPUtils.Player databasePlayer) { databasePlayer.Expire.Add(DateTime.MinValue); } + Database.LiteDatabase.GetCollection().Update(databasePlayer); } + } + + public void FixBanRounds(SCPUtils.Player databasePlayer) + { - if (databasePlayer.SuicideDate.Count() != databasePlayer.RoundsBan.Count()) + if (databasePlayer.SuicideDate.Count() != databasePlayer.SuicideDate.Count()) { databasePlayer.RoundsBan.Clear(); - for (var i = 0; i < databasePlayer.RoundsBan.Count(); i++) + for (var i = 0; i < databasePlayer.SuicideDate.Count(); i++) { databasePlayer.RoundsBan.Add(0); } + Database.LiteDatabase.GetCollection().Update(databasePlayer); } } @@ -531,18 +537,18 @@ public void ReplacePlayer(Exiled.API.Features.Player player) public void IpCheck(Exiled.API.Features.Player player) { - var databaseIp = GetIp.GetIpAddress(player.IPAddress); + var databaseIp = GetIp.GetIpAddress(player.IPAddress); if (!databaseIp.UserIds.Contains(player.UserId)) { databaseIp.UserIds.Add(player.UserId); Database.LiteDatabase.GetCollection().Update(databaseIp); } - if (!pluginInstance.Config.ASNWhiteslistMultiAccount.Contains(player.ReferenceHub.characterClassManager.Asn) && !player.GetDatabasePlayer().MultiAccountWhiteList) CheckIp(player); + if (!pluginInstance.Config.ASNWhiteslistMultiAccount.Contains(player.ReferenceHub.characterClassManager.Asn) && !player.GetDatabasePlayer().MultiAccountWhiteList) CheckIp(player); } public void CheckIp(Exiled.API.Features.Player player) - { + { var databaseIp = GetIp.GetIpAddress(player.IPAddress); if (databaseIp.UserIds.Count() > 1) { diff --git a/SCPUtils/Patches/SCPSpeak.cs b/SCPUtils/Patches/SCPSpeak.cs index b706432..2d71aa2 100644 --- a/SCPUtils/Patches/SCPSpeak.cs +++ b/SCPUtils/Patches/SCPSpeak.cs @@ -9,7 +9,7 @@ namespace SCPUtils public class SCPSpeak { public static bool Prefix(Radio __instance, bool b) - { + { Exiled.API.Features.Player player = Exiled.API.Features.Player.Get(__instance._hub); if (string.IsNullOrEmpty(player?.UserId)) return false; if (player.HasItem(ItemType.Radio)) return __instance._dissonanceSetup.RadioAsHuman = b; @@ -17,7 +17,7 @@ public static bool Prefix(Radio __instance, bool b) else if (ScpUtils.StaticInstance.Config.AllowedScps.Contains(player.Role)) return __instance._dissonanceSetup.MimicAs939 = b; else if (string.IsNullOrEmpty(ServerStatic.GetPermissionsHandler()._groups.FirstOrDefault(g => g.Value == player.ReferenceHub.serverRoles.Group).Key) && !string.IsNullOrEmpty(player.ReferenceHub.serverRoles.MyText)) return false; else if (player.CheckPermission($"scputils_speak.{player.Role.ToString().ToLower()}")) return __instance._dissonanceSetup.MimicAs939 = b; - else return false; + else return false; } } }