diff --git a/DeathLog/DeathLog.csproj b/DeathLog/DeathLog.csproj
index 7172e7b..03e0e49 100644
--- a/DeathLog/DeathLog.csproj
+++ b/DeathLog/DeathLog.csproj
@@ -46,6 +46,9 @@
..\..\assemblies\Axwabo.Helpers.dll
+
+ ..\..\..\pluginz\assemblies\CommandSystem.Core.dll
+
..\packages\Microsoft.CodeAnalysis.Common.3.3.1\lib\netstandard2.0\Microsoft.CodeAnalysis.dll
@@ -109,6 +112,7 @@
+
diff --git a/DeathLog/DeathLogConfig.cs b/DeathLog/DeathLogConfig.cs
index acd022d..06d89b8 100644
--- a/DeathLog/DeathLogConfig.cs
+++ b/DeathLog/DeathLogConfig.cs
@@ -6,4 +6,6 @@ public sealed class DeathLogConfig {
public PlayerPermissions VisibilityRequirement { get; set; } = PlayerPermissions.Overwatch;
+ public bool LogLeavingScpPlayers { get; set; } = true;
+
}
diff --git a/DeathLog/DeathLogPlugin.cs b/DeathLog/DeathLogPlugin.cs
index a36f4aa..eb68e1c 100644
--- a/DeathLog/DeathLogPlugin.cs
+++ b/DeathLog/DeathLogPlugin.cs
@@ -1,7 +1,10 @@
-using PlayerStatsSystem;
+using Axwabo.Helpers;
+using PlayerRoles.PlayableScps;
+using PlayerStatsSystem;
using PluginAPI.Core;
using PluginAPI.Core.Attributes;
using PluginAPI.Enums;
+using Respawning;
namespace DeathLog;
@@ -22,12 +25,50 @@ public sealed class DeathLogPlugin {
[PluginConfig]
public DeathLogConfig Config = new();
+ private bool _spawnWaveOccurred;
+
+ [PluginEvent(ServerEventType.RoundStart)]
+ private void OnRoundStarted() {
+ _spawnWaveOccurred = false;
+ _lastId = "";
+ }
+
+ [PluginEvent(ServerEventType.TeamRespawn)]
+ private void OnTeamRespawn(SpawnableTeamType team) => _spawnWaveOccurred = true;
+
+ private static bool IsUnknownCause(DamageHandlerBase handler) =>
+ handler is UniversalDamageHandler udh && udh.TranslationId == DeathTranslations.Unknown.Id;
+
[PluginEvent(ServerEventType.PlayerDying)]
- public void OnPlayerDeath(Player player, Player attacker, DamageHandlerBase handler) {
+ private void OnPlayerDeath(Player player, Player attacker, DamageHandlerBase handler) {
if (attacker != null && handler is AttackerDamageHandler adh)
LogHandler.LogAttackerDeathMessage(player, attacker, adh, Config.VisibilityRequirement);
else if (Config.LogSimpleDeaths)
LogHandler.LogSimpleDeathMessage(player, handler, Config.VisibilityRequirement);
+ if (!IsUnknownCause(handler) || player.ReferenceHub.roleManager.CurrentRole is not FpcStandardScp scp)
+ return;
+ _lastRole = scp.RoleName.Color(scp.RoleColor.ToHex());
+ _lastId = player.UserId;
+ }
+
+ [PluginEvent(ServerEventType.PlayerDamage)]
+ private void OnDamage(Player player, Player attacker, DamageHandlerBase handler) {
+ if (!IsUnknownCause(handler) || player.ReferenceHub.roleManager.CurrentRole is not FpcStandardScp)
+ return;
+ var stats = player.ReferenceHub.playerStats;
+ _lastHealth = stats.GetModule().CurValue;
+ _lastHumeShield = stats.GetModule().CurValue;
+ }
+
+ private string _lastRole = "";
+ private float _lastHealth;
+ private float _lastHumeShield;
+ private string _lastId;
+
+ [PluginEvent(ServerEventType.PlayerLeft)]
+ private void OnPlayerLeave(Player player) {
+ if (!_spawnWaveOccurred && Config.LogLeavingScpPlayers && player.UserId == _lastId)
+ LogHandler.LogLeavingScp(_lastRole, _lastHealth, _lastHumeShield, Config.VisibilityRequirement);
}
}
diff --git a/DeathLog/LogHandler.cs b/DeathLog/LogHandler.cs
index c5c7eed..2888010 100644
--- a/DeathLog/LogHandler.cs
+++ b/DeathLog/LogHandler.cs
@@ -24,7 +24,10 @@ public static class LogHandler {
or ItemType.GunShotgun
or ItemType.GunLogicer
or ItemType.ParticleDisruptor
- or ItemType.Jailbird;
+ or ItemType.Jailbird
+ or ItemType.GrenadeHE
+ or ItemType.SCP018
+ or ItemType.MicroHID;
public static void LogSimpleDeathMessage(Player player, DamageHandlerBase handler, PlayerPermissions permissions) => Log("DEATH LOG" + "#" + string.Format(
GetDeathMessage(handler),
@@ -32,10 +35,10 @@ public static class LogHandler {
), true, permissions);
private static string GetDeathMessage(DamageHandlerBase handler) => handler switch {
- CustomReasonDamageHandler custom => $"{{0}} has died: {custom._deathReason.Bold().Color("orange").Size(30)}",
- UniversalDamageHandler universal => $"{{0}} has died. Reason: {universal._logsText.TrimEnd('.').Bold().Color("orange").Size(30)}",
- WarheadDamageHandler => $"{{0}} died to {"the Alpha Warhead".Bold().Color("orange").Size(30)}",
- _ => $"{{0}} has died. {"Reason is unknown".Italic()}"
+ CustomReasonDamageHandler custom => $"{{0}} has died: {custom._deathReason.Bold().Color("#00FF00").Size(30)}",
+ UniversalDamageHandler universal => $"{{0}} has died. Reason: {universal._logsText.TrimEnd('.').Bold().Color("#00FF00").Size(30)}",
+ WarheadDamageHandler => $"{{0}} died to {"the Alpha Warhead".Bold().Color("#00FF00").Size(30)}",
+ _ => $"{{0}} has died. {"Reason is unknown".Italic().Color("#00FF00")}"
};
public static void LogAttackerDeathMessage(Player victim, Player attacker, AttackerDamageHandler handler, PlayerPermissions permissions) {
@@ -59,7 +62,7 @@ public static class LogHandler {
private static void Log(string msg, bool success, PlayerPermissions playerPermissions) {
foreach (var p in Player.GetPlayers()) {
var sender = p.ReferenceHub.queryProcessor._sender;
- if (p.RemoteAdminAccess && PermissionsHandler.IsPermitted(sender.Permissions, playerPermissions))
+ if (p.RemoteAdminAccess && PermissionsHandler.IsPermitted(sender.Permissions, playerPermissions) && !ToggleLogsCommand.HiddenIdList.Contains(sender.SenderId))
sender.RaReply(msg, success, true, "");
}
}
@@ -117,7 +120,7 @@ public static class LogHandler {
};
private static string GetScp049AttackType(Scp049DamageHandler scp049) => scp049.DamageSubType switch {
- Scp049DamageHandler.AttackType.Instakill => "SCP-049 Instakill",
+ Scp049DamageHandler.AttackType.Instakill => "Instakill",
Scp049DamageHandler.AttackType.Scp0492 => "SCP-049-2",
Scp049DamageHandler.AttackType.CardiacArrest => "Cardiac Arrest",
_ => "[an unknown attack type]"
@@ -130,4 +133,9 @@ public static class LogHandler {
_ => "[an unknown attack type]"
};
+ public static void LogLeavingScp(string role, float health, float hs, PlayerPermissions permissions) =>
+ Log($"{"SCP Left".Color("red").Bold()}#Please replace {role.Size(40)} as the player has left the game.\n" +
+ ($"HP: {((int) health).ToString().Color("red")} " +
+ $"HS: {((int) hs).ToString().Color("purple")}").Size(35), false, permissions);
+
}
diff --git a/DeathLog/ToggleLogsCommand.cs b/DeathLog/ToggleLogsCommand.cs
new file mode 100644
index 0000000..499eb48
--- /dev/null
+++ b/DeathLog/ToggleLogsCommand.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using CommandSystem;
+using RemoteAdmin;
+
+namespace DeathLog;
+
+[CommandHandler(typeof(RemoteAdminCommandHandler))]
+public sealed class ToggleLogsCommand : ICommand {
+
+ public static readonly HashSet HiddenIdList = new();
+
+ public string Command => "toggleKillLogs";
+ public string[] Aliases { get; } = {"tkl"};
+ public string Description => "Toggles the visibility of kill logs for the caller.";
+
+ public bool Execute(ArraySegment arguments, ICommandSender sender, out string response) {
+ if (sender is not PlayerCommandSender {ReferenceHub.characterClassManager.UserId: var id}) {
+ response = "You must be a player to use this command.";
+ return false;
+ }
+
+ if (arguments.Count < 1) {
+ if (HiddenIdList.Add(id))
+ response = "You will no longer see kill logs.";
+ else {
+ HiddenIdList.Remove(id);
+ response = "You will now see kill logs.";
+ }
+
+ return true;
+ }
+
+ switch (arguments.At(0).ToLower()) {
+ case "on" or "enable" or "true" or "1":
+ HiddenIdList.Remove(id);
+ response = "You will now see kill logs.";
+ return true;
+ case "off" or "disable" or "false" or "0":
+ HiddenIdList.Add(id);
+ response = "You will no longer see kill logs.";
+ return true;
+ default:
+ response = "Invalid argument.";
+ return false;
+ }
+ }
+
+}