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

FREE BagTimerStatus : 1.0.0 1.0.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Oxide.Plugins
{
    [Info("BagTimerStatus", "rustmods.ru", "1.0.0")]
    [Description("Shows pending bag timers as statuses.")]
    internal class BagTimerStatus : CovalencePlugin
    {
        [PluginReference]
        private readonly Plugin SimpleStatus;

        private readonly string PermissionShow = "bagtimerstatus.show";

        private const string STATUS_ID = "bagtimerstatus.{0}";

        private readonly HashSet<ulong> ToggledPlayers = new HashSet<ulong>();

        private bool PluginIsLoaded = false;

        private void OnServerInitialized()
        {
            if (!permission.PermissionExists(PermissionShow))
            {
                permission.RegisterPermission(PermissionShow, this);
            }
            if (!string.IsNullOrWhiteSpace(config.ToggleBagStatusCommand))
            {
                AddCovalenceCommand(config.ToggleBagStatusCommand, nameof(CmdToggleBags));
            }
            for(int i = 0; i < config.MaxBagStatuses; i++)
            {
                SimpleStatus.CallHook("CreateStatus", this, BagStatusId(i), config.StatusBackgroundColor, "", config.StatusTitleColor, null, config.StatusTextColor, "itemid:-1754948969", "1 1 1 1");
            }
            Subscribe(nameof(OnPlayerSleepEnded));
            Subscribe(nameof(OnEntitySpawned));
            Subscribe(nameof(CanAssignBed));
            Subscribe(nameof(CanRenameBed));
            Subscribe(nameof(OnSleepingBagDestroyed));
            Subscribe(nameof(OnEntityDeath));
            foreach (var basePlayer in BasePlayer.activePlayerList)
            {
                OnPlayerSleepEnded(basePlayer);
            }
        }

        void Unload()
        {
            Unsubscribe(nameof(OnPlayerSleepEnded));
            Unsubscribe(nameof(OnEntitySpawned));
            Unsubscribe(nameof(CanAssignBed));
            Unsubscribe(nameof(CanRenameBed));
            Unsubscribe(nameof(OnSleepingBagDestroyed));
            Unsubscribe(nameof(OnEntityDeath));
            foreach (var basePlayer in BasePlayer.activePlayerList)
            {
                UpdateBagStatuses(basePlayer.userID, remove: true);
            }
        }

        void CmdToggleBags(IPlayer player, string wipeday, string[] args)
        {
            var basePlayer = player.Object as BasePlayer;
            if (basePlayer == null) { return; }
            if (ToggledPlayers.Contains(basePlayer.userID))
            {
                ToggledPlayers.Remove(basePlayer.userID);
            }
            else
            {
                ToggledPlayers.Add(basePlayer.userID);
            }
            UpdateBagStatuses(basePlayer.userID);
        }

        private string BagStatusId(int index) => string.Format(STATUS_ID, index);

        private readonly SleepingBag[] EmptyBagList = new SleepingBag[0];

        private void UpdateBagStatuses(ulong userID, bool remove = false)
        {
            if (userID == 0) { return; }
            SleepingBag[] bags = EmptyBagList;
            if (!remove && !ToggledPlayers.Contains(userID))
            {
                bags = SleepingBag.FindForPlayer(userID, true);
                bags.Reverse();
            }
            var hasPerm = permission.UserHasPermission(userID.ToString(), PermissionShow);
            for (int i = 0; i < config.MaxBagStatuses; i++)
            {
                if (hasPerm && i < bags.Length)
                {
                    var bag = bags[i];
                    var seconds = bag.unlockTime - UnityEngine.Time.realtimeSinceStartup;
                    if (bag.unlockSeconds > 0)
                    {
                        SimpleStatus.Call("SetStatus", userID, BagStatusId(i), (int)Math.Floor(bag.unlockSeconds));
                        SimpleStatus.Call("SetStatusProperty", userID, BagStatusId(i), new Dictionary<string, object>
                        {
                            ["title"] = $"{bag.niceName}",
                            ["icon"] = bag.ShortPrefabName == "bed_deployed" ? $"itemid:-1273339005" : $"itemid:-1754948969"
                        });
                        continue;
                    }
                }
                SimpleStatus.Call("SetStatus", userID, BagStatusId(i), 0);
            }
        }
        #region Hooks
        void OnPlayerSleepEnded(BasePlayer basePlayer) => UpdateBagStatuses(basePlayer.userID);
        void OnEntitySpawned(SleepingBag bag) => UpdateBagStatuses(bag.deployerUserID);
        void CanAssignBed(BasePlayer basePlayer, SleepingBag bag, ulong targetPlayerId)
        {
            NextTick(() =>
            {
                if (basePlayer == null) { return; }
                if (basePlayer.userID != targetPlayerId)
                {
                    UpdateBagStatuses(basePlayer.userID);
                }
                UpdateBagStatuses(targetPlayerId);
            });
        }

        void CanRenameBed(BasePlayer basePlayer, SleepingBag bed, string bedName)
        {
            NextTick(() =>
            {
                if (basePlayer == null) { return; }
                UpdateBagStatuses(basePlayer.userID);
            });
        }

        void OnSleepingBagDestroyed(SleepingBag sleepingBag, BasePlayer player) => UpdateBagStatuses(sleepingBag.OwnerID);

        void OnEntityDeath(SleepingBag sleepingBag, HitInfo info)
        {
            var ownerId = sleepingBag.OwnerID;
            NextTick(() =>
            {
                UpdateBagStatuses(ownerId);
            });
        }

        #endregion

        #region Config
        private Configuration config;
        private partial class Configuration
        {
            public int MaxBagStatuses = 15;
            public string StatusBackgroundColor = "0.25490 0.61176 0.86275 1";
            public string StatusTitleColor = "0.87451 0.83529 0.80000 1";
            public string StatusTextColor = "0.87451 0.83529 0.80000 1";
            public string ToggleBagStatusCommand = "bags";
        }
        protected override void LoadConfig()
        {
            base.LoadConfig();
            try
            {
                config = Config.ReadObject<Configuration>();
                if (config == null) throw new Exception();
            }
            catch
            {
                PrintError("Your configuration file contains an error.Using default configuration values.");
                LoadDefaultConfig();
            }
            SaveConfig();
        }
        protected override void SaveConfig() => Config.WriteObject(config);
        protected override void LoadDefaultConfig() => config = new Configuration();
        #endregion
    }
}

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