From 9799fdd8a73a741c5b11c7435d1a0e285c1cd6a8 Mon Sep 17 00:00:00 2001 From: Axwabo Date: Sat, 28 Jan 2023 02:16:34 +0100 Subject: [PATCH] kill log --- DeathLog/DeathLog.csproj | 1 + DeathLog/DeathLogPlugin.cs | 24 ++++---- DeathLog/LogHandler.cs | 119 +++++++++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 DeathLog/LogHandler.cs diff --git a/DeathLog/DeathLog.csproj b/DeathLog/DeathLog.csproj index beadbd6..81b51f1 100644 --- a/DeathLog/DeathLog.csproj +++ b/DeathLog/DeathLog.csproj @@ -106,6 +106,7 @@ + diff --git a/DeathLog/DeathLogPlugin.cs b/DeathLog/DeathLogPlugin.cs index f35f69d..a01cf26 100644 --- a/DeathLog/DeathLogPlugin.cs +++ b/DeathLog/DeathLogPlugin.cs @@ -3,35 +3,31 @@ using PluginAPI.Core; using PluginAPI.Core.Attributes; using PluginAPI.Enums; -namespace DeathLog; +namespace DeathLog; public sealed class DeathLogPlugin { [PluginEntryPoint("DeathLog", "1.0.0", "DeathLog", "Axwabo")] public void OnEnabled() { + PluginAPI.Events.EventManager.RegisterEvents(this); + Log.Debug("DeathLog loaded!"); } [PluginUnload] public void OnDisabled() { + PluginAPI.Events.EventManager.UnregisterEvents(this); + Log.Debug("DeathLog disabled!"); } [PluginConfig] public DeathLogConfig Config = new(); - [PluginEvent(ServerEventType.PlayerDeath)] + [PluginEvent(ServerEventType.PlayerDying)] public void OnPlayerDeath(Player player, Player attacker, DamageHandlerBase handler) { - if (attacker == null) - LogSimpleDeathMessage(player, handler); - else - LogAttackerDeathMessage(player, attacker, handler); - } - - private void LogSimpleDeathMessage(Player player, DamageHandlerBase handler) { - throw new System.NotImplementedException(); - } - - private void LogAttackerDeathMessage(Player player, Player attacker, DamageHandlerBase handler) { - throw new System.NotImplementedException(); + if (attacker != null && handler is AttackerDamageHandler adh) + LogHandler.LogAttackerDeathMessage(player, attacker, adh); + else if (Config.LogSimpleDeaths) + LogHandler.LogSimpleDeathMessage(player, handler); } } diff --git a/DeathLog/LogHandler.cs b/DeathLog/LogHandler.cs new file mode 100644 index 0000000..1ecbc21 --- /dev/null +++ b/DeathLog/LogHandler.cs @@ -0,0 +1,119 @@ +using System.Linq; +using Axwabo.Helpers; +using PlayerRoles; +using PlayerRoles.PlayableScps; +using PlayerRoles.PlayableScps.Scp939; +using PlayerStatsSystem; +using PluginAPI.Core; +using UnityEngine; + +namespace DeathLog; + +public static class LogHandler { + + private static bool IsWeapon(ItemType type) => type is ItemType.GunCOM15 + or ItemType.GunCOM18 + or ItemType.GunCom45 + or ItemType.GunFSP9 + or ItemType.GunCrossvec + or ItemType.GunE11SR + or ItemType.GunAK + or ItemType.GunRevolver + or ItemType.GunShotgun + or ItemType.GunLogicer + or ItemType.ParticleDisruptor + or ItemType.Jailbird; + + public static void LogSimpleDeathMessage(Player player, DamageHandlerBase handler) { + throw new System.NotImplementedException(); + } + + public static void LogAttackerDeathMessage(Player victim, Player attacker, AttackerDamageHandler handler) { + var isCuffed = victim.IsDisarmed; + var inv = victim.ReferenceHub.inventory; + var hasWeaponEquipped = IsWeapon(inv.CurItem.TypeId); + var carriesWeapon = inv.UserInventory.Items.Any(item => IsWeapon(item.Value.ItemTypeId)); + var victimRole = victim.Role; + var attackerRole = attacker.Role; + var canBeKos = victimRole == RoleTypeId.ClassD && attackerRole == RoleTypeId.Scientist + || 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; + Log("KILL LOG".Bold().Color("yellow") + "#" + string.Format( + GetKillMessage(handler, canBeKos, hasWeaponEquipped, isCuffed, carriesWeapon, attacker.Rm().CurrentRole is FpcStandardScp), + GetKillerStatus(attacker), + GetVictimStatus(victim) + ), !isCuffed && (!canBeKos || !hasWeaponEquipped)); + } + + private static void Log(string msg, bool success) { + foreach (var p in Player.GetPlayers().Where(p => p.RemoteAdminAccess)) + p.ReferenceHub.queryProcessor._sender.RaReply(msg, success, true, ""); + } + + private static string GetIdWithDnt(Player player) { + var dnt = player.DoNotTrack; + return $"{(dnt ? "(DNT)".Color(new Color(0.59f, 0.59f, 0.59f)).Size(50) + " " : "")}{player.UserId} {player.PlayerId.ToString().Bold().Color("yellow").Size(30)}"; + } + + private static object GetKillerStatus(Player attacker) { + var role = attacker.Rm().CurrentRole; + return GetIdWithDnt(attacker) + + " " + + role.RoleName.Color(role.RoleColor.ToHex(true, false)).Size(35) + + " " + attacker.Nickname.Bold().Size(35); + } + + private static object GetVictimStatus(Player victim) { + var role = victim.Rm().CurrentRole; + return GetIdWithDnt(victim).Size(25) + + " " + + role.RoleName.Color(role.RoleColor.ToHex(true, false)).Size(35) + + " " + victim.Nickname.Bold().Size(30); + } + + private static string GetKillMessage(AttackerDamageHandler handler, bool canBeKos, bool hasWeaponEquipped, bool cuffed, bool carriesWeapon, bool scpAttacker) => + (canBeKos && !hasWeaponEquipped ? "POSSIBLE KOS".Color("red").Size(50) + " " : "") + + (cuffed ? "DETAINED KILL ".Color("#00fff6").Size(50) + " " : "") + + handler switch { + RecontainmentDamageHandler => $"{{0}} {"recontained".Bold().Color("orange").Size(35)} {{1}}", + FirearmDamageHandler firearm => GetFirearmKillLog(firearm), + ScpDamageHandler => $"{{0}} killed {{1}} using the {"default SCP attack".Bold().Color("orange").Size(35)}", + Scp096DamageHandler scp096 => $"{{0}} killed {{1}} using {GetScp096AttackType(scp096).Bold().Color("orange").Size(35)}", + Scp049DamageHandler scp049 => $"{{0}} killed {{1}} using {GetScp049AttackType(scp049).Bold().Color("orange").Size(35)}", + Scp939DamageHandler scp939 => $"{{0}} killed {{1}} using {GetScp939AttackType(scp939).Bold().Color("orange").Size(35)}", + MicroHidDamageHandler => $"{{0}} fried {{1}} with the {"Micro H.I.D.".Bold().Color("orange").Size(35)}", + ExplosionDamageHandler => $"{{0}} {"exploded".Bold().Color("orange").Size(35)} {{1}}", + Scp018DamageHandler => $"{{0}} killed {{1}} with {"SCP-018".Bold().Color("orange").Size(35)}", + DisruptorDamageHandler => $"{{0}} killed {{1}} with the {"3-X Particle Disruptor".Bold().Color("orange").Size(35)}", + JailbirdDamageHandler => $"{{0}} killed {{1}} with the {"Jailbird".Bold().Color("orange").Size(35)}", + _ => $"{{0}} killed {{1}}. {"Reason is unknown".Italic()}" + } + + WeaponStatusMessage(!scpAttacker, hasWeaponEquipped, carriesWeapon); + + private static string WeaponStatusMessage(bool show, bool hasWeaponEquipped, bool carriesWeapon) => show && (carriesWeapon || hasWeaponEquipped) ? (hasWeaponEquipped ? " Victim was " + "holding".Underline() + " a weapon." : " Victim was " + "carrying".Underline() + " a weapon.").Color("orange").Size(30) : ""; + + private static string GetFirearmKillLog(FirearmDamageHandler firearm) => $"{{0}} shot {{1}} with {firearm.WeaponType.ToString().Bold().Color("red").Size(35)} to the hitbox " + firearm.Hitbox.ToString().Color("red").Bold().Size(35); + + private static string GetScp096AttackType(Scp096DamageHandler scp096) => scp096._attackType switch { + Scp096DamageHandler.AttackType.Charge => "Charge", + Scp096DamageHandler.AttackType.SlapLeft => "Left Slap", + Scp096DamageHandler.AttackType.SlapRight => "Right Slap", + Scp096DamageHandler.AttackType.GateKill => "Gate Kill", + _ => "[an unknown attack type]" + }; + + private static string GetScp049AttackType(Scp049DamageHandler scp049) => scp049.DamageSubType switch { + Scp049DamageHandler.AttackType.Instakill => "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 { + Scp939DamageType.Claw => "Claw", + Scp939DamageType.LungeSecondary => "Lunge Secondary", + Scp939DamageType.LungeTarget => "Lunge Target", + _ => "[an unknown attack type]" + }; + +}