Иконка ресурса

FREE SleeperGuard : 0.4.0 0.4.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using Rust;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("SleeperGuard", "Wulf/lukespragg", "0.4.0", ResourceId = 1454)]
    [Description("Protects sleeping players from being hurt, killed, or looted")]

    class SleeperGuard : CovalencePlugin
    {
        #region Initialization

        readonly Hash<string, long> sleepers = new Hash<string, long>();
        readonly DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);

        const string permDamage = "sleeperguard.damage";
        const string permLoot = "sleeperguard.loot";

        int damageDelay;
        int lootDelay;

        protected override void LoadDefaultConfig()
        {
            // Settings
            Config["Damage Protection Delay (Seconds, 0 to Disable)"] = damageDelay = GetConfig("Damage Protection Delay (Seconds, 0 to Disable)", 30);
            Config["Loot Protection Delay (Seconds, 0 to Disable)"] = lootDelay = GetConfig("Loot Protection Delay (Seconds, 0 to Disable)", 30);

            SaveConfig();
        }

        void Init()
        {
            LoadDefaultConfig();
            permission.RegisterPermission(permDamage, this);
            permission.RegisterPermission(permLoot, this);

            UpdateSleepers();
        }

        #endregion

        #region Damage Protection

        void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
        {
            var target = entity.ToPlayer();
            if (target == null || !target.IsSleeping()) return;
            if (Timestamp - sleepers[target.UserIDString] < damageDelay) return;

            if (permission.UserHasPermission(target.UserIDString, permDamage)) NullifyDamage(ref info);
        }

        void NullifyDamage(ref HitInfo info)
        {
            info.damageTypes = new DamageTypeList();
            info.HitMaterial = 0;
            info.PointStart = Vector3.zero;
        }

        #endregion

        #region Loot Protection

        object CanLootPlayer(BasePlayer target, BasePlayer looter)
        {
            if (!target.IsSleeping() || !permission.UserHasPermission(target.UserIDString, permLoot)) return null;
            if (Timestamp - sleepers[target.UserIDString] < lootDelay) return false;

            return false;
        }

        #endregion

        #region Sleeper Handling

        void UpdateSleepers()
        {
            foreach (var sleeper in BasePlayer.sleepingPlayerList)
            {
                if (!sleepers.ContainsKey(sleeper.UserIDString)) sleepers.Add(sleeper.UserIDString, Timestamp);
                else sleepers.Remove(sleeper.UserIDString);
            }
        }

        void OnPlayerSleep(BasePlayer player) => sleepers.Add(player.UserIDString, Timestamp);

        void OnPlayerSleepEnded(BasePlayer player) => sleepers.Remove(player.UserIDString);

        #endregion

        #region Helpers

        T GetConfig<T>(string name, T value) => Config[name] == null ? value : (T)Convert.ChangeType(Config[name], typeof(T));

        long Timestamp => (long)DateTime.UtcNow.Subtract(epoch).TotalSeconds;

        #endregion
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху