C#:
using System.Collections.Generic;
namespace Oxide.Plugins;
[Info("Reflect PvP", "&anhe", "1.3.2")]
[Description("Reflects PvP damage unless teammates.")]
public class ReflectPvP : RustPlugin
{
private void Loaded() =>
RegisterProtectedSleepers();
private object OnEntityTakeDamage(BaseCombatEntity target, HitInfo info) =>
// Reflect if
(
// Attacker is Player
(
info.InitiatorPlayer ??
// Charged drones
BasePlayer.FindByID(info.Initiator?.OwnerID ?? 0)
) is BasePlayer attacker &&
// Not an NPC
!attacker.IsNpc &&
(
// PvP
(
// Target is Player
target is BasePlayer victim &&
// Not an NPC
!victim.IsNpc &&
// Not a team
(
attacker.currentTeam == 0 ||
attacker.currentTeam != victim.currentTeam
) &&
// Not self
attacker.userID != victim.userID &&
// Awake or a protected sleeper
(
!victim.IsSleeping() ||
protectedSleepers.Contains(victim.userID)
)
) ||
// Body gathering
(
// Target is a Corpse
target is LootableCorpse corpse &&
// Not an NPC
corpse.playerSteamID > 76561197960265728 &&
// Not self
attacker.userID != corpse.playerSteamID &&
// Not a team
attacker.Team?.members.Contains(corpse.playerSteamID) != true
)
) &&
// Not admin
!attacker.IsAdmin &&
// Reflect damage
ReflectDamage(attacker, info)
)
? false : null;
#region Reflect damage
bool ReflectDamage(BasePlayer attacker, HitInfo info) {
attacker.Hurt(
info.damageTypes.Total(),
info.damageTypes.GetMajorityDamageType(),
attacker,
false
);
return true;
}
#endregion
#region Protected Sleepers
private void RegisterProtectedSleepers() {
foreach (var player in BasePlayer.sleepingPlayerList)
OnPlayerDisconnected(player, "protectedSleepers registry");
}
private readonly HashSet<ulong> protectedSleepers = new();
private void OnPlayerDisconnected(BasePlayer player, string reason)
{
if (
player.GetBuildingPrivilege()
?.IsAuthed(player) != false
)
protectedSleepers.Add(player.userID);
}
private void OnPlayerConnected(BasePlayer player) =>
protectedSleepers.Remove(player.userID);
#endregion
}