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

FREE IQAlcoholFarm : 1.3.34 1.3.34

Нет прав для скачивания
C#:
using Network;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Rust;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using Facepunch;
using UnityEngine;
using UnityEngine.Networking;
using VLB;

namespace Oxide.Plugins
{
    [Info("IQAlcoholFarm", "BadMandarin / Support: Mercury", "1.3.34")]
    [Description("IQAlcoholFarm")]
    internal class IQAlcoholFarm : RustPlugin
    {
        private Boolean FullLoadedNPC = false;
        private const Boolean LanguageEn = true;
        private enum CategoryType
        {
            Equipment,
            Exchanger,
        }

        #region Reference
        [PluginReference] private readonly Plugin TruePVE, NextGenPVE, Imperium, StackModifier;
        private Boolean IsPVE()
        {
            return TruePVE != null || NextGenPVE != null || Imperium != null;
        }

        #endregion

        #region Classes

        private class DrunkPlayer
        {
            public UInt64 UserId = 0;

            [JsonIgnore] private Boolean _playerFound = false;
            [JsonIgnore] private BasePlayer _player;

            [JsonIgnore]
            public BasePlayer Player
            {
                get
                {
                    if (_playerFound == false)
                    {
                        _player = BasePlayer.activePlayerList.FirstOrDefault(x => x != null && x.userID == UserId);
                        if (_player != null)
                        {
                            _playerFound = true;
                        }
                        else
                        {
                            _data.DrunkPlayers.Remove(this);
                        }
                    }

                    return _player;
                }
            }
            public String CurrectColor = AlcoholColorGradient[0];
            public String CurrectFade = AlcoholBlur[0];
            public Single ModifiersUpdate = 0;

            public Single DrunkRemaining = 0;
        }

        #endregion

        #region Variables
        private static IQAlcoholFarm _plugin;

        private static MonumentInfo Compound;
        private static MonumentInfo BanditTown;
        private static MonumentInfo Airfield;

        private const String SignImgLeft = "https://i.postimg.cc/90dJ8Z73/left.png";
        private const String SignImgRight = "https://i.postimg.cc/T1MtJChq/right.png";

        private readonly List<BaseEntity> MonumentEntities = new List<BaseEntity>();

        private class Point
        {
            public String Name;
            public Vector3 Pos;
            public Single Y;
            public Single X;
            public String LinkImage;
        }

        private readonly Dictionary<String, List<Point>> PointsList = new Dictionary<String, List<Point>>
        {
            ["COMPOUND"] = new List<Point>
            {
                new Point
                {
                    Name = "NPC.POINT",
                    Y = 0f,
                    X = 0f,
                    Pos = new Vector3(21.7f, 0.3f, 7.4f),
                    LinkImage = String.Empty,
                },
                new Point
                {
                    Name = "TABLES.POINT",
                    Y = -90f,
                    X = 30f,
                    Pos = new Vector3(17.9f, 0.3f, 11f),
                    LinkImage = SignImgLeft,
                },
                new Point
                {
                    Name = "TABLES.POINT",
                    Y = 0,
                    X = 0f,
                    Pos = new Vector3(3.7f, 3f, 16.2f),
                    LinkImage = SignImgLeft,
                },
            },
            ["BANDIT_TOWN"] = new List<Point>
            {
                new Point
                {
                    Name = "NPC.POINT",
                    Y = 180f,
                    X = 0f,
                    Pos = new Vector3(-28.8f, 1.78f, 35f),
                    LinkImage = String.Empty,
                },
                new Point
                {
                    Name = "TABLES.POINT",
                    Y = 180f,
                    X = 0,
                    Pos = new Vector3(-24.8f, 3.78f, 35.5f),
                    LinkImage = SignImgLeft,
                },
            },
            ["AIRFIELD"] = new List<Point>
            {
                new Point
                {
                    Name = "NPC.POINT",
                    Y = 200f,
                    X = 0f,
                    Pos = new Vector3(-10.5f, 3.31f, -93.3f),
                    LinkImage = String.Empty,
                },
                new Point
                {
                    Name = "TABLES.POINT",
                    Y = 0f,
                    X = 0f,
                    Pos = new Vector3(-7.5f, 2.8f, -75.8f),
                    LinkImage = SignImgLeft,
                },
                new Point
                {
                    Name = "TABLES.POINT",
                    Y = -90f,
                    X = 0f,
                    Pos = new Vector3(-0.86f, 4.5f, -92f),
                    LinkImage = SignImgLeft,
                },
                new Point
                {
                    Name = "TABLES.POINT",
                    Y = -30f,
                    X = 30f,
                    Pos = new Vector3(-59.3f, 0.3f, -72.7f),
                    LinkImage = SignImgLeft,
                },
                new Point
                {
                    Name = "TABLES.POINT",
                    Y = 180f,
                    X = 13f,
                    Pos = new Vector3(-154.5f, 0.22f, -76.8f),
                    LinkImage = SignImgRight,
                },
            },
        };

        private const String AlcoholConsumeEffect = "assets/bundled/prefabs/fx/gestures/drink_vomit.prefab";
        private const String AlcoholWortProcessEffect = "assets/bundled/prefabs/fx/animals/flies/flies_medium.prefab";

        private readonly String[] AlcoholShakeEffect = new[]
        {
            "assets/bundled/prefabs/fx/takedamage_generic.prefab",
            "assets/bundled/prefabs/fx/screen_land.prefab",
            "assets/bundled/prefabs/fx/screen_jump.prefab",
            "assets/prefabs/tools/jackhammer/effects/strike_screenshake.prefab",
            "assets/prefabs/weapons/cake/effects/strike_screenshake.prefab",
            "assets/prefabs/weapons/halloween/butcher knife/effects/strike_screenshake.prefab",
            "assets/prefabs/weapons/halloween/pitchfork/effects/strike_screenshake.prefab",
            "assets/prefabs/weapons/halloween/sickle/effects/strike_screenshake.prefab",
            "assets/prefabs/weapons/hatchet/effects/strike_screenshake.prefab",
            "assets/prefabs/weapons/knife/effects/strike_screenshake.prefab",
            "assets/bundled/prefabs/fx/player/drown.prefab",

        };

        private static readonly String[] AlcoholColorGradient = new[]
        {
            "#FFFFFF",
            "#F7D358",
            "#FAAC58",
            "#FA8258",
            "#FA5858",
            "#B40404",
        };

        private static readonly String[] AlcoholBlur = new[]
        {
            "0 0 0 0.05",
            "0 0 0 0.07",
            "0 0 0 0.10",
            "0 0 0 0.12",
            "0 0 0 0.15",
            "0 0 0 0.2",
        };


        #region SoundList

        public Dictionary<String, List<Byte[]>> RenderSounds = new Dictionary<string, List<byte[]>>()
        {
            ["welcome"] = new List<byte[]> { },
            ["bye"] = new List<byte[]> { },
        };

        private void GetSounds()
        {
            if (!_config.UseNPCSounds) return;
            timer.Once(3f, () =>
            {
                if (RenderSounds.Values != null && RenderSounds.Values.Count != 0) return;
                PrintWarning(LanguageEn ? "Loading sounds.." : "Загружаем звуки..");
                try
                {
                    webrequest.Enqueue($"https://iqsystem.skyplugins.ru/iqalcohol/getsound/W5fgSD3dfVBxc", null, (code, response) =>
                    {
                        switch (code)
                        {
                            case 404:
                                {
                                    PrintError($"ERROR #63445485  {response} | ERROR #:545445  (Discord - Mercury#5212)"); 
                                    _initiated = false;
                                    break;
                                }
                            case 503:
                                {
                                    PrintError($"ERROR #45445 Your plugin version is outdated!Upgrade to the latest version! (Discord - Mercury#5212)");
                                    _initiated = false;
                                    break;
                                }
                            case 200:
                                {
                                    Dictionary<String, List<Byte[]>> obj = JsonConvert.DeserializeObject<Dictionary<String, List<Byte[]>>>(response);
                                    RenderSounds = obj;
                                    WriteData();

                                    PrintWarning(LanguageEn ? "Successful data acquisition" : "Звук успешно создан!");

                                    break;
                                }
                            default:
                                {
                                    PrintWarning($"HTTP {code}: Failed to load sounds. Continuing without sounds...");
                                    _initiated = true; // Continue initialization without sounds
                                    break;
                                }
                        }
                    }, this, RequestMethod.GET);
                }
                catch (Exception e)
                {
                    PrintError($"ERROR #8573 Network error while loading sounds: {e.Message}");
                    PrintWarning("Continuing without sounds...");
                    _initiated = true; // Continue initialization without sounds
                }
                PrintWarning(LanguageEn ? "Sounds uploaded successfully.." : "Звуки загружены успешно..");
            });
        }


        #endregion

        #endregion

        #region OxideHooks

        private void Init() => ReadData();
        
        private void OnPluginUnloaded(Plugin name)
        {
            if (StackModifier != null && name.Name == StackModifier.Name)
            {
                Subscribe(nameof(OnItemSplit));
                Subscribe(nameof(CanCombineDroppedItem));
                Subscribe(nameof(CanStackItem));
                Subscribe(nameof(OnItemAddedToContainer));
                Subscribe(nameof(OnItemRemovedFromContainer));
            }
        }
        
        private void OnPluginLoaded(Plugin name)
        {
            if (StackModifier != null && name.Name == StackModifier.Name)
            {
                Unsubscribe(nameof(OnItemSplit));
                Unsubscribe(nameof(CanCombineDroppedItem));
                Unsubscribe(nameof(CanStackItem));
                Unsubscribe(nameof(OnItemAddedToContainer));
                Unsubscribe(nameof(OnItemRemovedFromContainer));
            }
        }
        
        private void OnServerInitialized()
        {
            if (StackModifier is { IsLoaded: true })
            {
                Unsubscribe(nameof(OnItemSplit));
                Unsubscribe(nameof(CanCombineDroppedItem));
                Unsubscribe(nameof(CanStackItem));
                Unsubscribe(nameof(OnItemAddedToContainer));
                Unsubscribe(nameof(OnItemRemovedFromContainer));
            }
            
            _plugin = this;

            BanditTown = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("bandit_town"));
            Compound = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("compound"));
            Airfield = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("airfield"));

            if (_config.itemSettings.AlcoholBottleSkinId == 0)
            {
                Unsubscribe(nameof(OnItemAddedToContainer));
                Unsubscribe(nameof(OnItemRemovedFromContainer));
            }

            if (IsPVE())
                Unsubscribe(nameof(OnEntityTakeDamage));

            StartPluginLoad();
        }

        private void OnServerSave()
        {
            PluginData.SaveData();
        }

        private void Unload()
        {
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQSystem/IQAlcoholFarm/CustomPosNPC", CustomPosNPC, true);
            PluginData.SaveData();
            DestroyControllers();
            lootPlayerContainers.Clear();
            
            if (_data is { DrunkPlayers: not null })
            {
                for (Int32 i = _data.DrunkPlayers.Count - 1; i >= 0; i--)
                {
                    DrunkPlayer drunkPlayer = _data.DrunkPlayers[i];
                    if (drunkPlayer != null && drunkPlayer.Player != null)
                        DestroyAllUi(drunkPlayer.Player);
                }

                _data.DrunkPlayers.Clear();
            }

            foreach(CustomNpcController npcController in NPCList)
                UnityEngine.Object.DestroyImmediate(npcController);
            
            foreach (BaseEntity ent in MonumentEntities.Where(x => !x.IsDestroyed))
                ent.Kill();

            InterfaceBuilder.DestroyAll();

            ImageUi.Unload();

            MonumentEntities.Clear();
            BanditTown = null;
            Compound = null;
            Airfield = null;
            _plugin = null;
        }

        object OnItemAction(Item item, string action, BasePlayer player)
        {
            if(action.Equals("consume") && item.skin != 0)
                foreach(PluginConfig.ShopStore.CategorySettings.ItemsPair ItemPair in _config.storeNpc.EquipmentCategory.ItemsList)
                    if (ItemPair.BuyItems.SkinID == item.skin && ItemPair.BuyItems.Shortname.Equals(item.info.shortname))
                        return false;

            return null;
        }
        private System.Object CanBradleyApcTarget(BradleyAPC apc, BaseEntity entity)
        {
            if (_initiated == false)
                return null;

            if (apc == null || entity == null) return null;

            foreach (BradleyAPC.TargetInfo Targets in apc.targetList.Where(ent => ent.entity != null && ent.entity.OwnerID == 199949458))
                NextTick(() => { apc.targetList.Remove(Targets); });

            return null;
        }

        private System.Object OnNpcTarget(BaseAnimalNPC animal, BasePlayer target)
        {
            if (_initiated == false)
                return null;

            if (animal == null || target == null) return null;
            if (target.OwnerID == 199949458)
                return false;
            return null;
        }

        private System.Object CanLootEntity(BasePlayer player, StorageContainer container)
        {
            if (_initiated == false)
                return null;

            if (container.skinID == 23129547)
            {
                DrawUI_Trade_Main(player);
                return false;
            }
            return null;
        }
        private System.Object OnEntityTakeDamage(BaseEntity entity, HitInfo info)
        {
            if (_initiated == false)
                return null;

            if (info == null || entity == null)
                return null;
            if (entity.OwnerID == 199949458) return false;
            return null;
        }

        private void OnPlayerDisconnected(BasePlayer player, String reason)
        {
            if (_initiated == false)
                return;

            _data.DrunkPlayers.RemoveAll(x => x.Player.userID == player.userID);
            DestroyAllUi(player);
        }
        private Item OnItemSplit(Item item, int amount)
        {
            if (_initiated == false)
                return null;

            if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) return null;
            if(item.info.shortname == "smallwaterbottle" && _config.itemSettings.AlcoholBottleSkinId == item.skin)
            {
                Item x = ItemManager.CreateByPartialName(item.info.shortname, amount);
                x.skin = _config.itemSettings.AlcoholBottleSkinId;
                x.amount = amount;
                item.amount -= amount;
                item.MarkDirty();
                return x;
            }

            if (item.info.shortname == _config.BarrelItem.ShortName && _config.BarrelItem.SkinId == item.skin)
            {
                Item x = ItemManager.CreateByPartialName(item.info.shortname, amount);
                x.name = _config.BarrelItem.DisplayName;
                x.skin = _config.BarrelItem.SkinId;
                x.amount = amount;
                item.amount -= amount;
                item.MarkDirty();
                return x;
            }

            return null;
        }
        object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem)
        {
            if (_initiated == false)
                return null;

            if (item.GetItem().skin != targetItem.GetItem().skin) return false;

            return null;
        }
        object CanStackItem(Item item, Item targetItem)
        {
            if (_initiated == false)
                return null;

            if (item.skin != targetItem.skin) return false;

            return null;
        }
        private void OnPlayerDeath(BasePlayer player, HitInfo info)
        {
            if (_initiated == false)
                return;

            _data.DrunkPlayers.RemoveAll(x => x.Player.userID == player.userID);
            DestroyAllUi(player);
        }

        private void OnEntitySpawned(WaterPurifier entity)
        {
            if (_initiated == false)
                return;

            if (entity is PoweredWaterPurifier)
                return;

            entity.maxStackSize = _config.fermentationSettings.PurifierCapacity;
        }

        private void OnEntityBuilt(Planner plan, GameObject go)
        {
            if (_initiated == false)
                return;

            BaseEntity entity = go.ToBaseEntity();
            if (entity == null)
                return;

            if (entity.skinID == _config.BarrelItem.SkinId)
            {
                SetupBarrel(entity);
                return;
            }
        }

        private void SetupBarrel(BaseEntity entity)
        {
            BaseEntity stashEntity = GameManager.server.CreateEntity("assets/prefabs/deployable/small stash/small_stash_deployed.prefab");
            if (stashEntity == null)
            {
                PrintError("Failed to spawn small stash on barrel!");
                return;
            }
            
            stashEntity.Spawn();
            stashEntity.SetParent(entity, false);

            stashEntity.transform.localPosition += new Vector3(-0.365f, 1.14f, 0.42f);
            stashEntity.transform.localRotation = Quaternion.Euler(new Vector3(90f, 0f, 0));
            
            entity.gameObject.AddComponent<BarrelController>();
        }
        
        private object OnWireConnect(BasePlayer player, IOEntity entity1, Int32 inputs, IOEntity entity2, Int32 outputs)
        {
            if (_initiated == false)
                return null;

            LiquidContainer liquid1 = entity1 as LiquidContainer;
            if (liquid1 != null)
            {
                Item item1 = liquid1.inventory.GetSlot(0);
                if (item1 != null && item1.skin != 0)
                    return false;
            }

            LiquidContainer liquid2 = entity2 as LiquidContainer;
            if (liquid2 != null)
            {
                Item item2 = liquid2.inventory.GetSlot(0);
                if (item2 != null && item2.skin != 0)
                    return false;
            }

            if (BarrelController.ActiveControllersIds.Exists(x => x == entity1.net.ID.Value || x == entity2.net.ID.Value))
                return false;

            return null;
        }

        private Dictionary<UInt64, BasePlayer> lootPlayerContainers = new Dictionary<UInt64, BasePlayer>();
        void OnLootEntity(BasePlayer player, IOEntity entity) => lootPlayerContainers[entity.net.ID.Value] = player;
        
        private ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, Int32 targetPos)
        {
            if (_initiated == false)
                return null;
            
            Item item1 = container.GetSlot(0);

            if (item.skin != 0 && (item.info.shortname.Equals("water") || item.info.shortname.Equals("water.salt")))
            {
                if (container.GetEntityOwner() is IOEntity ioEntity)
                {
                    lootPlayerContainers.TryGetValue(ioEntity.net.ID.Value, out BasePlayer player);
                    
                    foreach (IOEntity.IOSlot ioInptut in ioEntity.inputs)
                    {
                        if (ioInptut.connectedTo.Get())
                        {
                            if (player)
                                SendReply(player, GetLang("CHAT_MESSAGE_NO_CONNECTED_WIRE", player.UserIDString));
                            return ItemContainer.CanAcceptResult.CannotAccept;
                        }
                    }
                    
                    foreach (IOEntity.IOSlot ioOutput in ioEntity.outputs)
                    {
                        if (ioOutput.connectedTo.Get())
                        {
                            if (player)
                                SendReply(player, GetLang("CHAT_MESSAGE_NO_CONNECTED_WIRE", player.UserIDString));
                            return ItemContainer.CanAcceptResult.CannotAccept;
                        }
                    }
                }
            }
            
            if (container.GetEntityOwner() != null && container.GetEntityOwner() is PaddlingPool)
            {
                if(item.skin != 0)
                    return ItemContainer.CanAcceptResult.CannotAccept; 
            }
            
            if (item1 != null && item.info.shortname.Equals("water") && item1.info.shortname.Equals("water") &&
                item1.skin != 0 && item.skin == 0)
            {
                return ItemContainer.CanAcceptResult.CannotAccept;
            }
            
            if (item1 != null && item.info.shortname.Equals("water.salt") && item1.info.shortname.Equals("water.salt") &&
                item1.skin != 0 && item.skin == 0)
            {
                return ItemContainer.CanAcceptResult.CannotAccept;
            }
            
            if (item.skin != _config.itemSettings.AlcoholItemSkinId && item.skin != _config.itemSettings.WortItemSkinId)
            {
                return null;
            }
            
            return null;
        }
        

        private System.Object OnWaterPurify(WaterPurifier waterPurifier, Single timeCooked)
        {
            if (_initiated == false)
                return null;

            Item item = waterPurifier.inventory.GetSlot(0);
            if (item == null)
                return null;

            if (item.skin == _config.itemSettings.AlcoholItemSkinId)
                return false;

            if (item.skin != _config.itemSettings.WortItemSkinId)
            {
                Item outputItem = waterPurifier.purifiedWaterStorage.inventory.GetSlot(0);
                if (outputItem != null && outputItem.skin != 0)
                    return false;

                return null;
            }

            ConvertWort(waterPurifier, timeCooked);
            return false;
        }

        private System.Object OnWaterCollect(WaterCatcher waterCatcher)
        {
            if (_initiated == false)
                return null;
            
            Item item = waterCatcher.inventory.GetSlot(0);
            if (item == null)
                return null;

            if (item.skin == _config.itemSettings.AlcoholItemSkinId || item.skin == _config.itemSettings.WortItemSkinId)
            {
                return false;
            }

            return null;
        }

        private System.Object OnLiquidVesselFill(BaseLiquidVessel liquidVessel, BasePlayer player, LiquidContainer facingLiquidContainer)
        {
            if (_initiated == false)
                return null;
            
            Item item = liquidVessel.GetItem()?.contents?.GetSlot(0);
            if (item == null)
                return null;
            
            if (item.skin == _config.itemSettings.AlcoholItemSkinId || item.skin == _config.itemSettings.WortItemSkinId)
            {
                return false;
            }

            return null;
        }

        private System.Object CanHideStash(BasePlayer player, StashContainer stash)
        {
            if (_initiated == false)
                return null;

            if (BarrelController.ActiveControllers.Exists(x => x.GetStashId() == stash.net.ID.Value))
                return false;

            return null;
        }

        private void ConvertWort(WaterPurifier waterPurifier, Single timeCooked)
        {
            if (_initiated == false)
                return;

            Item storageSlot = waterPurifier.purifiedWaterStorage.inventory.GetSlot(0);
            if (storageSlot != null && storageSlot.amount >= waterPurifier.purifiedWaterStorage.maxStackSize)
                return;

            Single single = timeCooked * (_config.fermentationSettings.PurifierProcessTick / 60f);
            waterPurifier.dirtyWaterProcssed += single;
            if (waterPurifier.dirtyWaterProcssed >= 1f)
            {
                Item item = waterPurifier.inventory.GetSlot(0);
                Int32 num = Mathf.Min(Mathf.FloorToInt(waterPurifier.dirtyWaterProcssed), item.amount);
                single = num;
                item.amount -= num;
                if (item.amount <= 0)
                {
                    item.RemoveFromContainer();
                    item.Remove();
                }
                item.MarkDirty();
                waterPurifier.dirtyWaterProcssed -= num;
                waterPurifier.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
            }

            waterPurifier.pendingFreshWater = waterPurifier.pendingFreshWater + single / _config.fermentationSettings.PurifierProcessRatio;
            if (waterPurifier.pendingFreshWater >= 1f)
            {
                Int32 num1 = Mathf.FloorToInt(waterPurifier.pendingFreshWater);
                waterPurifier.pendingFreshWater -= num1;
                storageSlot = waterPurifier.purifiedWaterStorage.inventory.GetSlot(0);
                if (storageSlot != null && storageSlot.skin != _config.itemSettings.AlcoholItemSkinId)
                {
                    storageSlot.RemoveFromContainer();
                    storageSlot.Remove(0f);
                }
                if (storageSlot != null)
                {
                    storageSlot.amount += num1;
                    storageSlot.amount = Mathf.Clamp(storageSlot.amount, 0, waterPurifier.purifiedWaterStorage.maxStackSize);
                    waterPurifier.purifiedWaterStorage.inventory.MarkDirty();
                }
                else
                {   
                    //old water //TODO:!
                    Item item1 = ItemManager.CreateByName("water.salt", num1, _config.itemSettings.AlcoholItemSkinId);
                    if (!item1.MoveToContainer(waterPurifier.purifiedWaterStorage.inventory, -1, true, false))
                    {
                        item1.Remove(0f);
                    }
                }
                waterPurifier.purifiedWaterStorage.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
            }
        }

        private void OnItemAddedToContainer(ItemContainer container, Item item)
        {
            if (_initiated == false)
                return;
            
            if (container == null)
                return;

            if (container.parent == null)
                return;

            if (item.skin != _config.itemSettings.AlcoholItemSkinId)
                return;

            if (container.parent.info.shortname != "smallwaterbottle")
                return;

            container.parent.skin = _config.itemSettings.AlcoholBottleSkinId;
        }

        private void OnItemRemovedFromContainer(ItemContainer container, Item item)
        {
            if (_initiated == false)
                return;

            if (item.skin != _config.itemSettings.AlcoholItemSkinId)
                return;

            if (container == null)
                return;

            if (container.parent == null)
                return;

            if (container.parent.skin != _config.itemSettings.AlcoholBottleSkinId)
                return;

            container.parent.skin = 0;
        }

        private System.Object OnPlayerAddModifiers(BasePlayer player, Item item, ItemModConsumable consumable)
        {
            if (item.skin == _config.itemSettings.AlcoholItemSkinId)
            {
                Int32 oldAmount = item.amount;
                NextTick(() =>
                {
                    Int32 consumed = Math.Abs(item.amount - oldAmount);
                    OnAlcoholDrink(player, item, consumed);
                });
                return false;
            }

            if (item.skin == _config.itemSettings.WortItemSkinId)
            {
                ExecuteNegativeEffect(player);
                return false;
            }
            return null;
        }


        private void OnAlcoholDrink(BasePlayer player, Item item, Int32 amountToUse)
        {
            if (_initiated == false)
                return;

            Single time = (amountToUse * _config.drinkedSettings.AlcoholDrinkTime) / _config.drinkedSettings.AlcoholDrinkAmount;

            DrunkPlayer drunkPlayer = _data.DrunkPlayers.Find(x => x.Player.userID == player.userID);
            if (drunkPlayer == null)
            {
                drunkPlayer = new DrunkPlayer
                {
                    UserId = player.userID
                };
                drunkPlayer.DrunkRemaining += 5f;
                _data.DrunkPlayers.Add(drunkPlayer);

                DrawUI_DrunkBlock(player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
                DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);

                if (_data.DrunkPlayers.Count == 1)
                    ServerMgr.Instance.StartCoroutine(PlayersUpdate());
            }

            Int32 index = GetIndexFromGradient(AlcoholColorGradient.Length, (Int32)drunkPlayer.DrunkRemaining, (Int32)_config.drinkedSettings.AlcoholDrinkLimit);
            String color = AlcoholColorGradient[index];

            if (color != drunkPlayer.CurrectColor)
            {
                drunkPlayer.CurrectColor = color;
                DrawUI_DrunkBlock(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
            }

            color = AlcoholBlur[index];

            if (color != drunkPlayer.CurrectFade)
            {
                drunkPlayer.CurrectFade = color;
                DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);
            }

            drunkPlayer.DrunkRemaining += time;

            DrawUI_DrunkTimer(player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);

            UpdateModifiers(drunkPlayer);

            if (drunkPlayer.DrunkRemaining >= _config.drinkedSettings.AlcoholDrinkLimit)
            {
                drunkPlayer.Player.modifiers.RemoveAll();
                ExecuteNegativeEffect(player);
            }
        }

        private void UpdateModifiers(DrunkPlayer drunkPlayer)
        {
            List<ModifierDefintion> modifiersToAdd = new List<ModifierDefintion>();
            for (Int32 i = 0; i < _config.ModifierDefintions.Count; i++)
            {
                ModifierDefintionConfig modif = _config.ModifierDefintions[i];
                if (modif.MinTime > drunkPlayer.DrunkRemaining)
                    continue;

                if (drunkPlayer.ModifiersUpdate < modif.MinTime)
                    drunkPlayer.ModifiersUpdate = modif.MinTime;

                ModifierDefintion modifDef = modif.GetDef();
                modifDef.duration = drunkPlayer.DrunkRemaining;
                modifiersToAdd.Add(modifDef);

            }

            if (modifiersToAdd.Count < 1)
                return;

            drunkPlayer.Player.modifiers.Add(modifiersToAdd);
        }

        private void ExecuteNegativeEffect(BasePlayer player)
        {
            Vector3 vector3 = (player.IsDucked() ? new Vector3(0f, 1f, 0f) : new Vector3(0f, 2f, 0f));
            EffectNetwork.Send(new Effect(AlcoholConsumeEffect, player, 0, vector3, Vector3.zero, null), player.net.connection);
            EffectNetwork.Send(new Effect(AlcoholShakeEffect.GetRandom(), vector3, Vector3.zero), player.net.connection);

            player.Hurt(_config.drinkedSettings.AlcoholDrunkNegativeDamage);
            player.metabolism.calories.Subtract(_config.drinkedSettings.AlcoholDrunkNegativeCalories);
            player.metabolism.hydration.Subtract(_config.drinkedSettings.AlcoholDrunkNegativeHydration);
        }

        private IEnumerator PlayersUpdate(Boolean afterReload = false)
        {
            while (_data.DrunkPlayers.Count > 0)
            {
                try
                {
                    for (Int32 i = _data.DrunkPlayers.Count - 1; i >= 0; i--)
                    {
                        DrunkPlayer drunkPlayer = _data.DrunkPlayers[i];
                        if (--drunkPlayer.DrunkRemaining <= 0)
                        {
                            _data.DrunkPlayers.Remove(drunkPlayer);
                            DestroyAllUi(drunkPlayer.Player);
                            continue;
                        }

                        if (afterReload)
                        {
                            DrawUI_DrunkBlock(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
                            DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);
                        }

                        Int32 index = GetIndexFromGradient(AlcoholColorGradient.Length, (Int32)drunkPlayer.DrunkRemaining, (Int32)_config.drinkedSettings.AlcoholDrinkLimit);
                        String color = AlcoholColorGradient[index];

                        if (color != drunkPlayer.CurrectColor)
                        {
                            drunkPlayer.CurrectColor = color;
                            DrawUI_DrunkBlock(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);
                        }

                        color = AlcoholBlur[index];

                        if (color != drunkPlayer.CurrectFade)
                        {
                            drunkPlayer.CurrectFade = color;
                            DrawUI_DrunkAFade(drunkPlayer.Player, drunkPlayer.CurrectFade);
                        }

                        if (drunkPlayer.DrunkRemaining >= _config.drinkedSettings.AlcoholDrinkLimit)
                        {
                            if (Core.Random.Range(0, 100) <= _config.drinkedSettings.AlcoholDrunkNegativeChance)
                                ExecuteNegativeEffect(drunkPlayer.Player);
                        }
                        else
                        {
                            drunkPlayer.Player.Heal(_config.drinkedSettings.AlcoholDrunkHeal);
                        }

                        if (drunkPlayer.ModifiersUpdate > drunkPlayer.DrunkRemaining)
                            UpdateModifiers(drunkPlayer);

                        drunkPlayer.Player.metabolism.temperature.SetValue(40f);
                        DrawUI_DrunkTimer(drunkPlayer.Player, drunkPlayer.CurrectColor, drunkPlayer.DrunkRemaining);

                        if (Core.Random.Range(0, 100) <= _config.RareEffect)
                            EffectNetwork.Send(new Effect(AlcoholShakeEffect.GetRandom(), drunkPlayer.Player.transform.position, Vector3.zero), drunkPlayer.Player.net.connection);
                    }
                }
                catch (Exception)
                {
                    //PrintError(e.ToString());
                }

                afterReload = false;
                yield return new WaitForSeconds(1f);
            }
            
            yield break;
        }

        private Int32 GetIndexFromGradient(Int32 length, Int32 amount, Int32 capacity)
        {
            if (capacity < amount)
                amount = capacity;

            Int32 index = length * amount / (capacity <= 0 ? 1 : capacity);
            if (index == 0) index++;
            return index - 1;
        }

        #endregion

        #region Commands

        [ConsoleCommand("func.alcohol")]
        private void FuncionalCommad(ConsoleSystem.Arg arg)
        {
            BasePlayer player = arg.Player();
            if (player == null) return;

            String Funcion = arg.Args[0];

            switch (Funcion)
            {
                case "category": 
                    {
                        String Action = arg.Args[1];
                        CategoryType Category = (CategoryType)Enum.Parse(typeof(CategoryType), arg.Args[2]);

                        switch (Action)
                        {
                            case "select":
                                {
                                    DrawUI_ItemPanel(player, Category);
                                    DrawUI_PanelCategory(player, Category);
                                    break;
                                }
                            case "page":
                                {
                                    String ActionPage = arg.Args[3];
                                    Int32 Page = Int32.Parse(arg.Args[4]);
                                    switch (ActionPage)
                                    {
                                        case "next":
                                            {
                                                DrawUI_ItemPanel(player, Category, Page + 1);
                                                break;
                                            }
                                        case "back":
                                            {
                                                DrawUI_ItemPanel(player, Category, Page - 1);
                                                break;
                                            }
                                    }
                                    break;
                                }
                            case "selling": //
                                {
                                    String ActionSelling = arg.Args[3];
                                    Int32 Y = Int32.Parse(arg.Args[4]);
                                    Int32 Page = Int32.Parse(arg.Args[5]);
                                    Int32 Amount = Int32.Parse(arg.Args[6]);
                                    if (Amount == 0) return;

                                    List<PluginConfig.ShopStore.CategorySettings.ItemsPair> CategoryItems = Category == CategoryType.Equipment ? _config.storeNpc.EquipmentCategory.ItemsList : _config.storeNpc.ExchangerCategory.ItemsList;
                                    PluginConfig.ShopStore.CategorySettings.ItemsPair CategoryItem = CategoryItems.Skip(Page * 5).Take(5).ToList()[Y];

                                    switch (ActionSelling)
                                    {
                                        case "amount.next":
                                            {
                                                DrawUI_Items_AmountController(player, Y, CategoryItem, Page, Amount + 1, Category);
                                                break;
                                            }
                                        case "amount.back":
                                            {
                                                if (Amount - 1 <= 0) return;
                                                DrawUI_Items_AmountController(player, Y, CategoryItem, Page, Amount - 1, Category);
                                                break;
                                            }
                                        case "amount.buy":
                                            {
                                                BuyItem(player, CategoryItem, Category, Page, Amount);
                                                break;
                                            }
                                    }
                                    break;
                                }
                        }
                        break;
                    }
            }
        }

        [ConsoleCommand("barrel.add")]
        private void Console_BarrelAdd(ConsoleSystem.Arg arg)
        {
            if (!arg.IsAdmin) return;

            BasePlayer player = arg.Player();
            
            if (arg.Args == null || arg.Args.Length < 1)
            {
                if (player == null) Puts("Wrong syntax! Usage: barrel.add <SteamID:Name:IP>");
                else player.ConsoleMessage("Wrong syntax! Usage: barrel.add <SteamID:Name:IP>");
                return;
            }
            
            String playerid = arg.Args[0];
            BasePlayer basePlayer = BasePlayer.Find(playerid);
            
            if (basePlayer == null)
            {
                if (player == null) Puts("Error! Player not found!");
                else player.ConsoleMessage("Error! Player not found!");
                return;
            }

            Item item = _config.BarrelItem.ToItem();
            basePlayer.GiveItem(item);

            if (player == null) Puts("Success! Item added to inventory!");
            else player.ConsoleMessage("Success! Item added to inventory!");
        }

        [ConsoleCommand("bottle.add")]
        private void Console_BottleAdd(ConsoleSystem.Arg arg)
        {
            if (!arg.IsAdmin) return;

            BasePlayer player = arg.Player();
            
            if (arg.Args == null || arg.Args.Length < 1)
            {
                if (player == null) Puts("Wrong syntax! Usage: bottle.add <SteamID:Name:IP> [amount]");
                else player.ConsoleMessage("Wrong syntax! Usage: bottle.add <SteamID:Name:IP> [amount]");
                return;
            }
            
            String playerid = arg.Args[0];
            Int32 amount = 1;
            
            if (arg.Args.Length > 1)
            {
                if (!Int32.TryParse(arg.Args[1], out amount) || amount <= 0)
                {
                    if (player == null) Puts("Error! Invalid amount! Must be a positive number.");
                    else player.ConsoleMessage("Error! Invalid amount! Must be a positive number.");
                    return;
                }
            }
            
            BasePlayer basePlayer = BasePlayer.Find(playerid);
            
            if (basePlayer == null)
            {
                if (player == null) Puts("Error! Player not found!");
                else player.ConsoleMessage("Error! Player not found!");
                return;
            }

            // Create alcohol bottle with skin
            Item bottle = ItemManager.CreateByName("smallwaterbottle", amount, _config.itemSettings.AlcoholBottleSkinId);
            if (bottle != null)
            {
                // Create alcohol liquid and put it in the bottle
                Item alcohol = ItemManager.CreateByName("water.salt", amount * _config.drinkedSettings.AlcoholDrinkAmount, _config.itemSettings.AlcoholItemSkinId);
                if (alcohol != null)
                {
                    alcohol.MoveToContainer(bottle.contents);
                }
                basePlayer.GiveItem(bottle);
            }

            if (player == null) Puts($"Success! {amount} bottle(s) with alcohol added to inventory!");
            else player.ConsoleMessage($"Success! {amount} bottle(s) with alcohol added to inventory!");
        }

        #endregion

        #region Utils
        private Boolean IsCompound()
        {
            return _config.storeNpc.TurnedShop.UseCompound && Compound != null;
        }

        private Boolean IsBanitTown()
        {
            return _config.storeNpc.TurnedShop.UseBanditTown && BanditTown != null;
        }

        private Boolean IsAirfield()
        {
            return _config.storeNpc.TurnedShop.UseAirfield && Airfield != null;
        }

        private Boolean IsInitializeNPCShop()
        {
            Int32 CountSpawn = 0;
            if (IsCompound())
                CountSpawn++;
            if (IsBanitTown())
                CountSpawn++;
            if (IsAirfield())
                CountSpawn++;

            return CountSpawn != 0;
        }
        private String FormatTime(TimeSpan timespan)
        {
            return String.Format(timespan.TotalHours >= 1 ? "{2:00}:{0:00}:{1:00}" : "{0:00}:{1:00}", timespan.Minutes, timespan.Seconds, System.Math.Floor(timespan.TotalHours));
        }

        private void InitControllers()
        {
            foreach (KeyValuePair<NetworkableId, BaseNetworkable> keyValuePair in BaseNetworkable.serverEntities.entityList.Get())
            {
                BaseNetworkable entity = keyValuePair.Value;

                if (entity is LiquidContainer)
                {
                    LiquidContainer cont = ((LiquidContainer)entity);
                    Item item = cont.inventory.GetSlot(0);
                    if (item != null && item.skin != 0)
                    {
                        cont.ClearConnections();
                    }

                    InitBarrel(entity);
                }
            }

            Puts($"Loaded: {BarrelController.ActiveControllers.Count} custom barrels custom purifiers!");
        }

        private void InitBarrel(BaseNetworkable entity)
        {
            if (entity is WaterPurifier && ent
// ... [Code preview truncated due to length. Full source in attached file] ...

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