using System; using System.Collections.Generic; using Newtonsoft.Json; using UnityEngine; namespace Oxide.Plugins; [Info("Last Words", "Michael Keulemans", "1.0.0")] [Description("Repeats what a player last said in global chat if they die soon after saying it.")] public class LastWords : RustPlugin { private ConfigData _config; private readonly Dictionary _lines = new Dictionary(); private class Line { public string Text; public float Said; } private class ConfigData { [JsonProperty("Seconds a line still counts as last words")] public float Seconds = 30f; [JsonProperty("Message")] public string Message = "{name}'s last words: {text}"; } protected override void LoadDefaultConfig() => _config = new ConfigData(); protected override void LoadConfig() { base.LoadConfig(); try { _config = Config.ReadObject() ?? new ConfigData(); } catch (Exception ex) { Debug.LogException(ex); _config = new ConfigData(); } } protected override void SaveConfig() => Config.WriteObject(_config, true); private void OnPlayerChat(BasePlayer player, string message, ConVar.Chat.ChatChannel channel) { if (channel != ConVar.Chat.ChatChannel.Global) return; _lines[(ulong)player.userID] = new Line { Text = message, Said = Time.realtimeSinceStartup }; } private void OnPlayerDeath(BasePlayer player, HitInfo info) { Line line; if (!_lines.TryGetValue((ulong)player.userID, out line)) return; _lines.Remove((ulong)player.userID); if (Time.realtimeSinceStartup - line.Said > _config.Seconds) return; var text = _config.Message.Replace("{name}", player.displayName); PrintToChat(text.Replace("{text}", line.Text)); } private void OnPlayerDisconnected(BasePlayer player, string reason) => _lines.Remove((ulong)player.userID); }