diff --git a/DeathLog/DeathLogConfig.cs b/DeathLog/DeathLogConfig.cs index 2b9d210..1e32b22 100644 --- a/DeathLog/DeathLogConfig.cs +++ b/DeathLog/DeathLogConfig.cs @@ -1,6 +1,7 @@ namespace DeathLog; -public sealed class DeathLogConfig { +public sealed class DeathLogConfig +{ public bool LogSimpleDeaths { get; set; } = true; @@ -8,6 +9,8 @@ public sealed class DeathLogConfig { public bool LogLeavingScpPlayers { get; set; } = true; + public bool IgnoreLeavingAfterSpawnWave { get; set; } = true; + public bool KillOnSightPermitted { get; set; } = false; public float DefaultFontSizeScalar { get; set; } = 1; diff --git a/DeathLog/DeathLogPlugin.cs b/DeathLog/DeathLogPlugin.cs index 9d233f7..e92569c 100644 --- a/DeathLog/DeathLogPlugin.cs +++ b/DeathLog/DeathLogPlugin.cs @@ -9,16 +9,19 @@ using Respawning; namespace DeathLog; -public sealed class DeathLogPlugin { +public sealed class DeathLogPlugin +{ [PluginEntryPoint("DeathLog", "1.1.0", "DeathLog", "Axwabo")] - public void OnEnabled() { + public void OnEnabled() + { PluginAPI.Events.EventManager.RegisterEvents(this); Log.Info("DeathLog loaded!"); } [PluginUnload] - public void OnDisabled() { + public void OnDisabled() + { PluginAPI.Events.EventManager.UnregisterEvents(this); Log.Info("DeathLog disabled!"); } @@ -29,20 +32,22 @@ public sealed class DeathLogPlugin { private bool _spawnWaveOccurred; [PluginEvent(ServerEventType.RoundStart)] - private void OnRoundStarted() { + private void OnRoundStarted() + { _spawnWaveOccurred = false; _lastId = ""; } [PluginEvent(ServerEventType.TeamRespawn)] - private void OnTeamRespawn(SpawnableTeamType team) => _spawnWaveOccurred = true; + private void OnTeamRespawn(SpawnableTeamType team) => _spawnWaveOccurred = Config.IgnoreLeavingAfterSpawnWave; private static bool IsUnknownCause(DamageHandlerBase handler) => - handler is UniversalDamageHandler udh && udh.TranslationId == DeathTranslations.Unknown.Id; + handler is UniversalDamageHandler udh && (udh.TranslationId == 0 ? string.IsNullOrEmpty(udh._logsText) : udh._logsText == DeathTranslations.Unknown.LogLabel); [PluginEvent(ServerEventType.PlayerDying)] - private void OnPlayerDeath(Player player, Player attacker, DamageHandlerBase handler) { - if (player.Role == RoleTypeId.None || string.IsNullOrEmpty(player.ReferenceHub.nicknameSync._myNickSync)) + private void OnPlayerDeath(Player player, Player attacker, DamageHandlerBase handler) + { + if (player.Role is RoleTypeId.None or RoleTypeId.Scp0492 || string.IsNullOrEmpty(player.ReferenceHub.nicknameSync._myNickSync)) return; if (attacker != null && handler is AttackerDamageHandler adh) LogHandler.LogAttackerDeathMessage(player, attacker, adh, Config.VisibilityRequirement, Config.KillOnSightPermitted, Config.DefaultFontSizeScalar); @@ -55,8 +60,9 @@ public sealed class DeathLogPlugin { } [PluginEvent(ServerEventType.PlayerDamage)] - private void OnDamage(Player player, Player attacker, DamageHandlerBase handler) { - if (!IsUnknownCause(handler) || player.ReferenceHub.roleManager.CurrentRole is not FpcStandardScp) + private void OnDamage(Player player, Player attacker, DamageHandlerBase handler) + { + if (!IsUnknownCause(handler) || player.ReferenceHub.roleManager.CurrentRole is not FpcStandardScp {RoleTypeId: not RoleTypeId.Scp0492}) return; var stats = player.ReferenceHub.playerStats; _lastHealth = stats.GetModule().CurValue; @@ -69,7 +75,8 @@ public sealed class DeathLogPlugin { private string _lastId; [PluginEvent(ServerEventType.PlayerLeft)] - private void OnPlayerLeave(Player player) { + private void OnPlayerLeave(Player player) + { if (!_spawnWaveOccurred && Config.LogLeavingScpPlayers && player.UserId == _lastId) LogHandler.LogLeavingScp(_lastRole, _lastHealth, _lastHumeShield, Config.VisibilityRequirement, Config.DefaultFontSizeScalar); } diff --git a/DeathLog/LogHandler.cs b/DeathLog/LogHandler.cs index 338ab61..d9a1c8a 100644 --- a/DeathLog/LogHandler.cs +++ b/DeathLog/LogHandler.cs @@ -10,7 +10,8 @@ using UnityEngine; namespace DeathLog; -public static class LogHandler { +public static class LogHandler +{ private const string Lime = "#00FF00"; private const string Cyan = "#00FFF6"; @@ -38,14 +39,16 @@ public static class LogHandler { GetVictimStatus(player, sizeScalar) ), true, permissions, defaultScalar); - private static string GetDeathMessage(DamageHandlerBase handler, float sizeScalar) => handler switch { + private static string GetDeathMessage(DamageHandlerBase handler, float sizeScalar) => handler switch + { CustomReasonDamageHandler custom => $"{{0}} has died: {custom._deathReason.Bold().Color(Lime).Size(30.Scale(sizeScalar))}", UniversalDamageHandler universal => $"{{0}} has died. Reason: {universal._logsText.TrimEnd('.').Bold().Color(Lime).Size(30.Scale(sizeScalar))}", WarheadDamageHandler => $"{{0}} died to {"the Alpha Warhead".Bold().Color(Lime).Size(30.Scale(sizeScalar))}", _ => $"{{0}} has died. {"Reason is unknown".Italic().Color(Lime)}" }; - public static void LogAttackerDeathMessage(Player victim, Player attacker, AttackerDamageHandler handler, PlayerPermissions permissions, bool kosPermitted, float defaultScalar) { + public static void LogAttackerDeathMessage(Player victim, Player attacker, AttackerDamageHandler handler, PlayerPermissions permissions, bool kosPermitted, float defaultScalar) + { var isCuffed = victim.IsDisarmed; var inv = victim.ReferenceHub.inventory; var hasWeaponEquipped = IsWeapon(inv.CurItem.TypeId); @@ -67,22 +70,26 @@ public static class LogHandler { || victimRole == RoleTypeId.Scientist && attackerRole == RoleTypeId.ClassD || victimRole == RoleTypeId.ClassD && attackerRole is RoleTypeId.FacilityGuard or RoleTypeId.NtfPrivate or RoleTypeId.NtfSergeant or RoleTypeId.NtfSpecialist or RoleTypeId.NtfCaptain; - private static void Log(Func msg, bool success, PlayerPermissions playerPermissions, float defaultScalar) { - foreach (var p in Player.GetPlayers()) { + private static void Log(Func msg, bool success, PlayerPermissions playerPermissions, float defaultScalar) + { + foreach (var p in Player.GetPlayers()) + { var sender = p.ReferenceHub.queryProcessor._sender; - if (!p.RemoteAdminAccess || !PermissionsHandler.IsPermitted(sender.Permissions, playerPermissions) || ToggleLogsCommand.HiddenIdList.Contains(sender.SenderId)) + if (!p.RemoteAdminAccess || !PermissionsHandler.IsPermitted(sender.Permissions, playerPermissions) || ToggleLogsCommand.HiddenIdList.Contains(p.UserId)) continue; - var scalar = ToggleLogsCommand.SizeScalar.TryGetValue(sender.SenderId, out var sizeScalar) ? sizeScalar : defaultScalar; + var scalar = ToggleLogsCommand.SizeScalar.TryGetValue(p.UserId, out var sizeScalar) ? sizeScalar : defaultScalar; sender.RaReply(msg(scalar), success, true, ""); } } - private static string GetIdWithDnt(Player player, float sizeScalar) { + private static string GetIdWithDnt(Player player, float sizeScalar) + { var dnt = player.DoNotTrack; return $"{(dnt ? "(DNT)".Color(DntColor).Size(50.Scale(sizeScalar)) + " " : "")}{player.UserId.Color(Color.magenta)} {player.PlayerId.ToString().Bold().Color("yellow").Size(30.Scale(sizeScalar))}"; } - private static object GetKillerStatus(Player attacker, float sizeScalar) { + private static object GetKillerStatus(Player attacker, float sizeScalar) + { var role = attacker.Rm().CurrentRole; return GetIdWithDnt(attacker, sizeScalar) + " " @@ -90,7 +97,8 @@ public static class LogHandler { + " " + attacker.Nickname.Bold().Size(35.Scale(sizeScalar)); } - private static object GetVictimStatus(Player victim, float sizeScalar) { + private static object GetVictimStatus(Player victim, float sizeScalar) + { var role = victim.Rm().CurrentRole; return GetIdWithDnt(victim, sizeScalar).Size(25.Scale(sizeScalar)) + " " @@ -101,7 +109,8 @@ public static class LogHandler { private static string GetKillMessage(AttackerDamageHandler handler, bool canBeKos, bool hasWeaponEquipped, bool cuffed, bool carriesWeapon, bool scpAttacker, float sizeScalar) => (canBeKos && !hasWeaponEquipped ? "POSSIBLE KOS".Color("red").Size(50.Scale(sizeScalar)) + " " : "") + (cuffed && !scpAttacker ? "DETAINED KILL".Color(Cyan).Size(50.Scale(sizeScalar)) + " " : "") - + handler switch { + + handler switch + { RecontainmentDamageHandler => $"{{0}} {"recontained".Bold().Color(Lime).Size(35.Scale(sizeScalar))} {{1}}", FirearmDamageHandler firearm => GetFirearmKillLog(firearm, sizeScalar), ScpDamageHandler => $"{{0}} killed {{1}} using the {"default SCP attack".Bold().Color(Lime).Size(35.Scale(sizeScalar))}", @@ -128,7 +137,8 @@ public static class LogHandler { private static string GetFirearmKillLog(FirearmDamageHandler firearm, float sizeScalar) => $"{{0}} shot {{1}} with {firearm.WeaponType.ToString().Bold().Color("red").Size(35.Scale(sizeScalar))} to the hitbox " + firearm.Hitbox.ToString().Color("red").Bold().Size(35.Scale(sizeScalar)); - private static string GetScp096AttackType(Scp096DamageHandler scp096) => scp096._attackType switch { + private static string GetScp096AttackType(Scp096DamageHandler scp096) => scp096._attackType switch + { Scp096DamageHandler.AttackType.Charge => nameof(Scp096DamageHandler.AttackType.Charge), Scp096DamageHandler.AttackType.SlapLeft => "Left Slap", Scp096DamageHandler.AttackType.SlapRight => "Right Slap", @@ -136,14 +146,16 @@ public static class LogHandler { _ => "[an unknown attack type]" }; - private static string GetScp049AttackType(Scp049DamageHandler scp049) => scp049.DamageSubType switch { + private static string GetScp049AttackType(Scp049DamageHandler scp049) => scp049.DamageSubType switch + { Scp049DamageHandler.AttackType.Instakill => nameof(Scp049DamageHandler.AttackType.Instakill), Scp049DamageHandler.AttackType.Scp0492 => "SCP-049-2", Scp049DamageHandler.AttackType.CardiacArrest => "Cardiac Arrest", _ => "[an unknown attack type]" }; - private static string GetScp939AttackType(Scp939DamageHandler scp939) => scp939._damageType switch { + private static string GetScp939AttackType(Scp939DamageHandler scp939) => scp939._damageType switch + { Scp939DamageType.Claw => nameof(Scp939DamageType.Claw), Scp939DamageType.LungeSecondary => "Lunge Secondary", Scp939DamageType.LungeTarget => "Lunge Target",