May 4 update response code. The plugin now works.

i made it work. Delete all the existing code in Building Health and paste this code and it should work. Set to 1.1.2 to avoid version conflicts.

using System.Collections.Generic;
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Combat Log DB", "mvrb", "1.1.2")]
    [Description("Translate CombatLog IDs into playernames and lookup players' combat logs.")]
    class CombatLogDb : RustPlugin
    {
        private StoredData storedData;

        private string permissionUse = "combatlogdb.use";

        private void Init()
        {
            LoadData();

            permission.RegisterPermission(permissionUse, this);
        }

        private void OnServerInitialized()
        {
            foreach (var player in BasePlayer.activePlayerList) OnPlayerConnected(player);
        }

        new private void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["NoPlayersFound"] = "No players found with the name {0}",
                ["MultiplePlayersFound"] = "Multiple players found with the name {0}",
                ["NoDataFound"] = "No data found for {0}",
                ["CombatLogIdBelongsTo"] = "The CombatLogID '{0}' belongs to {1}",
                ["CheckConsoleForData"] = "Check your console for CombatLog data on {0}",
                ["CheckingCombatLogFor"] = "---------- CHECKING COMBATLOG FOR {0} ----------",
                ["EndCombatLogOutput"] = "------------------------------------------------------------",
                ["ErrorNameRequired"] = "You must enter a PlayName or SteamID.",
                ["ErrorIdRequired"] = "You must enter an ID found in a Combat Log.",
                ["ErrorInvalidId"] = "You must enter a valid CombatLogID (Numbers only)",
                ["ErrorNoPermission"] = "You do not have permission to use this command."
            }, this);
        }

        [ChatCommand("cid")]
        private void CmdCombatLogId(BasePlayer player, string cmd, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, permissionUse))
            {
                player.ChatMessage(Lang("ErrorNoPermission", player.UserIDString));
                return;
            }

            if (args.Length == 0)
            {
                player.ChatMessage(Lang("ErrorIdRequired", player.UserIDString));
                return;
            }

            ulong input;

            if (!ulong.TryParse(args[0], out input))
            {
                player.ChatMessage(Lang("ErrorInvalidId", player.UserIDString));
                return;
            }

            if (!storedData.Players.ContainsKey(input))
            {
                player.ChatMessage(Lang("NoDataFound", player.UserIDString, input));
                return;
            }

            player.ChatMessage(Lang("CombatLogIdBelongsTo", player.UserIDString, input, GetNameFromId(storedData.Players[input].ToString())));

        }

        [ConsoleCommand("combatlogdb.get")]
        private void ConsoleCmdCombatLog(ConsoleSystem.Arg conArgs)
        {
            if (conArgs?.Connection != null && !permission.UserHasPermission(conArgs?.Player()?.UserIDString, permissionUse)) return;

            var args = conArgs.Args;

            ulong steamID;
            if (!ulong.TryParse(args[0], out steamID))
            {
                SendReply(conArgs, $"{steamID} isn't a valid SteamID64.");
                return;
            }

            int rows = args.Length > 1 ? int.Parse(args[1]) : 20;

            string combatLog = GetCombatLog(steamID, rows);

            SendReply(conArgs, "\n" + combatLog);
        }

        [ChatCommand("combatlog")]
        private void ChatCmdCombatLog(BasePlayer player, string cmd, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, permissionUse))
            {
                player.ChatMessage(Lang("ErrorNoPermission", player.UserIDString));
                return;
            }

            if (args.Length == 0)
            {
                player.ChatMessage(Lang("ErrorNameRequired", player.UserIDString));
                return;
            }

            var input = args[0].ToLower();

            var found = new List<BasePlayer>();
            foreach (var t in BasePlayer.activePlayerList)
            {
                if (t.UserIDString == input)
                {
                    found.Clear();
                    found.Add(t);
                    break;
                }
                else if (t.displayName.ToLower() == input)
                {
                    found.Clear();
                    found.Add(t);
                    break;
                }
                if (t.displayName.ToLower().Contains(input))
                {
                    found.Add(t);
                }
            }

            if (found.Count == 0)
            {
                player.ChatMessage(Lang("NoPlayersFound", player.UserIDString, input));
                return;
            }
            else if (found.Count > 1)
            {
                string msg = Lang("MultiplePlayersFound", player.UserIDString, input) + ": \n";
                foreach (var p in found) msg += $"- {p.displayName} \n";
                player.ChatMessage(msg);
                return;
            }

            var target = found[0];

            int rows = args.Length > 1 ? int.Parse(args[1]) : 20;

            player.ConsoleMessage(Lang("CheckingCombatLogFor", player.UserIDString, target.displayName));
            player.ConsoleMessage("\n");
            player.ConsoleMessage(GetCombatLog(target.userID, rows));
            player.ConsoleMessage("\n");
            player.ConsoleMessage(Lang("EndCombatLogOutput", player.UserIDString));

            player.ChatMessage(Lang("CheckConsoleForData", player.UserIDString, target.displayName));
        }

        private string GetCombatLog(ulong steamid, int count)
        {
            var storage = CombatLog.Get(steamid);

            TextTable textTable = new TextTable();
            textTable.AddColumn("time");
            textTable.AddColumn("attacker");
            textTable.AddColumn("id");
            textTable.AddColumn("target");
            textTable.AddColumn("id");
            textTable.AddColumn("weapon");
            textTable.AddColumn("ammo");
            textTable.AddColumn("area");
            textTable.AddColumn("distance");
            textTable.AddColumn("old_hp");
            textTable.AddColumn("new_hp");
            textTable.AddColumn("info");

            int num = storage.Count - count;
            int num1 = ConVar.Server.combatlogdelay;
            int num2 = 0;

            foreach (CombatLog.Event evt in storage)
            {
                if (num <= 0)
                {
                    float single = Time.realtimeSinceStartup - evt.time;
                    if (single < (float)num1)
                    {
                        num2++;
                    }
                    else
                    {
                        string str = single.ToString("0.0s");
                        string str1 = evt.attacker == "you" ? GetNameFromId(steamid.ToString()) : evt.attacker;

                        string str2 = storedData.Players.ContainsKey((ulong)evt.attacker_id) ? GetNameFromId(storedData.Players[(ulong)evt.attacker_id].ToString()) : evt.attacker_id.ToString();

                        string str3 = evt.target == "you" ? GetNameFromId(steamid.ToString()) : evt.target;

                        string str4 = storedData.Players.ContainsKey((ulong)evt.target_id) ? GetNameFromId(storedData.Players[(ulong)evt.target_id].ToString()) : evt.target_id.ToString();

                        string str5 = evt.weapon;
                        string str6 = evt.ammo;
                        string lower = HitAreaUtil.Format(evt.area).ToLower();
                        string str7 = evt.distance.ToString("0.0m");
                        string str8 = evt.health_old.ToString("0.0");
                        string str9 = evt.health_new.ToString("0.0");
                        string str10 = evt.info;
                        textTable.AddRow(new string[] { str, str1, str2, str3, str4, str5, str6, lower, str7, str8, str9, str10 });
                    }
                }
                else
                {
                    num--;
                }
            }

            string str11 = textTable.ToString();
            if (num2 > 0)
            {
                string str12 = str11;
                object[] objArray = new object[] { str12, "+ ", num2, " ", null };
                objArray[4] = (num2 <= 1 ? "event" : "events");
                str11 = string.Concat(objArray);
                str12 = str11;
                object[] objArray1 = new object[] { str12, " in the last ", num1, " ", null };
                objArray1[4] = (num1 <= 1 ? "second" : "seconds");
                str11 = string.Concat(objArray1);
            }
            return str11;
        }

        private void OnNewSave(string s)
        {
            storedData.Players.Clear();
            SaveData();
        }

        private void OnPlayerConnected(BasePlayer player)
        {
            if (!storedData.Players.ContainsKey(player.net.ID.Value))
            {
                storedData.Players.Add(player.net.ID.Value, player.userID);
            }

            SaveData();
        }

        private void LoadData() => storedData = Interface.Oxide.DataFileSystem.ReadObject<StoredData>(this.Name);
        private void SaveData() => Interface.Oxide.DataFileSystem.WriteObject(this.Name, storedData);

        private string GetNameFromId(string id) => covalence.Players.FindPlayerById(id)?.Name;

        private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);

        private class StoredData
        {
            public Dictionary<ulong, ulong> Players = new Dictionary<ulong, ulong>();
        }
    }
}​

Hi everyone
I created a fork of this plugin to make it work with the latest rust updates.

https://digitalmarketplay.com/product/combat-log-db/

I hope it is useful to you



Merged post

Please write to me for any new changes to be made to the plugin.