C#:
using Oxide.Core.Plugins;
namespace Oxide.Plugins;
[Info("FClanDeathChat", "fufeldev", "1.0.0")]
public class FClanDeathChat : RustPlugin
{
[PluginReference] private Plugin SClan;
private const string Color1 = "#9cd579";
private const string Color2 = "#a8e6cf";
private const string Color3 = "#5dade2";
private void OnPlayerDeath(BasePlayer player, HitInfo info)
{
if (player == null) return;
BasePlayer attacker = info?.InitiatorPlayer;
if (attacker != null && attacker == player) attacker = null;
foreach (BasePlayer viewer in BasePlayer.activePlayerList)
{
if (viewer == null || !viewer.IsConnected || viewer.IsNpc || !viewer.userID.IsSteamId()) continue;
if (!CanSeeDeath(viewer, player, attacker)) continue;
string message = attacker == null
? $"{FormatName(viewer, player)} умер"
: $"{FormatName(viewer, attacker)} убил {FormatName(viewer, player)}";
viewer.ChatMessage(message);
}
}
private string FormatName(BasePlayer viewer, BasePlayer target)
{
string color = GetColor(viewer, target);
return $"<color={color}>{target.displayName}</color>";
}
private string GetColor(BasePlayer viewer, BasePlayer target)
{
if (target == null || target.IsNpc || !target.userID.IsSteamId()) return Color3;
if (viewer.userID == target.userID) return Color1;
return IsTeammate(viewer.userID, target.userID) ? Color2 : Color3;
}
private bool CanSeeDeath(BasePlayer viewer, BasePlayer victim, BasePlayer attacker)
{
if (IsRelatedPlayer(viewer, victim)) return true;
return IsRelatedPlayer(viewer, attacker);
}
private bool IsRelatedPlayer(BasePlayer viewer, BasePlayer target)
{
if (viewer == null || target == null || target.IsNpc || !target.userID.IsSteamId()) return false;
return IsTeammate(viewer.userID, target.userID);
}
private bool IsTeammate(ulong first, ulong second)
{
if (!first.IsSteamId() || !second.IsSteamId()) return false;
if (first == second) return true;
object result = SClan?.Call("IsTeammate", first, second);
if (result is bool teammate && teammate) return true;
RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance?.FindPlayersTeam(first);
return team != null && team.members != null && team.members.Contains(second);
}
}