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

FREE IQRates : 1.99.37 1.99.37

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using System;
using Object = System.Object;
using System.Text;
using Facepunch;
using System.Collections;
namespace Oxide.Plugins {
    [Info("IQRates", "Mercury", "1.99.37")]
    [Description("Настройка рейтинга на сервере")]
    class IQRates : RustPlugin {
        private const Boolean LanguageEn = false;
        bool IsPermission(string userID, string Permission) {
            if (permission.UserHasPermission(userID, Permission)) return true;
            else return false;
        }
        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();
                    if(EventSettings.CargoPlaneSetting.useGameTip) MessageGameTipsError("ALERT_CARGOPLANE");
                }
                );
            }
        }
        UInt64? GetQuarryPlayer(UInt64 NetID) {
            if (!DataQuarryPlayer.ContainsKey(NetID)) return null;
            if (DataQuarryPlayer[NetID] == 0) return null;
            return DataQuarryPlayer[NetID];
        }
        void StartupFreeze() {
            if (!config.pluginSettings.OtherSetting.UseFreezeTime) return;
            timeComponent.ProgressTime = true;
            ConVar.Env.time = config.pluginSettings.OtherSetting.FreezeTime;
        }
        void OnQuarryToggled(MiningQuarry quarry, BasePlayer player) => AddQuarryPlayer(quarry.net.ID.Value, player.userID);
        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 Int32 _ticks;
            private Int32 _speedFuel;
            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 != null && !player.CanBuild())) return null;
                if (_oven.IsOn()) StopCooking();
                else {
                    _ownerId = _oven.OwnerID != 0 || player == null ? _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);
            }
            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();
            }
            public void OnDestroy() {
                Destroy(this);
            }
            private void StartCooking() {
                if(_oven.IndustrialMode != BaseOven.IndustrialSlotMode.ElectricFurnace) if (_oven.FindBurnable() == null) return;
                Single Multiplace = _.GetMultiplaceBurnableSpeed(_ownerId);
                _speed = (Single)(0.5f / Multiplace);
                // 0.57 * M
                Int32 MultiplaceFuel = _.GetMultiplaceBurnableFuelSpeed(_ownerId);
                _speedFuel = MultiplaceFuel;
                StopCooking();
                _oven.inventory.temperature = _oven.cookingTemperature;
                _oven.UpdateAttachmentTemperature();
                InvokeRepeating(Cook, _speed, _speed);
                _oven.SetFlag(BaseEntity.Flags.On, true);
            }
            private void StopCooking() {
                CancelInvoke(Cook);
                _oven.StopCooking();
                _oven.SetFlag(BaseEntity.Flags.On, false);
                _oven.SendNetworkUpdate();
                if (_oven.inventory != null) {
                    foreach (Item item in _oven.inventory.itemList) {
                        if (item.HasFlag(global : : Item.Flag.Cooking)) item.SetFlag(global : : Item.Flag.Cooking, false);
                        item.MarkDirty();
                    }
                }
            }
            public void Cook() {
                if (!_oven.HasFlag(BaseEntity.Flags.On)) {
                    StopCooking();
                    return;
                }
                Item item = _oven.FindBurnable();
                if (Interface.CallHook("OnOvenCook", this, item) != null) return;
                if (_oven.IndustrialMode != BaseOven.IndustrialSlotMode.ElectricFurnace) {
                    if (item == null) {
                        StopCooking();
                        return;
                    }
                }
                _oven.Cook();
                SmeltItems();
                if (_oven.IndustrialMode != BaseOven.IndustrialSlotMode.ElectricFurnace) {
                    var component = item.info.GetComponent<ItemModBurnable>();
                    item.fuel -= 0.5f * (_oven.cookingTemperature / 200f) * _speedFuel;
                    if (!item.HasFlag(global : : Item.Flag.OnFire)) {
                        item.SetFlag(global : : Item.Flag.OnFire, true);
                        item.MarkDirty();
                    }
                    if (item.fuel <= 0f) {
                        _oven.ConsumeFuel(item, component);
                    }
                }
                _ticks++;
                Interface.CallHook("OnOvenCooked", this, item, _oven.GetSlot(BaseEntity.Slot.FireMod));
            }
            private void SmeltItems() {
                if (_ticks % 1 != 0) return;
                for (var i = 0; i < _oven.inventory.itemList.Count; i++) {
                    var item = _oven.inventory.itemList[i];
                    if (item == null || !item.IsValid() || item.info == null) continue;
                    var cookable = item.info.GetComponent<ItemModCookable>();
                    if (cookable == null) continue;
                    if (_.IsBlackListBurnable(item.info.shortname)) continue;
                    Single temperature = item.temperature;
                    if ((temperature < cookable.lowTemp || temperature > cookable.highTemp)) {
                        if (!cookable.setCookingFlag || !item.HasFlag(global : : Item.Flag.Cooking)) continue;
                        item.SetFlag(global : : Item.Flag.Cooking, false);
                        item.MarkDirty();
                        continue;
                    }
                    if (!cookable.CanBeCookedByAtTemperature(temperature) && _.IsBlackListBurnable(item.info.shortname)) {
                        if (!cookable.setCookingFlag || !item.HasFlag(global : : Item.Flag.Cooking)) continue;
                        item.SetFlag(global : : Item.Flag.Cooking, false);
                        item.MarkDirty();
                        continue;
                    }
                    if (cookable.cookTime > 0 && _ticks * 1f / 1 % cookable.cookTime > 0) continue;
                    if (cookable.setCookingFlag && !item.HasFlag(global : : Item.Flag.Cooking)) {
                        item.SetFlag(global : : Item.Flag.Cooking, true);
                        item.MarkDirty();
                    }
                    var position = item.position;
                    if (item.amount > 1) {
                        item.amount--;
                        item.MarkDirty();
                    }
                    else {
                        item.Remove();
                    }
                    if (cookable.becomeOnCooked == null) continue;
                    var item2 = ItemManager.Create(cookable.becomeOnCooked, (int)(cookable.amountOfBecome * 1f));
                    if (item2 == null || item2.MoveToContainer(item.parent, position) || item2.MoveToContainer(item.parent)) continue;
                    item2.Drop(item.parent.dropPosition, item.parent.dropVelocity);
                    //if (!item.parent.entityOwner) continue;
                    StopCooking();
                }
            }
        }
        private static StringBuilder sb = new StringBuilder();
        private const string prefabCH47 = "assets/prefabs/npc/ch47/ch47scientists.entity.prefab";
        public string GetLang(string LangKey, string userID = null, params object[] args) {
            sb.Clear();
            if (args != null) {
                sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
                return sb.ToString();
            }
            return lang.GetMessage(LangKey, this, userID);
        }
        [ChatCommand("rates")]
        private void GetInfoMyRates(BasePlayer player) {
            if (player == null) return;
            var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
            Boolean IsTimes = IsTime();
            Configuration.PluginSettings.Rates.AllRates Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
            Single bonusRate = GetBonusRateDayOfWeek(player);
            foreach (var RatesSetting in PrivilegyRates) if (IsPermission(player.UserIDString, RatesSetting.Key)) {
                Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
                break;
            }
            SendChat(GetLang("MY_RATES_INFO", player.UserIDString, Rates.GatherRate + bonusRate, Rates.LootRate + bonusRate, Rates.PickUpRate + bonusRate, Rates.QuarryRate + bonusRate, Rates.ExcavatorRate + bonusRate, Rates.GrowableRate + bonusRate), player);
        }
        private void OnMixingTableToggle(MixingTable table, BasePlayer player) {
            if (table.IsOn()) return;
            Single speedMixing = GetSpeeedMixingTable(player);
            NextTick(() => {
                table.RemainingMixTime *= speedMixing;
                table.TotalMixTime *= speedMixing;
                table.SendNetworkUpdateImmediate();
                if (!(table.RemainingMixTime < 1f)) return;
                table.CancelInvoke(table.TickMix);
                table.Invoke(table.TickMix, table.RemainingMixTime);
            }
            );
        }
        public Int32 GetMultiplaceBurnableFuelSpeed(String ownerid) {
            Int32 Multiplace = config.pluginSettings.RateSetting.SpeedFuelBurnable;
            if (config.pluginSettings.RateSetting.UseSpeedBurnableList) {
                var SpeedInList = config.pluginSettings.RateSetting.SpeedBurableList.OrderByDescending(z => z.SpeedFuelBurnable).FirstOrDefault(x => permission.UserHasPermission(ownerid, x.Permissions));
                if (SpeedInList != null) Multiplace = SpeedInList.SpeedFuelBurnable;
            }
            return Multiplace;
        }
        private object OnPlayerAddModifiers(BasePlayer player, Item item, ItemModConsumable consumable) {
            if (!TeaModifers.ContainsKey(item.info.shortname)) return true;
            List<ModifierDefintion> mods = Pool.Get<List<ModifierDefintion>>();
            Dictionary<String, Configuration.PluginSettings.Rates.DayAnNightRate> PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
            Boolean IsTimes = IsTime();
            Configuration.PluginSettings.Rates.AllRates Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
            Configuration.PluginSettings.Rates.AllRates DefaultRates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
            Single ModiferDifference = 1.0f;
            Single DefaultRate = 1.0f;
            Single PlayerRate = 1.0f;
            foreach (var RatesSetting in PrivilegyRates) if (IsPermission(player.UserIDString, RatesSetting.Key)) Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
            Single BonusRate = GetBonusRate(player);
            ModiferTea TeaLocal = TeaModifers[item.info.shortname];
            switch (TeaLocal.Type) {
                case Modifier.ModifierType.Ore_Yield : {
                    DefaultRate = DefaultRates.GatherRate;
                    PlayerRate = Rates.GatherRate + BonusRate;
                    ModiferDifference = (PlayerRate - DefaultRate) <= 0 ? 1 : (PlayerRate - DefaultRate);
                    mods.Add(GetDefintionModifer(TeaLocal.Type, TeaLocal.Duration, TeaLocal.Value / ModiferDifference));
                    break;
                }
                case Modifier.ModifierType.Wood_Yield : {
                    DefaultRate = DefaultRates.GatherRate;
                    PlayerRate = Rates.GatherRate + BonusRate;
                    ModiferDifference = (PlayerRate - DefaultRate) <= 0 ? 1 : (PlayerRate - DefaultRate);
                    mods.Add(GetDefintionModifer(TeaLocal.Type, TeaLocal.Duration, TeaLocal.Value / ModiferDifference));
                    break;
                }
                case Modifier.ModifierType.Scrap_Yield : {
                    DefaultRate = DefaultRates.LootRate;
                    PlayerRate = Rates.LootRate + BonusRate;
                    ModiferDifference = (PlayerRate - DefaultRate) <= 0 ? 1 : (PlayerRate - DefaultRate);
                    mods.Add(GetDefintionModifer(TeaLocal.Type, TeaLocal.Duration, TeaLocal.Value / ModiferDifference));
                    break;
                }
            }
            player.modifiers.Add(mods);
            Pool.FreeUnmanaged(ref mods);
            return true;
        }
        private TriggeredEventPrefab[] defaultEvents;
        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();
        }
        private void UnSubProSub(int time = 1) {
            Unsubscribe("OnEntitySpawned");
            timer.Once(time, () => {
                Subscribe("OnEntitySpawned");
            }
            );
        }
        private void OnEntitySpawned(Minicopter copter) {
            if (copter == null) return;
            FuelSystemRating(copter.GetFuelSystem(), config.pluginSettings.OtherSetting.FuelSetting.AmountMinicopter);
            if (config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.useConsumedFuel) copter.fuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedCopter;
        }
        private void StartBreadley(Configuration.PluginSettings.OtherSettings.EventSettings EventSettings) {
            if (SpacePort == null) return;
            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();
                    if(EventSettings.BreadlaySetting.useGameTip) MessageGameTipsError("ALERT_BRADLEY");
                }
                );
            }
        }
        private void Init() => ReadData();
        int Converted(Types RateType, string Shortname, float Amount, BasePlayer player = null, String UserID = null) {
            float ConvertedAmount = Amount;
            ItemDefinition definition = ItemManager.FindItemDefinition(Shortname);
            if(definition != null && (config.pluginSettings.RateSetting.TypeList == TypeListUsed.BlackList && !IsWhiteList(Shortname))) foreach (String BlackItemCategory in config.pluginSettings.RateSetting.BlackListCategory) {
                ItemCategory Category;
                if (!Enum.TryParse(BlackItemCategory, out Category)) continue;
                if (Category == definition.category) {
                    //PrintToChat($"DEBUG : Категория {BlackItemCategory} заблокирована для множителя");
                    return Convert.ToInt32(ConvertedAmount);
                }
            }
            if (config.pluginSettings.RateSetting.TypeList == TypeListUsed.BlackList) {
                if (IsBlackList(Shortname)) return Convert.ToInt32(ConvertedAmount);
            }
            else {
                if (!IsWhiteList(Shortname)) {
                    //PrintToChat($"DEBUG : Предмет {Shortname} заблокирована для #4468837173 множителя");
                    return Convert.ToInt32(ConvertedAmount);
                }
            }
            var PrivilegyRates = config.pluginSettings.RateSetting.PrivilegyRates;
            Boolean IsTimes = IsTime();
            Configuration.PluginSettings.Rates.AllRates Rates = IsTimes ? config.pluginSettings.RateSetting.DayRates : config.pluginSettings.RateSetting.NightRates;
            UserID = player != null ? player.UserIDString : UserID;
            if (UserID != null) {
                var CustomRate = IsTimes ? config.pluginSettings.RateSetting.CustomRatesPermissions.DayRates : config.pluginSettings.RateSetting.CustomRatesPermissions.NightRates;
                var Rate = CustomRate.FirstOrDefault(x => IsPermission(UserID, x.Key));
                //dbg
                if (Rate.Value != null) foreach (Configuration.PluginSettings.Rates.PermissionsRate.PermissionsRateDetalis RateValue in Rate.Value.Where(x => x.Shortname == Shortname)) {
                    ConvertedAmount = Amount * RateValue.Rate;
                    return (int)ConvertedAmount;
                }
                foreach (var RatesSetting in PrivilegyRates) if (IsPermission(UserID, RatesSetting.Key)) {
                    Rates = IsTimes ? RatesSetting.Value.DayRates : RatesSetting.Value.NightRates;
                    break;
                }
            }
            Single BonusRate = GetBonusRate(player);
            Single bonusRateDayOfWeek = GetBonusRateDayOfWeek(player);
            BonusRate += bonusRateDayOfWeek;
            switch (RateType) {
                case Types.Gather : {
                    ConvertedAmount = Amount * (Rates.GatherRate + BonusRate);
                    break;
                }
                case Types.Loot : {
                    ConvertedAmount = Amount * (Rates.LootRate + BonusRate);
                    break;
                }
                case Types.PickUP : {
                    ConvertedAmount = Amount * (Rates.PickUpRate + BonusRate);
                    break;
                }
                case Types.Growable : {
                    ConvertedAmount = Amount * (Rates.GrowableRate + BonusRate);
                    break;
                }
                case Types.Quarry : {
                    Single QuarryRates = GetRateQuarryDetalis(Rates, Shortname);
                    ConvertedAmount = Amount * (QuarryRates + BonusRate);
                    break;
                }
                case Types.Excavator : {
                    ConvertedAmount = Amount * (Rates.ExcavatorRate + BonusRate);
                    break;
                }
                case Types.Fishing : {
                    ConvertedAmount = Amount * (Rates.FishRate + BonusRate);
                    break;
                }
            }
            return Convert.ToInt32(ConvertedAmount);
        }
        void OnQuarryGather(MiningQuarry quarry, Item item) {
            if (item == null || quarry == null) return;
            // PrintError(GetQuarryPlayer(quarry.net.ID + 27447773688).ToString() + "   " + Converted(Types.Quarry, item.info.shortname,
            //     item.amount, null, GetQuarryPlayer(quarry.OwnerID).ToString()).ToString());
            item.amount = Converted(Types.Quarry, item.info.shortname, item.amount, null, GetQuarryPlayer(quarry.net.ID.Value).ToString());
        }
        public void SendChat(String Message, BasePlayer player, ConVar.Chat.ChatChannel channel = ConVar.Chat.ChatChannel.Global) {
            if (IQChat) if (config.pluginSettings.ReferenceSettings.IQChatSetting.UIAlertUse) IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);
            else IQChat?.Call("API_ALERT_PLAYER", player, Message, config.pluginSettings.ReferenceSettings.IQChatSetting.CustomPrefix, config.pluginSettings.ReferenceSettings.IQChatSetting.CustomAvatar);
            else player.SendConsoleCommand("chat.add", channel, 0, Message);
        }
        private const string prefabPatrol = "assets/prefabs/npc/patrol helicopter/patrolhelicopter.prefab";
        /// <summary>
        /// Обновление 1.94.31
        /// - Исправлен метод удаления чинука после обновления игры
        /// - Полностью изменен метод обнаружения стандартных ивентов
        ///
        [PluginReference]
        Plugin IQChat;
        Item OnFishCatch(Item item, BaseFishingRod rod, BasePlayer player) {
            if (item == null || player == null) return null;
            Int32 Rate = Converted(Types.Fishing, item.info.shortname, item.amount, player);
            item.amount = Rate;
            return null;
        }
        private void OnEntitySpawned(BradleyAPC entity) {
            Configuration.PluginSettings.OtherSettings.EventSettings.Setting EvenTimer = config.pluginSettings.OtherSetting.EventSetting.BreadlaySetting;
            if (!EvenTimer.FullOff && !EvenTimer.UseEventCustom) return;
            NextTick(() => {
                if (entity.OwnerID != 0 || entity.skinID != 0) return;
                entity.Kill();
            }
            );
        }
        void OnEntityKill(BaseNetworkable entity) {
            if (entity == null || entity.net == null) return;
            UInt64 NetID = entity.net.ID.Value;
            if (LootersListCrateID.Contains(NetID)) LootersListCrateID.Remove(NetID);
            if (LootersSaveListCrateID.Contains(NetID)) LootersSaveListCrateID.Remove(NetID);
        }
        public List<UInt64> LootersSaveListCrateID = new List<UInt64>();
        private TOD_Time timeComponent = null;
        public enum SkipType {
            Day, Night
        }
        public class ModiferTea {
            public Modifier.ModifierType Type;
            public Single Duration;
            public Single Value;
        }
        private void OnEntitySpawned(ScrapTransportHelicopter helicopter) {
            if (helicopter == null) return;
            FuelSystemRating(helicopter.GetFuelSystem(), config.pluginSettings.OtherSetting.FuelSetting.AmountScrapTransport);
            if (config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.useConsumedFuel) helicopter.fuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedScrapTransport;
        }
        Single GetBonusRate(BasePlayer player) {
            Single Bonus = 0;
            if (player == null) return Bonus;
            if (BonusRates.TryGetValue(player, out Single bonusRate)) Bonus = bonusRate;
            return Bonus;
        }
        void OnSunset() {
            timeComponent.DayLengthInMinutes = config.pluginSettings.OtherSetting.NightTime * (24.0f / (24.0f - (TOD_Sky.Instance.SunsetTime - TOD_Sky.Instance.SunriseTime)));
            activatedDay = false;
            if (!config.pluginSettings.OtherSetting.UseSkipTime) return;
            if (config.pluginSettings.OtherSetting.TypeSkipped == SkipType.Night) TOD_Sky.Instance.Cycle.Hour = config.pluginSettings.OtherSetting.DayStart;
        }
        public enum TypeListUsed {
            WhiteList, BlackList
        }
        private void OnEntitySpawned(TrainCar trainCar) {
            if (!config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.useConsumedFuel) return;
            if (trainCar == null) return;
            StorageContainer fuelContainer = (trainCar.GetFuelSystem() as EntityFuelSystem)?.GetFuelContainer();
            if (fuelContainer == null) return;
            if (!fuelContainer.TryGetComponent<TrainEngine>(out TrainEngine trainEngine)) return;
            trainEngine.maxFuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedTrain;
        }
        private void OnServerInitialized() {
            _ = this;
            SpacePort = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("launch_site"));
            StartEvent();
            foreach (var RateCustom in config.pluginSettings.RateSetting.PrivilegyRates) Register(RateCustom.Key);
            foreach (Configuration.PluginSettings.Rates.RecyclerController.PresetRecycler presetRecycler in config.pluginSettings.RateSetting.RecyclersController.PrivilageSpeedRecycler) Register(presetRecycler.Permissions);
            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.IgnoreSpeedBurnablePrefabList.Contains("electric.furnace")) Unsubscribe(nameof(OnSwitchToggled));
            Configuration.PluginSettings.OtherSettings.EventSettings eventController = config.pluginSettings.OtherSetting.EventSetting;
            if (!config.pluginSettings.OtherSetting.FuelSetting.useAutoFillFuel && !config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.useConsumedFuel && (!eventController.BreadlaySetting.UseEventCustom && !eventController.BreadlaySetting.FullOff)) {
                Unsubscribe(nameof(OnEntitySpawned));
            }
            if(!config.pluginSettings.RateSetting.useSpeedMixingTable) Unsubscribe(nameof(OnMixingTableToggle));
            else {
                foreach (Configuration.PluginSettings.Rates.SpeedMixingTable speedMixingTable in config.pluginSettings.RateSetting.speedMixingTables) Register(speedMixingTable.Permissions);
            }
            foreach (BaseOven oven in BaseNetworkable.serverEntities.OfType<BaseOven>()) {
                if (config.pluginSettings.RateSetting.UseSpeedBurnable) {
                    if (config.pluginSettings.RateSetting.IgnoreSpeedBurnablePrefabList.Contains(oven.ShortPrefabName)) continue;
                    OvenController.GetOrAdd(oven).TryRestart();
                }
            }
            if (!config.pluginSettings.RateSetting.UseSpeedBurnable) {
                Unsubscribe(nameof(OnOvenToggle));
                Unsubscribe(nameof(OnOvenStart));
            }
            if(!config.pluginSettings.RateSetting.RecyclersController.UseRecyclerSpeed) Unsubscribe(nameof(OnRecyclerToggle));
            if(!config.pluginSettings.RateSetting.UseTeaController) Unsubscribe(nameof(OnPlayerAddModifiers));
            if (config.pluginSettings.OtherSetting.FuelSetting.useAutoFillFuel || config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.useConsumedFuel) initializeTransport = ServerMgr.Instance.StartCoroutine(InitializeTransport());
            if (config.pluginSettings.RateSetting.rateControllerDayOfWeek.useRateBonusDayOfWeek) {
                String errorValidDayOfWeek = IsValidConfigDayOfWeek();
                if (errorValidDayOfWeek != null && !String.IsNullOrWhiteSpace(errorValidDayOfWeek)) {
                    PrintWarning(LanguageEn ? $"Attention! Intersections found in days! The bonus for days of the week is disabled!{errorValidDayOfWeek}" : $"Внимание! Найдены пересечения в днях! Бонус по дням недели отключен!{errorValidDayOfWeek}");
                    return;
                }
                Puts(LanguageEn ? $"Server Information: Day of the week: {DateTime.UtcNow.DayOfWeek}.Time (hours): {DateTime.UtcNow.Hour}" : $"Серверная информация : День недели : {DateTime.UtcNow.DayOfWeek}.Время (часы) : {DateTime.UtcNow.Hour}");
                UpdateBonusStatus(true);
                timer.Every(5, () => {
                    UpdateBonusStatus();
                }
                );
            }
        }
        public List<UInt64> LootersListCrateID = new List<UInt64>();
        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;
        }
        void OnWireConnect(BasePlayer player, IOEntity entity1, int inputs, IOEntity entity2, int outputs) {
            BaseEntity parentIoEntity = entity1.GetParentEntity();
            if (parentIoEntity == null) return;
            if (parentIoEntity is not BaseOven oven) return;
            OvenController.GetOrAdd(oven).Switch(player);
        }
        private void FuelSystemRating(IFuelSystem fuelSystem, Int32 Amount) {
            if (!config.pluginSettings.OtherSetting.FuelSetting.useAutoFillFuel) return;
            if (fuelSystem == null) return;
            if (fuelSystem is not EntityFuelSystem entityFuelSystem) return;
            NextTick(() => {
                Item Fuel = entityFuelSystem.GetFuelItem();
                if (Fuel == null) return;
                if (Fuel.amount is 50 or 100) Fuel.amount = Amount;
            }
            );
        }
        private void OnNewSave(String filename) {
            DataQuarryPlayer.Clear();
            LootersSaveListCrateID.Clear();
            WriteData();
        }
        void SetTimeComponent() {
            if (!config.pluginSettings.OtherSetting.UseTime) return;
            Single hour = TOD_Sky.Instance.Cycle.Hour;
            Int32 dayStart = config.pluginSettings.OtherSetting.DayStart;
            Int32 nightStart = config.pluginSettings.OtherSetting.NightStart;
            Single dayDifference = Mathf.Abs(hour - dayStart);
            Single nightDifference = Mathf.Abs(hour - nightStart);
            if (dayDifference < nightDifference) {
                sendMessageDay = false;
                sendMessageNight = true;
            }
            else {
                sendMessageDay = true;
                sendMessageNight = false;
            }
            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();
        }
        public Dictionary<UInt64, UInt64> DataQuarryPlayer = new Dictionary<UInt64, UInt64>();
        private static Configuration config = new Configuration();
        void OnContainerDropItems(ItemContainer container) {
            if (container == null) return;
            var Container = container.entityOwner as LootContainer;
            if (Container == null) return;
            UInt64 NetID = Container.net.ID.Value;
            if (LootersListCrateID.Contains(NetID)) return;
            BasePlayer player = Container.lastAttacker as BasePlayer;
            foreach (var item in container.itemList) item.amount = Converted(Types.Loot, item.info.shortname, item.amount, player);
        }
        void API_BONUS_RATE_ADDPLAYER(BasePlayer player, Single Rate) {
            if (player == null) return;
            if (!BonusRates.ContainsKey(player)) BonusRates.Add(player, Rate);
            else BonusRates[player] = Rate;
        }
        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();
        }
        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();
                    if(EventSettings.HelicopterSetting.useGameTip) MessageGameTipsError("ALERT_HELICOPTER");
                }
                );
            }
        }
        void AddQuarryPlayer(UInt64 NetID, UInt64 userID) {
            if (DataQuarryPlayer.ContainsKey(NetID)) DataQuarryPlayer[NetID] = userID;
            else DataQuarryPlayer.Add(NetID, userID);
        }
        private void OnEntitySpawned(Snowmobile snowmobiles) {
            if (snowmobiles == null) return;
            if (config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.useConsumedFuel) snowmobiles.maxFuelPerSec = config.pluginSettings.OtherSetting.FuelConsumedTransportSetting.ConsumedSnowmobile;
        }
        private BasePlayer ExcavatorPlayer = null;
        void OnGrowableGathered(GrowableEntity plant, Item item, BasePlayer player) {
            if (item == null || player == null) return;
            item.amount = Converted(Types.Growable, item.info.shortname, item.amount, player);
        }
        private void UpdateBonusStatus(Boolean isInit = false) {
            Configuration.PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays currentRateBonusDay = GetRateBonusForCurrentTime();
            if (currentRateBonusDay != rateDayOfWeek && !isInit) {
                rateDayOfWeek = currentRateBonusDay;
                if (currentRateBonusDay != null) {
                    String startDayOfWeek = currentRateBonusDay.timeStartBonus.dayOfWeek.ToUpper();
                    String stopDayOfWeek = currentRateBonusDay.timeStopBonus.dayOfWeek.ToUpper();
                    foreach (BasePlayer player in BasePlayer.activePlayerList) {
                        SendChat(GetLang("RATE_BONUS_DAY_OF_WEEK", player.UserIDString, GetBonusRateDayOfWeek(player), GetLang(startDayOfWeek, player.UserIDString), $"{currentRateBonusDay.timeStartBonus.timeHours}:00", GetLang(stopDayOfWeek, player.UserIDString), $"{currentRateBonusDay.timeStopBonus.timeHours}:00"), player);
                    }
                }
                else {
                    foreach (BasePlayer player in BasePlayer.activePlayerList) SendChat(GetLang("RATE_BONUS_DAY_OF_WEEK_END", player.UserIDString), player);
                }
            }
        }
        bool IsTime() {
            var Settings = config.pluginSettings.OtherSetting;
            float TimeServer = TOD_Sky.Instance.Cycle.Hour;
            return TimeServer < Settings.NightStart && Settings.DayStart <= TimeServer;
        }
        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;
        }
        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        void SpawnCargo() {
            UnSubProSub();
            var cargoShip = GameManager.server.CreateEntity(prefabShip) as CargoShip;
            if (cargoShip == null) return;
            cargoShip.TriggeredEventSpawn();
            cargoShip.SendNetworkUpdate();
            cargoShip.RefreshActiveLayout();
            cargoShip.Spawn();
        }
        private class Configuration {
            [JsonProperty(LanguageEn ? "Plugin setup" : "Настройка плагина")]
            public PluginSettings pluginSettings = new PluginSettings();
            public static Configuration GetNewConfiguration() {
                return new Configuration {
                    pluginSettings = new PluginSettings {
                        ReferenceSettings = new PluginSettings.ReferencePlugin {
                            IQChatSetting = new PluginSettings.ReferencePlugin.IQChatReference {
                                CustomAvatar = "0", CustomPrefix = "[IQRates]", UIAlertUse = false,
                            }
                            ,
                        }
                        , RateSetting = new PluginSettings.Rates {
                            UseTeaController = false, UseBlackListPrefabs = false, rateControllerDayOfWeek = new PluginSettings.Rates.RateControllerDayOfWeek {
                                useRateBonusDayOfWeek = false, rateBonusDayOfWeek = new List<PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays> {
                                    new PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays {
                                        upBonusRate = 0.5f, privilageUpRates = new Dictionary<String, Single>() {
                                            ["iqrates.premium"]
                                            = 2.0f, ["iqrates.vip"] = 1.0f,
                                        }
                                        , timeStartBonus = new PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays.TimeController() {
                                            dayOfWeek = "Saturday", timeHours = 18,
                                        }
                                        , timeStopBonus = new PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays.TimeController() {
                                            dayOfWeek = "Monday", timeHours = 12,
                                        }
                                        ,
                                    }
                                    , new PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays {
                                        upBonusRate = 0.5f, privilageUpRates = new Dictionary<String, Single>() {
                                            ["iqrates.premium"]
                                            = 2.0f, ["iqrates.vip"] = 1.0f,
                                        }
                                        , timeStartBonus = new PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays.TimeController() {
                                            dayOfWeek = "Thursday", timeHours = 18,
                                        }
                                        , timeStopBonus = new PluginSettings.Rates.RateControllerDayOfWeek.RateBonusDays.TimeController() {
                                            dayOfWeek = "Friday", timeHours = 12,
                                        }
                                        ,
                                    }
                                    ,
                                }
                                ,
                            }
                            , BlackListCategory = new List<String>() {
                                "Weapon", "Ammunition", "Traps", "Attire", "Items", "Tool", "Component"
                            }
                            , WhiteList = new List<String>() {
                                "scrap", "rope", "metalblade", "propanetank", "tarp", "sewingkit", "fuse", "metalspring", "roadsigns", "sheetmetal", "gears", "riflebody", "smgbody", "semibody",
                            }
                            , TypeList = TypeListUsed.BlackList, BlackListPrefabs = new List<String>() {
                                "crate_elite", "crate_normal"
                            }
                            , UseSpeedBurnable = true, useSpeedMixingTable = false, speedMixingTables = new List<PluginSettings.Rates.SpeedMixingTable>() {
                                new PluginSettings.Rates.SpeedMixingTable() {
                                    Permissions = "iqrates.default", SpeedMixing = 0,
                                }
                                , new PluginSettings.Rates.SpeedMixingTable() {
                                    Permissions = "iqrates.vip", SpeedMixing = 20,
                                }
                                , new PluginSettings.Rates.SpeedMixingTable() {
                                    Permissions = "iqrates.premium", SpeedMixing = 50,
                                }
                                ,
                            }
                            , SpeedBurnable = 3.5f, SpeedFuelBurnable = 1, UseBlackListBurnable = false, BlackListBurnable = new List<String> {
                                "wolfmeat.cooked", "deermeat.cooked", "meat.pork.cooked", "humanmeat.cooked", "chicken.cooked", "bearmeat.cooked", "horsemeat.cooked",
                            }
                            , RecyclersController = new PluginSettings.Rates.RecyclerController {
                                UseRecyclerSpeed = false, DefaultSpeedRecycler = 5, PrivilageSpeedRecycler = new List<PluginSettings.Rates.RecyclerController.PresetRecycler> {
                                    new PluginSettings.Rates.RecyclerController.PresetRecycler {
                                        Permissions = "iqrates.recyclerhyperfast", SpeedRecyclers = 0
                                    }
                                    , new PluginSettings.Rates.RecyclerController.PresetRecycler {
                                        Permissions = "iqrates.recyclerfast", SpeedRecyclers = 3
                                    }
                                    ,
                                }
                                ,
                            }
                            , UseSpeedBurnableList = true, IgnoreSpeedBurnablePrefabList = new List<String>() {
                                "",
                            }
                            , SpeedBurableList = new List<PluginSettings.Rates.SpeedBurnablePreset> {
                                new PluginSettings.Rates.SpeedBurnablePreset {
                                    Permissions = "iqrates.vip", SpeedBurnable = 5.0f, SpeedFuelBurnable = 20,
                                }
                                , new PluginSettings.Rates.SpeedBurnablePreset {
                                    Permissions = "iqrates.speedrun", SpeedBurnable = 55.0f, SpeedFuelBurnable = 20,
                                }
                                , new PluginSettings.Rates.SpeedBurnablePreset {
                                    Permissions = "iqrates.fuck", SpeedBurnable = 200f, SpeedFuelBurnable = 20,
                                }
                                ,
                            }
                            , DayRates = new PluginSettings.Rates.AllRates {
                                GatherRate = 1.0f, LootRate = 1.0f, PickUpRate = 1.0f, GrowableRate = 1.0f, QuarryRate = 1.0f, FishRate = 1.0f, QuarryDetalis = new PluginSettings.Rates.AllRates.QuarryRateDetalis {
                                    UseDetalisRateQuarry = false, ShortnameListQuarry = new Dictionary<String, Single>() {
                                        ["metal.ore"]
                                        = 10, ["sulfur.ore"] = 5
                                    }
                                }
                                , ExcavatorRate = 1.0f, CoalRare = 10,
                            }
                            , NightRates = new PluginSettings.Rates.AllRates {
                                GatherRate = 2.0f, LootRate = 2.0f, PickUpRate = 2.0f, GrowableRate = 2.0f, QuarryRate = 2.0f, FishRate = 2.0f, QuarryDetalis = new PluginSettings.Rates.AllRates.QuarryRateDetalis {
                                    UseDetalisRateQuarry = false, ShortnameListQuarry = new Dictionary<String, Single>() {
                                        ["metal.ore"]
                                        = 10, ["sulfur.ore"] = 5
                                    }
                                }
                                , 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",
                                        }
                                    }
           
// ... [Code preview truncated due to length. Full source in attached file] ...

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