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

FREE IQRates : 0.1.1 0.1.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("IQRates", "Mercury", "0.1.1")]
    [Description("Настройка рейтинга на сервере")]
    class IQRates : RustPlugin {
        /// <summary>
        /// Обновление 0.0.6
        /// - Исправил добычу в стандартных карьерах(которые просто спавнятся на сервере)
        /// - Добавил скорость плавки печей
        /// - Добавил возможность включения или отключения скорости плавки
        /// - Добавил возможность включения или отключения кастомного спавно каждого ивента
        /// - Исправил проблему с удалением чинука во время вылета на OilRig
        /// </summary>
        ///  /// Обновление 0.0.7
        /// - Убрал лишний тип
        /// - Убрал лишнюю настройку в конфигурации
        /// - Исправил NRE в Unload
        /// Обновление 0.0.9
        /// - Исправлена скорость плавки в печах
        /// - Добавлена возможность настроить скорость плавки по пермишенсам
        /// - Исправлен NRE в OnLootEntity
        /// - Исправлен OnConsumeFuel
        /// - Добавил в настройку "Рейты по привилегиям" расширенную настройку - возможность настраивать рейты для привилегий на день и ночь
        /// - Изменил полностью систему "Кастомной настройки определенных предметов" и "Кастомной настройки определенных предметов по пермишенам"
        /// - Добавил "Кастомную настройку определенных предметов" на день и ночь с поддержкой пермишенсов, все настраивается детально до мелочей
        /// - Исправлен подъем ягод с плантаций
        /// - Полностью изменен метод спавна кастомных ивентов
        /// - Добавлена возможность полностью отключить любой ивент на сервере
        /// - Добавлена возможность спавнить ивенты с установкой случайного времени (каждый спавн будет случайный от N до N времени, устанавливается в конфигурации)
        /// Обновление 0.1.0
        /// - FIX OnDispenserGather
        /// Обновление 0.1.1
        /// - Убрал спам (забыл дебаг стереть)
#region Vars
        public List<UInt64> LootersListCrateID = new List<UInt64>();
        public static IQRates _;
#endregion
#region Configuration
        private static Configuration config = new Configuration();
        private class Configuration {
            [JsonProperty("Настройка плагина")]
            public PluginSettings pluginSettings = new PluginSettings();
            internal class PluginSettings {
                [JsonProperty("Настройка рейтингов")]
                public Rates RateSetting = new Rates();
                [JsonProperty("Дополнительная настройка плагина")]
                public OtherSettings OtherSetting = new OtherSettings();
                internal class Rates {
                    [JsonProperty("Настройка рейтинга днем")]
                    public AllRates DayRates = new AllRates();
                    [JsonProperty("Настройка рейтинга ночью")]
                    public AllRates NightRates = new AllRates();
                    [JsonProperty("Настройка привилегий и рейтингов конкретно для них [iqrates.vip] = { Настройка } (По убыванию)")]
                    public Dictionary<String, DayAnNightRate> PrivilegyRates = new Dictionary<String, DayAnNightRate>();
                    [JsonProperty("Настройка кастомных рейтов(предметов) по пермишенсу - настройка (По убыванию)")]
                    public PermissionsRate CustomRatesPermissions = new PermissionsRate();
                    [JsonProperty("Черный лист предметов,на которые катигорично не будут действовать рейтинг")]
                    public List<String> BlackList = new List<String>();
                    [JsonProperty("Включить скорость плавки в печах(true - да/false - нет)")]
                    public Boolean UseSpeedBurnable;
                    [JsonProperty("Скорость плавки печей(Если включен список - это значение будет стандартное для всех у кого нет прав)")]
                    public Single SpeedBurnable;
                    [JsonProperty("Включить список скорости плавки в печах(true - да/false - нет)")]
                    public Boolean UseSpeedBurnableList;
                    [JsonProperty("Настройка скорости плавки в печах по привилегиям")]
                    public List<SpeedBurnablePreset> SpeedBurableList = new List<SpeedBurnablePreset>();
                    internal class DayAnNightRate {
                        [JsonProperty("Настройка рейтинга днем")]
                        public AllRates DayRates = new AllRates();
                        [JsonProperty("Настройка рейтинга ночью")]
                        public AllRates NightRates = new AllRates();
                    }
                    internal class SpeedBurnablePreset {
                        [JsonProperty("Права")]
                        public String Permissions;
                        [JsonProperty("Скорость плавки печей")]
                        public Single SpeedBurnable;
                    }
                    internal class PermissionsRate {
                        [JsonProperty("Настройка рейтинга днем")]
                        public Dictionary<String, List<PermissionsRateDetalis>> DayRates = new Dictionary<String, List<PermissionsRateDetalis>>();
                        [JsonProperty("Настройка рейтинга ночью")]
                        public Dictionary<String, List<PermissionsRateDetalis>> NightRates = new Dictionary<String, List<PermissionsRateDetalis>>();
                        public class PermissionsRateDetalis {
                            [JsonProperty("Shortname")]
                            public String Shortname;
                            [JsonProperty("Рейтинг")]
                            public Single Rate;
                        }
                    }
                    internal class AllRates {
                        [JsonProperty("Рейтинг добываемых ресурсов")]
                        public Single GatherRate;
                        [JsonProperty("Рейтинг найденных предметов")]
                        public Single LootRate;
                        [JsonProperty("Рейтинг поднимаемых предметов")]
                        public Single PickUpRate;
                        [JsonProperty("Рейтинг карьеров")]
                        public Single QuarryRate;
                        [JsonProperty("Рейтинг экскаватора")]
                        public Single ExcavatorRate;
                        [JsonProperty("Шанс выпадения угля")]
                        public Single CoalRare;
                    }
                }
                internal class OtherSettings {
                    [JsonProperty("Настройки ивентов на сервере")]
                    public EventSettings EventSetting = new EventSettings();
                    [JsonProperty("Использовать ускорение времени")]
                    public Boolean UseTime;
                    [JsonProperty("Использовать заморозку времени(время будет такое, какое вы установите в пунке <Замороженное время на сервере>)")]
                    public Boolean UseFreezeTime;
                    [JsonProperty("Замороженное время на сервере (Установите время, которое не будет изменяться и будет вечно на сервере, должен быть true на <Использовать заморозку времени>")]
                    public Int32 FreezeTime;
                    [JsonProperty("Укажите во сколько будет начинаться день")]
                    public Int32 DayStart;
                    [JsonProperty("Укажите во сколько будет начинаться ночь")]
                    public Int32 NightStart;
                    [JsonProperty("Укажите сколько будет длится день в минутах")]
                    public Int32 DayTime;
                    [JsonProperty("Укажите сколько будет длится ночь в минутах")]
                    public Int32 NightTime;
                    internal class EventSettings {
                        [JsonProperty("Кастомные настройки спавна вертолета")]
                        public Setting HelicopterSetting = new Setting();
                        [JsonProperty("Кастомные настройки спавна танка")]
                        public Setting BreadlaySetting = new Setting();
                        [JsonProperty("Кастомные настройки спавна корабля")]
                        public Setting CargoShipSetting = new Setting();
                        [JsonProperty("Кастомные настройки спавна аирдропа")]
                        public Setting CargoPlaneSetting = new Setting();
                        [JsonProperty("Кастомные настройки спавна чинука")]
                        public Setting ChinoockSetting = new Setting();
                        internal class Setting {
                            [JsonProperty("Полностью отключить спавн ивента на сервере(true - да/false - нет)")]
                            public Boolean FullOff;
                            [JsonProperty("Включить кастомный спавн ивент(true - да/false - нет)")]
                            public Boolean UseEventCustom;
                            [JsonProperty("Статическое время спавна ивента")]
                            public Int32 EventSpawnTime;
                            [JsonProperty("Настройки случайного времени спавна")]
                            public RandomingTime RandomTimeSpawn = new RandomingTime();
                            internal class RandomingTime {
                                [JsonProperty("Использовать случайное время спавно ивента(статическое время не будет учитываться)(true - да/false - нет)")]
                                public Boolean UseRandomTime;
                                [JsonProperty("Минимальное значение спавна ивента")]
                                public Int32 MinEventSpawnTime;
                                [JsonProperty("Максимальное значении спавна ивента")]
                                public Int32 MaxEventSpawnTime;
                            }
                        }
                    }
                }
            }
            public static Configuration GetNewConfiguration() {
                return new Configuration {
                    pluginSettings = new PluginSettings {
                        RateSetting = new PluginSettings.Rates {
                            UseSpeedBurnable = true, SpeedBurnable = 3.5f, UseSpeedBurnableList = true, SpeedBurableList = new List<PluginSettings.Rates.SpeedBurnablePreset> {
                                new PluginSettings.Rates.SpeedBurnablePreset {
                                    Permissions = "iqrates.vip", SpeedBurnable = 5.0f
                                }
                                , new PluginSettings.Rates.SpeedBurnablePreset {
                                    Permissions = "iqrates.speedrun", SpeedBurnable = 55.0f
                                }
                                , new PluginSettings.Rates.SpeedBurnablePreset {
                                    Permissions = "iqrates.fuck", SpeedBurnable = 200f
                                }
                                ,
                            }
                            , DayRates = new PluginSettings.Rates.AllRates {
                                GatherRate = 1.0f, LootRate = 1.0f, PickUpRate = 1.0f, QuarryRate = 1.0f, ExcavatorRate = 1.0f, CoalRare = 10,
                            }
                            , NightRates = new PluginSettings.Rates.AllRates {
                                GatherRate = 2.0f, LootRate = 2.0f, PickUpRate = 2.0f, QuarryRate = 2.0f, ExcavatorRate = 2.0f, CoalRare = 15,
                            }
                            , CustomRatesPermissions = new PluginSettings.Rates.PermissionsRate {
                                DayRates = new Dictionary<String, List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis>> {
                                    ["iqrates.gg"]
                                    = new List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis> {
                                        new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
                                            Rate = 200.0f, Shortname = "wood",
                                        }
                                        , new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
                                            Rate = 200.0f, Shortname = "stones",
                                        }
                                    }
                                }
                                , NightRates = new Dictionary<string, List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis>> {
                                    ["iqrates.gg"]
                                    = new List<PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis> {
                                        new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
                                            Rate = 400.0f, Shortname = "wood",
                                        }
                                        , new PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis {
                                            Rate = 400.0f, Shortname = "stones",
                                        }
                                    }
                                }
                                ,
                            }
                            , PrivilegyRates = new Dictionary<string, PluginSettings.Rates.DayAnNightRate> {
                                ["iqrates.vip"]
                                = new PluginSettings.Rates.DayAnNightRate {
                                    DayRates = {
                                        GatherRate = 3.0f, LootRate = 3.0f, PickUpRate = 3.0f, QuarryRate = 3.0f, ExcavatorRate = 3.0f, CoalRare = 15,
                                    }
                                    , NightRates = new PluginSettings.Rates.AllRates {
                                        GatherRate = 13.0f, LootRate = 13.0f, PickUpRate = 13.0f, QuarryRate = 13.0f, ExcavatorRate = 13.0f, CoalRare = 25,
                                    }
                                }
                                , ["iqrates.premium"] = new PluginSettings.Rates.DayAnNightRate {
                                    DayRates = {
                                        GatherRate = 3.5f, LootRate = 3.5f, PickUpRate = 3.5f, QuarryRate = 3.5f, ExcavatorRate = 3.5f, CoalRare = 20,
                                    }
                                    , NightRates = new PluginSettings.Rates.AllRates {
                                        GatherRate = 13.5f, LootRate = 13.5f, PickUpRate = 13.5f, QuarryRate = 13.5f, ExcavatorRate = 13.5f, CoalRare = 20,
                                    }
                                }
                                ,
                            }
                            , BlackList = new List<String> {
                                "sulfur.ore",
                            }
                            ,
                        }
                        , OtherSetting = new PluginSettings.OtherSettings {
                            UseTime = false, FreezeTime = 12, UseFreezeTime = true, DayStart = 10, NightStart = 22, DayTime = 5, NightTime = 1, EventSetting = new PluginSettings.OtherSettings.EventSettings {
                                BreadlaySetting = new PluginSettings.OtherSettings.EventSettings.Setting {
                                    FullOff = false, UseEventCustom = true, EventSpawnTime = 3000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
                                        UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
                                    }
                                    ,
                                }
                                , CargoPlaneSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
                                    FullOff = false, UseEventCustom = true, EventSpawnTime = 5000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
                                        UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
                                    }
                                    ,
                                }
                                , CargoShipSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
                                    FullOff = false, UseEventCustom = true, EventSpawnTime = 0, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
                                        UseRandomTime = true, MaxEventSpawnTime = 3000, MinEventSpawnTime = 8000,
                                    }
                                    ,
                                }
                                , ChinoockSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
                                    FullOff = true, UseEventCustom = false, EventSpawnTime = 3000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
                                        UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
                                    }
                                    ,
                                }
                                , HelicopterSetting = new PluginSettings.OtherSettings.EventSettings.Setting {
                                    FullOff = true, UseEventCustom = false, EventSpawnTime = 3000, RandomTimeSpawn = new PluginSettings.OtherSettings.EventSettings.Setting.RandomingTime {
                                        UseRandomTime = false, MaxEventSpawnTime = 3000, MinEventSpawnTime = 1000,
                                    }
                                    ,
                                }
                                ,
                            }
                        }
                        ,
                    }
                }
                ;
            }
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
            }
            catch {
                PrintWarning("Ошибка #2657" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Metods
        public void Register(string Permissions) {
            if (!String.IsNullOrWhiteSpace(Permissions)) if (!permission.PermissionExists(Permissions, this)) permission.RegisterPermission(Permissions, this);
        }
#region Events
        private const string prefabCH47 = "assets/prefabs/npc/ch47/ch47scientists.entity.prefab";
        private const string prefabPlane = "assets/prefabs/npc/cargo plane/cargo_plane.prefab";
        private const string prefabShip = "assets/content/vehicles/boats/cargoship/cargoshiptest.prefab";
        private const string prefabPatrol = "assets/prefabs/npc/patrol helicopter/patrolhelicopter.prefab";
        private Int32 GetRandomTime(Int32 Min, Int32 Max) => UnityEngine.Random.Range(Min, Max);
        void StartEvent() {
            var EventSettings = config.pluginSettings.OtherSetting.EventSetting;
            StartCargoShip(EventSettings);
            StartCargoPlane(EventSettings);
            StartBreadley(EventSettings);
            StartChinoock(EventSettings);
            StartHelicopter(EventSettings);
        }
        private void StartCargoShip(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
            if (!EventSettings.CargoShipSetting.FullOff && EventSettings.CargoShipSetting.UseEventCustom) {
                Int32 TimeSpawn = EventSettings.CargoShipSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.CargoShipSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.CargoShipSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.CargoShipSetting.EventSpawnTime;
                timer.Once(TimeSpawn, () => {
                    StartCargoShip(EventSettings);
                    SpawnCargo();
                }
                );
            }
        }
        private void StartCargoPlane(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
            if (!EventSettings.CargoPlaneSetting.FullOff && EventSettings.CargoPlaneSetting.UseEventCustom) {
                Int32 TimeSpawn = EventSettings.CargoPlaneSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.CargoPlaneSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.CargoPlaneSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.CargoPlaneSetting.EventSpawnTime;
                timer.Once(TimeSpawn, () => {
                    StartCargoPlane(EventSettings);
                    SpawnPlane();
                }
                );
            }
        }
        private void StartBreadley(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
            if (!EventSettings.BreadlaySetting.FullOff && EventSettings.BreadlaySetting.UseEventCustom) {
                Int32 TimeSpawn = EventSettings.BreadlaySetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.BreadlaySetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.BreadlaySetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.BreadlaySetting.EventSpawnTime;
                timer.Once(TimeSpawn, () => {
                    StartBreadley(EventSettings);
                    SpawnTank();
                }
                );
            }
        }
        private void StartChinoock(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
            if (!EventSettings.ChinoockSetting.FullOff && EventSettings.ChinoockSetting.UseEventCustom) {
                Int32 TimeSpawn = EventSettings.ChinoockSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.ChinoockSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.ChinoockSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.ChinoockSetting.EventSpawnTime;
                timer.Once(TimeSpawn, () => {
                    StartChinoock(EventSettings);
                    SpawnCH47();
                }
                );
            }
        }
        private void StartHelicopter(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
            if (!EventSettings.HelicopterSetting.FullOff && EventSettings.HelicopterSetting.UseEventCustom) {
                Int32 TimeSpawn = EventSettings.HelicopterSetting.RandomTimeSpawn.UseRandomTime ? GetRandomTime(EventSettings.HelicopterSetting.RandomTimeSpawn.MinEventSpawnTime, EventSettings.HelicopterSetting.RandomTimeSpawn.MaxEventSpawnTime) : EventSettings.HelicopterSetting.EventSpawnTime;
                timer.Once(TimeSpawn, () => {
                    StartHelicopter(EventSettings);
                    SpawnHeli();
                }
                );
            }
        }
        private void UnSubProSub(int time = 1) {
            Unsubscribe("OnEntitySpawned");
            timer.Once(time, () => {
                Subscribe("OnEntitySpawned");
            }
            );
        }
        void SpawnCH47() {
            UnSubProSub();
            var position = new Vector3(ConVar.Server.worldsize, 100, ConVar.Server.worldsize) - new Vector3(50f, 0f, 50f);
            var entity = GameManager.server.CreateEntity(prefabCH47, position) as CH47HelicopterAIController;
            entity?.TriggeredEventSpawn();
            entity?.Spawn();
        }
        void SpawnCargo() {
            UnSubProSub();
            var x = TerrainMeta.Size.x;
            var vector3 = Vector3Ex.Range(-1f, 1f);
            vector3.y = 0.0f;
            vector3.Normalize();
            var worldPos = vector3 * (x * 1f);
            worldPos.y = TerrainMeta.WaterMap.GetHeight(worldPos);
            var entity = GameManager.server.CreateEntity(prefabShip, worldPos);
            entity?.Spawn();
        }
        void SpawnHeli() {
            UnSubProSub();
            var position = new Vector3(ConVar.Server.worldsize, 100, ConVar.Server.worldsize) - new Vector3(50f, 0f, 50f);
            var entity = GameManager.server.CreateEntity(prefabPatrol, position);
            entity?.Spawn();
        }
        void SpawnPlane() {
            UnSubProSub();
            var position = new Vector3(ConVar.Server.worldsize, 100, ConVar.Server.worldsize) - new Vector3(50f, 0f, 50f);
            var entity = GameManager.server.CreateEntity(prefabPlane, position);
            entity?.Spawn();
        }
        private void SpawnTank() {
            UnSubProSub();
            if (!BradleySpawner.singleton.spawned.isSpawned) BradleySpawner.singleton?.SpawnBradley();
        }
#endregion
#region ConvertedMetods
        enum Types {
            Gather, Loot, PickUP, Quarry, Excavator,
        }
        int Converted(Types RateType, string Shortname, float Amount, BasePlayer player = null) {
            float ConvertedAmount = Amount;
            if (IsBlackList(Shortname)) return Convert.ToInt32(ConvertedAmount);
            var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
            Boolean IsTimes = IsTime();
            var Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
            if (player != null) {
                var CustomRate = IsTimes ? config.pluginSettings.RateSetting.CustomRatesPermissions.DayRates : config.pluginSettings.RateSetting.CustomRatesPermissions.NightRates;
                var Rate = CustomRate.FirstOrDefault(x => IsPermission(player.UserIDString, x.Key));
                //dbg
                if (Rate.Value != null) foreach (var RateValue in Rate.Value.Where(x => x.Shortname == Shortname)) {
                    ConvertedAmount = Amount * RateValue.Rate;
                    return (int)ConvertedAmount;
                }
                foreach (var RatesSetting in PrivilegyRates) if (IsPermission(player.UserIDString, RatesSetting.Key)) Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
            }
            switch (RateType) {
                case Types.Gather : {
                    ConvertedAmount = Amount * Rates.GatherRate;
                    break;
                }
                case Types.Loot : {
                    ConvertedAmount = Amount * Rates.LootRate;
                    break;
                }
                case Types.PickUP : {
                    ConvertedAmount = Amount * Rates.PickUpRate;
                    break;
                }
                case Types.Quarry : {
                    ConvertedAmount = Amount * Rates.QuarryRate;
                    break;
                }
                case Types.Excavator : {
                    ConvertedAmount = Amount * Rates.ExcavatorRate;
                    break;
                }
            }
            return Convert.ToInt32(ConvertedAmount);
        }
        float GetRareCoal(BasePlayer player = null) {
            Boolean IsTimes = IsTime();
            var Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
            var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
            if (player != null) {
                foreach (var RatesSetting in PrivilegyRates) if (IsPermission(player.UserIDString, RatesSetting.Key)) Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
            }
            float Rare = Rates.CoalRare;
            float RareResult = (100 - Rare) / 100;
            return RareResult;
        }
#endregion
#region BoolMetods
        bool IsBlackList(string Shortname) {
            var BlackList = config.pluginSettings.RateSetting.BlackList;
            if (BlackList.Contains(Shortname)) return true;
            else return false;
        }
        bool IsTime() {
            var Settings = config.pluginSettings.OtherSetting;
            float TimeServer = TOD_Sky.Instance.Cycle.Hour;
            return TimeServer < Settings.NightStart && Settings.DayStart <= TimeServer;
        }
        bool IsPermission(string userID, string Permission) {
            if (permission.UserHasPermission(userID, Permission)) return true;
            else return false;
        }
#endregion
#endregion
#region Hooks
#region Player Gather Hooks
        object OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item) {
            BasePlayer player = entity as BasePlayer;
            if (item == null || player == null) return null;
            int Rate = Converted(Types.Gather, item.info.shortname, item.amount, player);
            item.amount = Rate;
            return null;
        }
        void OnDispenserBonus(ResourceDispenser disp, BasePlayer player, Item item) {
            if (item == null || player == null) return;
            int Rate = Converted(Types.Gather, item.info.shortname, item.amount, player);
            item.amount = Rate;
        }
#endregion
#region Player PickUP Hooks
        void OnCollectiblePickup(Item item, BasePlayer player) {
            if (player == null || item == null) return;
            item.amount = Converted(Types.PickUP, item.info.shortname, item.amount, player);
        }
        void OnGrowableGathered(GrowableEntity plant, Item item, BasePlayer player) {
            if (item == null || player == null) return;
            item.amount = Converted(Types.PickUP, item.info.shortname, item.amount, player);
        }
        void OnContainerDropItems(ItemContainer container) {
            if (container == null) return;
            var Container = container.entityOwner as LootContainer;
            if (Container == null) return;
            uint NetID = Container.net.ID;
            if (LootersListCrateID.Contains(NetID)) return;
            BasePlayer player = Container.lastAttacker as BasePlayer;
            if (player == null) return;
            foreach (var item in container.itemList) item.amount = Converted(Types.Loot, item.info.shortname, item.amount, player);
        }
#endregion
#region Player Loot Hooks
        void OnLootEntity(BasePlayer player, BaseEntity entity) {
            if (entity == null) return;
            LootContainer container = entity as LootContainer;
            if (container == null || entity.net == null) return;
            UInt64 NetID = entity.net.ID;
            if (LootersListCrateID.Contains(NetID)) return;
            foreach (Item item in container.inventory.itemList) item.amount = Converted(Types.Loot, item.info.shortname, item.amount, player);
            LootersListCrateID.Add(NetID);
        }
        void OnEntityKill(BaseNetworkable entity) {
            UInt64 NetID = entity.net.ID;
            if (LootersListCrateID.Contains(NetID)) LootersListCrateID.Remove(NetID);
        }
#endregion
#region Quarry Gather Hooks
        void OnQuarryGather(MiningQuarry quarry, Item item) {
            if (item == null || quarry == null) return;
            BasePlayer player = quarry.OwnerID != 0 ? BasePlayer.FindByID(quarry.OwnerID) : null;
            item.amount = Converted(Types.Quarry, item.info.shortname, item.amount, player);
        }
#endregion
#region Exacavator Gather Hooks
        private object OnExcavatorGather(ExcavatorArm arm, Item item) {
            if (arm == null) return null;
            if (item == null) return null;
            item.amount = Converted(Types.Excavator, item.info.shortname, item.amount);
            return null;
        }
#endregion
#region Coal Hooks
        void OnFuelConsume(BaseOven oven, Item fuel, ItemModBurnable burnable) {
            if (oven == null) return;
            burnable.byproductChance = GetRareCoal(BasePlayer.FindByID(oven.OwnerID));
            if (burnable.byproductChance == 0) burnable.byproductChance = -1;
        }
#endregion
#region Server Hooks
        TOD_Time timeComponent = null;
        Boolean activatedDay;
        private void GetTimeComponent() {
            timeComponent = TOD_Sky.Instance.Components.Time;
            if (timeComponent == null) return;
            SetTimeComponent();
            StartupFreeze();
        }
        void SetTimeComponent() {
            if (!config.pluginSettings.OtherSetting.UseTime) return;
            timeComponent.ProgressTime = true;
            timeComponent.UseTimeCurve = false;
            timeComponent.OnSunrise += OnSunrise;
            timeComponent.OnSunset += OnSunset;
            timeComponent.OnHour += OnHour;
            if (TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunriseTime && TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunsetTime) OnSunrise();
            else OnSunset();
        }
        void OnHour() {
            if (TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunriseTime && TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunsetTime && !activatedDay) {
                OnSunrise();
                return;
            }
            if ((TOD_Sky.Instance.Cycle.Hour > TOD_Sky.Instance.SunsetTime || TOD_Sky.Instance.Cycle.Hour < TOD_Sky.Instance.SunriseTime) && activatedDay) {
                OnSunset();
                return;
            }
        }
        void OnSunrise() {
            timeComponent.DayLengthInMinutes = config.pluginSettings.OtherSetting.DayTime * (24.0f / (TOD_Sky.Instance.SunsetTime - TOD_Sky.Instance.SunriseTime));
            activatedDay = true;
        }
        void OnSunset() {
            timeComponent.DayLengthInMinutes = config.pluginSettings.OtherSetting.NightTime * (24.0f / (24.0f - (TOD_Sky.Instance.SunsetTime - TOD_Sky.Instance.SunriseTime)));
            activatedDay = false;
        }
        void StartupFreeze() {
            if (!config.pluginSettings.OtherSetting.UseFreezeTime) return;
            timeComponent.ProgressTime = false;
            ConVar.Env.time = config.pluginSettings.OtherSetting.FreezeTime;
        }
        private void OnServerInitialized() {
            _ = this;
            StartEvent();
            foreach (var RateCustom in config.pluginSettings.RateSetting.PrivilegyRates) Register(RateCustom.Key);
            if (config.pluginSettings.RateSetting.UseSpeedBurnableList) foreach (var BurnableList in config.pluginSettings.RateSetting.SpeedBurableList) Register(BurnableList.Permissions);
            List<String> PrivilegyCustomRatePermissions = config.pluginSettings.RateSetting.CustomRatesPermissions.NightRates.Keys.Union(config.pluginSettings.RateSetting.CustomRatesPermissions.DayRates.Keys).ToList();
            foreach (var RateItemCustom in PrivilegyCustomRatePermissions) Register(RateItemCustom);
            timer.Once(5, GetTimeComponent);
            if(config.pluginSettings.RateSetting.UseSpeedBurnable) foreach (var oven in BaseNetworkable.serverEntities.OfType<BaseOven>()) OvenController.GetOrAdd(oven).TryRestart();
            if (!config.pluginSettings.RateSetting.UseSpeedBurnable) Unsubscribe("OnOvenToggle");
        }
#endregion
#region Burnable
        public Single GetMultiplaceBurnableSpeed(String ownerid) {
            Single Multiplace = config.pluginSettings.RateSetting.SpeedBurnable;
            if (config.pluginSettings.RateSetting.UseSpeedBurnableList) {
                var SpeedInList = config.pluginSettings.RateSetting.SpeedBurableList.OrderByDescending(z => z.SpeedBurnable).FirstOrDefault(x => permission.UserHasPermission(ownerid, x.Permissions));
                if (SpeedInList != null) Multiplace = SpeedInList.SpeedBurnable;
            }
            return Multiplace;
        }
        private object OnOvenToggle(BaseOven oven, BasePlayer player) {
            return OvenController.GetOrAdd(oven).Switch(player);
        }
        private class OvenController : FacepunchBehaviour {
            private static readonly Dictionary<BaseOven, OvenController> Controllers = new Dictionary<BaseOven, OvenController>();
            private BaseOven _oven;
            private float _speed;
            private string _ownerId;
            private bool IsFurnace => (int)_oven.temperature >= 2;
            private void Awake() {
                _oven = (BaseOven)gameObject.ToBaseEntity();
                _ownerId = _oven.OwnerID.ToString();
            }
            public object Switch(BasePlayer player) {
                if (!IsFurnace || _oven.needsBuildingPrivilegeToUse && !player.CanBuild()) return null;
                if (_oven.IsOn()) StopCooking();
                else {
                    _ownerId = _oven.OwnerID != 0 ? _oven.OwnerID.ToString() : player.UserIDString;
                    StartCooking();
                }
                return false;
            }
            public void TryRestart() {
                if (!_oven.IsOn()) return;
                _oven.CancelInvoke(_oven.Cook);
                StopCooking();
                StartCooking();
            }
            private void Kill() {
                if (_oven.IsOn()) {
                    StopCooking();
                    _oven.StartCooking();
                }
                Destroy(this);
            }
#region Static methods⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠
            public static OvenController GetOrAdd(BaseOven oven) {
                OvenController controller;
                if (Controllers.TryGetValue(oven, out controller)) return controller;
                controller = oven.gameObject.AddComponent<OvenController>();
                Controllers[oven] = controller;
                return controller;
            }
            public static void TryRestartAll() {
                foreach (var pair in Controllers) {
                    pair.Value.TryRestart();
                }
            }
            public static void KillAll() {
                foreach (var pair in Controllers) {
                    pair.Value.Kill();
                }
                Controllers.Clear();
            }
#endregion
            private void StartCooking() {
                if (_oven.FindBurnable() == null) return;
                Single Multiplace = _.GetMultiplaceBurnableSpeed(_ownerId);
                _speed = 0.5f * Multiplace;
                _oven.inventory.temperature = _oven.cookingTemperature;
                _oven.UpdateAttachmentTemperature();
                InvokeRepeating(Cook, 0.5f, 0.5f);
                _oven.SetFlag(BaseEntity.Flags.On, true);
            }
            private void StopCooking() {
                _oven.UpdateAttachmentTemperature();
                if (_oven.inventory != null) {
                    _oven.inventory.temperature = 15f;
                    foreach (Item item in _oven.inventory.itemList) {
                        if (!item.HasFlag(global : : Item.Flag.OnFire)) continue;
                        item.SetFlag(global : : Item.Flag.OnFire, false);
                        item.MarkDirty();
                    }
                }
                CancelInvoke(Cook);
                _oven.SetFlag(BaseEntity.Flags.On, false);
            }
            private void Cook() {
                if (!_oven.IsOn()) {
                    CancelInvoke(Cook);
                    return;
                }
                Item item = _oven.FindBurnable();
                if (item == null) {
                    StopCooking();
                    return;
                }
                _oven.inventory.OnCycle(_speed);
                BaseEntity slot = _oven.GetSlot(BaseEntity.Slot.FireMod);
                if (slot) slot.SendMessage("Cook", _speed, SendMessageOptions.DontRequireReceiver);
                if (!item.HasFlag(global : : Item.Flag.OnFire)) {
                    item.SetFlag(global : : Item.Flag.OnFire, true);
                    item.MarkDirty();
                }
                var burnable = item.info.GetComponent<ItemModBurnable>();
                var requiredFuel = _speed * (_oven.cookingTemperature / 200f);
                if (item.fuel >= requiredFuel) {
                    item.fuel -= requiredFuel;
                    if (item.fuel <= 0f) _oven.ConsumeFuel(item, burnable);
                    return;
                }
                var itemsRequired = Mathf.CeilToInt(requiredFuel / burnable.fuelAmount);
                for (var i = 0; i < itemsRequired; i++) {
                    requiredFuel -= item.fuel;
                    _oven.ConsumeFuel(item, burnable);
                    if (!item.IsValid()) return;
                }
                item.fuel -= requiredFuel;
            }
        }
#endregion
#region Event Hooks
        private void Unload() {
            OvenController.KillAll();
            if (timeComponent == null) return;
            timeComponent.OnSunrise -= OnSunrise;
            timeComponent.OnSunset -= OnSunset;
            timeComponent.OnHour -= OnHour;
        }
        private void OnEntitySpawned(SupplySignal entity) => UnSubProSub(10);
        private void OnEntitySpawned(CargoPlane entity) {
            var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.CargoPlaneSetting;
            if (EvenTimer.FullOff) entity.Kill();
            else {
                if (EvenTimer.UseEventCustom) if (entity.OwnerID == 0) entity.Kill();
            }
        }
        private void OnEntitySpawned(CargoShip entity) {
            var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.CargoShipSetting;
            if (EvenTimer.FullOff) entity.Kill();
            else {
                if (EvenTimer.UseEventCustom) if (entity.OwnerID == 0) entity.Kill();
            }
        }
        private void OnEntitySpawned(BradleyAPC entity) {
            var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.BreadlaySetting;
            if (EvenTimer.FullOff) entity.Kill();
            else {
                if (EvenTimer.UseEventCustom) if (entity.OwnerID == 0) entity.Kill();
            }
        }
        private void OnEntitySpawned(BaseHelicopter entity) {
            var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.HelicopterSetting;
            if (EvenTimer.FullOff) entity.Kill();
            else {
                if (EvenTimer.UseEventCustom) if (entity.OwnerID == 0) entity.Kill();
            }
        }
        private void OnEntitySpawned(CH47Helicopter entity) {
            timer.Once(5f, () => {
                var EvenTimer = config.pluginSettings.OtherSetting.EventSetting.HelicopterSetting;
                if (EvenTimer.FullOff && entity.mountPoints.Where(x => x.mountable.GetMounted() != null && x.mountable.GetMounted().ShortPrefabName.Contains("heavyscientist")).Count() <= 0) timer.Once(1f, () => {
                    entity.Kill();
                }
                );
                else {
                    if (EvenTimer.UseEventCustom) if (entity.OwnerID == 0 && entity.mountPoints.Where(x => x.mountable.GetMounted() != null && x.mountable.GetMounted().ShortPrefabName.Contains("heavyscientist")).Count() <= 0) timer.Once(1f, () => {
                        entity.Kill();
                    }
                    );
                }
            }
            );
        }
#endregion
#endregion
#region API
        int API_CONVERT(Types RateType, string Shortname, float Amount, BasePlayer player = null) => Converted(RateType, Shortname, Amount, player);
        int API_CONVERT_GATHER(string Shortname, float Amount, BasePlayer player = null) => Converted(Types.Gather, Shortname, Amount, player);
#endregion
    }
}

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