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

FREE CooldownSystem : 1.0.0 1.0.0

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

namespace Oxide.Plugins
{
    [Info("CooldownSystem", "bazuka5801", "1.0.0")]
    class CooldownSystem : RustPlugin
    {
        #region FIELDS

        RCore core = Interface.Oxide.GetLibrary<RCore>();
        List<CooldownPlayer> cdPlayers = new List<CooldownPlayer>();
        #endregion

        #region OXIDE HOOKS

        void OnServerInitialized()
        {
            lang.RegisterMessages(Messages, this, "en");
            Messages = lang.GetMessages("en", this);
            timer.Every(1f, CooldownTimerHandler);
            foreach (var player in BasePlayer.activePlayerList)
            {
                DrawUI(CDPlayer(player));
            }
        }

        void Unload()
        {

        }

        void OnPlayerSleepEnded(BasePlayer player)
        {
            NextTick(()=>DrawUI(CDPlayer(player)));
        }
        CooldownPlayer CDPlayer(BasePlayer player)
        {
            var cdPlayer = cdPlayers.Find(p => p.player == player);
            if (cdPlayer != null)
            {
                cdPlayer.player = player;
                return cdPlayer;
            }
            cdPlayer = new CooldownPlayer() {player = player};
            cdPlayers.Add(cdPlayer);
            return cdPlayer;
        }

        #endregion

        #region API

        void SetCooldown(BasePlayer player, string name, int seconds)
        {
            CDPlayer(player).SetCooldown(name,seconds);
        }

        #endregion

        #region CORE

        void CooldownTimerHandler()
        {
            var block = GetWeaponBlockCoolDown();
            for (int i = cdPlayers.Count - 1; i >= 0; i--)
            {
                var cdPlayer = cdPlayers[i];
                cdPlayer.Next();
                cdPlayer.cooldowns[2] = block;
                if (cdPlayer.IsFinish())
                {
                    cdPlayers.RemoveAt(i);
                    continue;
                }
                DrawUI(cdPlayer);
            }
        }

        #endregion

        #region WEAPON RESTRICT

        [PluginReference] private Plugin WeaponRestrict;

        private string WeaponBlock = "00:00";

        int GetWeaponBlockCoolDown()
        {
            return WeaponRestrict?.Call("restrictSeconds") as int? ?? 0;
        }

        #endregion

        #region UI

        void DrawUI(CooldownPlayer player)
        {
            if (!player.player.IsConnected || player.player.IsSleeping()) return;
            
            
            int i = 0;
            string numString = string.Join("",player.cooldowns.Select(cd =>
            {
                var ts = TimeSpan.FromSeconds(cd);
                i++;
                return i == 3 ? $"{ts.Hours:00}{ts.Minutes:00}{ts.Seconds:00}" : $"{ts.Minutes:00}{ts.Seconds:00}";
            }).ToArray());
            core.DrawUI(player.player, "CooldownSystem", "menu", GetImages (numString));
        }

        string[] GetImages(string value) => value.Select(p => ImageStorage.FetchPng(p.ToString())).ToArray();
    
        #endregion

        #region LOCALIZATION

        Dictionary<string, string> Messages = new Dictionary<string, string>()
        {

        };

        #endregion


        #region Nested type: CooldownPlayer

        class CooldownPlayer
        {
            public BasePlayer player;
            public List<int> cooldowns = new List<int>();

            private static readonly List<string> cooldownsNames = new List<string>() {"home", "tp", "weapon.block", "duel", "raid"};

            public CooldownPlayer()
            {
                for (int i = 0; i < cooldownsNames.Count; i++)
                {
                    cooldowns.Add(0);
                }
            }

            public void Next()
            {
                for (int i = 0; i < cooldowns.Count; i++)
                {
                    if (cooldowns[i] > 0)
                        --cooldowns[i];
                }
            }

            public bool IsFinish() => cooldowns.All(cd => cd <= 0);

            public void SetCooldown(string name, int seconds)
            {
                cooldowns[cooldownsNames.IndexOf(name)] = seconds;
            }
        }

        #endregion

    }
}

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