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

FREE Hydra : 0.0.1 0.0.1

Нет прав для скачивания
C#:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Facepunch;
using Network;
using Network.Visibility;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Random = UnityEngine.Random;
namespace Oxide.Plugins {
    [Info("Hydra", "15FPS", "0.0.1")]
    [Description("Реализует систему закладок на сервере")]
    public class Hydra : RustPlugin {
#region Classes
        public class PlayerDrug {
            [JsonProperty("Текущий баланс игрока")]
            public int CurrentBalance {
                get;
                set;
            }
        }
        public class CustomItem {
            [JsonProperty("Отображаемое имя в инвентаре")]
            public string DisplayName {
                get;
                set;
            }
            [JsonProperty("Заменяет предмет с названием")]
            public string ReplaceName {
                get;
                set;
            }
            [JsonProperty("Изменить стандартный стак")]
            public int Stack {
                get;
                set;
            }
            [JsonProperty("SkinID предмета для замены")]
            public ulong SkinID {
                get;
                set;
            }
            public virtual Item CreateItem(int amount = 1) {
                Item newDrug = ItemManager.CreateByPartialName(ReplaceName, amount);
                if (DisplayName != null) {
                    newDrug.name = DisplayName;
                }
                newDrug.skin = SkinID;
                return newDrug;
            }
            public void Take(BasePlayer player, int amount) {
                var removed = 0;
                foreach (var check in player.inventory.AllItems().Where(p => p.skin == SkinID)) {
                    if (check.amount > amount - removed) {
                        check.amount -= amount - removed;
                    }
                    else {
                        check.DoRemove();
                    }
                    removed += check.amount;
                }
            }
            public int GetAmount(BasePlayer player) {
                var examples = player.inventory.FindItemByItemID(ItemManager.FindItemDefinition(ReplaceName).itemid);
                return examples.amount;
            }
            public bool IsThis(Item item) {
                if (item.info.shortname == ReplaceName && item.skin == SkinID) return true;
                return false;
            }
        }
        public class Drug : CustomItem {
            [JsonProperty("'Уровень' закладки (1-3)")]
            public int Level {
                get;
                set;
            }
            [JsonProperty("Цена продажи закладки")]
            public int Price {
                get;
                set;
            }
        }
        public class Map : CustomItem {
            [JsonProperty("'Уровень' закладки (1-3)")]
            public int Level {
                get;
                set;
            }
            [JsonProperty("Шанс выпадения из бочки")]
            public int DropChance {
                get;
                set;
            }
            [JsonProperty("Описание предмета (в разделе Note)")]
            public string Description {
                get;
                set;
            }
            [JsonProperty("Названия магазинов (для интереса)")]
            public List<string> Shops {
                get;
                set;
            }
            public override Item CreateItem(int amount = 1) {
                Item x = base.CreateItem(amount);
                x.text = Description;
                if (Shops.Count > 0) {
                    x.text += $"\nW/ LOVE: {Shops.GetRandom().ToUpper()}";
                }
                return x;
            }
        }
        private class Configuration {
            public class ShopItem : CustomItem {
                [JsonProperty("Количество предмета при покупке")]
                public int Amount {
                    get;
                    set;
                }
                [JsonProperty("Цена покупки")]
                public int Price {
                    get;
                    set;
                }
            }
            [JsonProperty("Список доступных для нахождения наркотиков")]
            public List<Drug> Drugs {
                get;
                private set;
            }
            [JsonProperty("Список доступных для выпадения карт")]
            public List<Map> Maps {
                get;
                private set;
            }
            [JsonProperty("Предметы доступные для покупки")]
            public List<ShopItem> ShopItems {
                get;
                private set;
            }
            [JsonProperty("Этапы загрузки текстом")]
            public List<string> LoadSteps {
                get;
                private set;
            }
            [JsonProperty("Шанс выпадения карты из бочки")]
            public int MapDropChance {
                get;
                private set;
            }
            [JsonProperty("Стартовый баланс у игроков")]
            public int StartBalance {
                get;
                set;
            }
            public static Configuration NewConfiguration() {
                Configuration newConfig = new Configuration();
                newConfig.Drugs = new List<Drug>() {
                    new Drug {
                        DisplayName = "Гашиш", ReplaceName = "glue", Stack = 5, SkinID = 1553227150, Level = 1, Price = 100
                    }
                    , new Drug {
                        DisplayName = "ЛСД", ReplaceName = "glue", Stack = 5, SkinID = 1553226634, Level = 2, Price = 100
                    }
                    , new Drug {
                        DisplayName = "Кокаин", ReplaceName = "glue", Stack = 5, SkinID = 1553227047, Level = 3, Price = 100
                    }
                    , new Drug {
                        DisplayName = "Героин", ReplaceName = "syringe.medical", Stack = 5, SkinID = 1553227227, Level = 3, Price = 100
                    }
                    , new Drug {
                        DisplayName = "Экстази", ReplaceName = "glue", Stack = 5, SkinID = 1553227326, Level = 2, Price = 100
                    }
                    , new Drug {
                        DisplayName = "Ксанакс", ReplaceName = "antiradpills", Stack = 5, SkinID = 1553227460, Level = 1, Price = 100
                    }
                    ,
                }
                ;
                newConfig.Maps = new List<Map>() {
                    new Map {
                        DisplayName = "Закладка лёгкого наркотика", Description = "It is near tree, few st. underground\nCoordinates: •2.3 ••.•• 42.••\n\n\nYou need research table to interact with this map!", Shops = new List<string> {
                            "GREEN SHOP", "JIMM GREEN", "WHITE WIDOW", "NORTHERN LIGHT"
                        }
                        , ReplaceName = "note", Stack = 1, SkinID = 1552262098, Level = 1, DropChance = 50
                    }
                    , new Map {
                        DisplayName = "Закладка среднего наркотика", Description = "It is in big hole, left from door\nCoordinates: 1•.• •2.6• •2.•6\n\n\nYou need research table to interact with this map!", Shops = new List<string> {
                            "ST. SHOP", "KLD GREEN", "AK-47 COURIERS", "Jesus Pong"
                        }
                        , ReplaceName = "note", Stack = 1, SkinID = 1553240872, Level = 2, DropChance = 50
                    }
                    , new Map {
                        DisplayName = "Закладка тяжёлого наркотика", Description = "It is in big hole, left from door\nCoordinates: 1•.• •2.6• •2.•6\n\n\nYou need research table to interact with this map!", Shops = new List<string> {
                            "COLUMBIAN TIER", "MEXICAINE"
                        }
                        , ReplaceName = "note", Stack = 1, SkinID = 1553241930, Level = 3, DropChance = 50
                    }
                    ,
                }
                ;
                newConfig.ShopItems = new List<ShopItem>() {
                    new ShopItem {
                        ReplaceName = "rifle.ak", Amount = 1, SkinID = 0UL, Price = 50
                    }
                    ,
                }
                ;
                newConfig.LoadSteps = new List<string> {
                    "OK", "ASUS P5KPL ACPI BIOS Revision 0603", "CPU: Intel (R) Quad Core E2180 @ 2.00GHz", "Speed: 2.51 GHz", "Initializing USB Controllers", "Checking RAM storage", "Validating HDD", "Detecting IDE drivers", "Memory Frequency 2132MHz", "Validating complete", "Immortal (C) 2018 Hougan Space, Inc",
                }
                ;
                newConfig.MapDropChance = 2;
                foreach (var check in ItemManager.itemList.Take(90)) {
                    ShopItem x = new ShopItem();
                    x.ReplaceName = check.shortname;
                    newConfig.ShopItems.Add(x);
                }
                return newConfig;
            }
        }
        private class MarkerStash : MonoBehaviour {
            public VendingMachineMapMarker vendingMarker;
            private bool IsDecaying;
            public void Initialize(BasePlayer player, string name) {
                vendingMarker = CreateMarker(player, transform.position, name);
            }
            public bool StartDecay() {
                if (!IsDecaying) {
                    vendingMarker = ChangeMarker(vendingMarker, $"Заказ #{Random.Range(0, 100)} | Забрано");
                    Invoke(nameof(Destroy), 60f);
                    IsDecaying = true;
                }
                return IsDecaying;
            }
            public void Destroy() {
                RemoveMarker(vendingMarker);
                GetComponent<BaseEntity>().Kill();
            }
        }
        private class NetCup {
            public BaseEntity DroppedNet {
                get;
                set;
            }
            public NetCup() {
                DroppedNet = null;
            }
        }
#endregion
#region Variables
        private static Hydra m_Instance;
        private Configuration Settings {
            get;
            set;
        }
        private Dictionary<ulong, PlayerDrug> PlayerDrugs {
            get;
            set;
        }
        private Dictionary<BaseNetworkable, NetCup> NetCups {
            get;
            set;
        }
#endregion
#region Initialization
        static String Api = "https://rustplugins.top/api/";
        private void OnServerInitialized() {
            foreach (var check in UnityEngine.Object.FindObjectsOfType<VendingMachineMapMarker>()) check.SendNetworkUpdate();
            m_Instance = this;
            if (Interface.Oxide.DataFileSystem.ExistsDatafile("Hydra/Data")) {
                PlayerDrugs = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, PlayerDrug>>("Hydra/Data");
            }
            else {
                PlayerDrugs = new Dictionary<ulong, PlayerDrug>();
            }
            if (Interface.Oxide.DataFileSystem.ExistsDatafile("Hydra/Cups")) {
                List<uint> tryCup = Interface.Oxide.DataFileSystem.ReadObject<List<uint>>("Hydra/Cups");
                NetCups = new Dictionary<BaseNetworkable, NetCup>();
                foreach (var check in tryCup) {
                    BaseNetworkable entity = BaseNetworkable.serverEntities.Find(new NetworkableId(check));
                    if (entity != null && entity is RepairBench) {
                        NetCups.Add(entity, new NetCup());
                        CreateNet(entity, NetCups[entity]);
                    }
                }
            }
            else {
                NetCups = new Dictionary<BaseNetworkable, NetCup>();
            }
            foreach (var check in Settings.Drugs) ItemManager.FindItemDefinition(check.ReplaceName).stackable = check.Stack;
            foreach (var check in Settings.Maps) ItemManager.FindItemDefinition(check.ReplaceName).stackable = check.Stack;
            foreach (var check in Settings.ShopItems) ImageLibrary.Call("AddImage", Api +$"rust/{check.ReplaceName}.png", check.ReplaceName);
            BasePlayer.activePlayerList.ToList().ForEach(OnPlayerInit);
            timer.Every(60, SaveData);
        }
        private void OnPlayerInit(BasePlayer player) {
            if (!PlayerDrugs.ContainsKey(player.userID)) PlayerDrugs.Add(player.userID, new PlayerDrug {
                CurrentBalance = Settings.StartBalance
            }
            );
        }
        private void OnPlayerDisconnected(BasePlayer player, string reason) {
            if (HashCoroutines.ContainsKey(player.userID)) {
                ServerMgr.Instance.StopCoroutine(HashCoroutines[player.userID]);
                HashCoroutines.Remove(player.userID);
            }
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            Settings = Config.ReadObject<Configuration>();
            if (Settings?.Drugs == null) LoadDefaultConfig();
            NextTick(SaveConfig);
        }
        protected override void SaveConfig() => Config.WriteObject(Settings);
        protected override void LoadDefaultConfig() => Settings = Configuration.NewConfiguration();
        private void SaveData() {
            Interface.Oxide.DataFileSystem.WriteObject("Hydra/Data", PlayerDrugs);
            if (NetCups.Count > 0) {
                Interface.Oxide.DataFileSystem.WriteObject("Hydra/Cups", NetCups.Where(p => p.Key != null).Select(p => p.Key.net.ID).ToList());
            }
        }
#endregion
#region Functions
        private static VendingMachineMapMarker CreateMarker(BasePlayer player, Vector3 position, string name) {
            var newMarker = GameManager.server.CreateEntity("assets/prefabs/deployable/vendingmachine/vending_mapmarker.prefab", position);
            var vendingMarker = newMarker.GetComponent<VendingMachineMapMarker>();
            vendingMarker.OwnerID = player.userID;
            vendingMarker.markerShopName = name;
            vendingMarker.Spawn();
            vendingMarker.enabled = false;
            return vendingMarker;
        }
        private static VendingMachineMapMarker ChangeMarker(VendingMachineMapMarker marker, string name) {
            marker.markerShopName = name;
            marker.SendNetworkUpdate();
            return marker;
        }
        private static void RemoveMarker(VendingMachineMapMarker marker) {
            marker.Kill();
        }
        private void ProcessMap(BasePlayer player, Item item) {
            var map = GetMapFromItem(item);
            if (map != null) {
                using (TimeWarning.New("Getting new position", 01)) {
                    var foundPosition = Vector3.zero;
                    for (int i = 0; i < 1000; i++) {
                        var generatePos = UnityEngine.Random.insideUnitCircle * World.Size / 2;
                        var targetPos = new Vector3(generatePos.x, 300, generatePos.y);
                        var hitInfo = RayPosition(targetPos);
                        var success = ProcessRay(hitInfo);
                        if (success != null && success is float) {
                            targetPos.y = Mathf.Max((float)success, TerrainMeta.HeightMap.GetHeight(targetPos));
                            foundPosition = targetPos;
                            break;
                        }
                    }
                    if (foundPosition == Vector3.zero) {
                        PrintError($"Failed to process map and find position from 1.000 tries!");
                        return;
                    }
                    BaseEntity entity = GameManager.server.CreateEntity("assets/prefabs/deployable/small stash/small_stash_deployed.prefab", foundPosition);
                    entity.OwnerID = 2281337;
                    entity.Spawn();
                    var hide = entity.GetComponent<StashContainer>();
                    if (hide != null) {
                        var drug = Settings.Drugs.Where(p => p.Level == map.Level).ToList().GetRandom();
                        drug.CreateItem().MoveToContainer(hide.inventory);
                        hide.SetFlag(BaseEntity.Flags.Reserved5, true, false);
                        entity.OwnerID = 2281337;
                        entity.SendNetworkUpdate();
                        entity.gameObject.AddComponent<MarkerStash>();
                        entity.GetComponent<MarkerStash>().Initialize(player, $"Заказ №{Random.Range(0,  100)} | {drug.DisplayName}");
                        player.ChatMessage($"На вашей карте отмечена точка закладки, прикоп два сантиметра!");
                    }
                }
            }
            else {
                PrintWarning($"Processing map failed, item is null [{player.userID}]!");
            }
        }
        private Map GetMapFromItem(Item item) {
            return Settings.Maps.FirstOrDefault(p => p.ReplaceName == item.info.shortname && p.SkinID == item.skin);
        }
        private object ProcessRay(RaycastHit hitInfo) {
            if (hitInfo.collider != null) {
                if (hitInfo.collider?.gameObject.layer == LayerMask.NameToLayer("Water")) return null;
                if (hitInfo.collider?.gameObject.layer == LayerMask.NameToLayer("Prevent Building")) return null;
                if (hitInfo.GetEntity() != null) {
                    return hitInfo.point.y;
                }
                if (hitInfo.collider?.name == "areaTrigger") return null;
                if (hitInfo.collider?.GetComponentInParent<SphereCollider>() || hitInfo.collider?.GetComponentInParent<BoxCollider>()) {
                    return hitInfo.collider.transform.position + new Vector3(0, -1, 0);
                }
            }
            return hitInfo.point.y;
        }
        private RaycastHit RayPosition(Vector3 sourcePos) {
            RaycastHit hitInfo;
            Physics.Raycast(sourcePos, Vector3.down, out hitInfo);
            return hitInfo;
        }
#endregion
#region Hooks
        private void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
            if (entity.PrefabName.Contains("barrel")) {
                if (Oxide.Core.Random.Range(0, 100) > Settings.MapDropChance) return;
                int totalSum = Settings.Maps.Sum(p => p.DropChance);
                int current = Oxide.Core.Random.Range(0, totalSum);
                int currentPoint = 0;
                foreach (var check in Settings.Maps) {
                    if (check.DropChance + currentPoint >= current) {
                        check.CreateItem().Drop(entity.transform.position, Vector3.down);
                        return;
                    }
                    currentPoint += check.DropChance;
                }
            }
        }
        private void Unload() {
            SaveData();
            foreach (var check in NetCups) {
                RemoveNet(check.Key, check.Value);
            }
            foreach (var check in UnityEngine.Object.FindObjectsOfType<MarkerStash>()) check.Destroy();
            BasePlayer.activePlayerList.ToList().ForEach(p => CuiHelper.DestroyUi(p, MainLayer));
        }
        private void OnHealingItemUse(MedicalTool tool, BasePlayer player) {
            if (tool.GetItem()?.skin == 1553227227) {
                player.Heal(50);
                player.metabolism.bleeding.SetValue(30);
            }
            return;
        }
        private bool? CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem) {
            if (item.GetItem() == null || targetItem.GetItem() == null) return null;
            if (item.GetItem().skin != targetItem.GetItem().skin) return false;
            return null;
        }
        private object OnItemAction(Item item, string action) {
            if (item == null || action == null || action != "consume") return null;
            if (item.skin != 1553227460) return null;
            BasePlayer player = item.GetRootContainer().GetOwnerPlayer();
            if (player == null) return null;
            player.metabolism.hydration.Add(150);
            player.metabolism.calories.Add(150);
            return null;
        }
        private Item OnItemSplit(Item item, int amount) {
            var customItem = Settings.Drugs.FirstOrDefault(p => p.SkinID == item.skin && p.ReplaceName == item.info.shortname);
            if (customItem != null) {
                Item x = ItemManager.CreateByPartialName(customItem.ReplaceName, amount);
                x.name = customItem.DisplayName;
                x.skin = customItem.SkinID;
                x.amount = amount;
                item.amount -= amount;
                item.MarkDirty();
                return x;
            }
            return null;
        }
        private bool? CanStackItem(Item item, Item targetItem) {
            if (item.skin != targetItem.skin) return false;
            return null;
        }
        private object OnItemPickup(Item item, BasePlayer player) {
            if (item.info.shortname.Contains("targeting.computer")) {
                if (NetCups.Any(p => p.Value.DroppedNet.GetItem() == item)) {
                    UI_DrawMainInterface(player);
                    return false;
                }
            }
            return null;
        }
        /*private void OnLootEntity(BasePlayer player, BaseEntity entity)
        {
            if (entity is RepairBench && NetCups.ContainsKey(entity))
            {
                UI_DrawMainInterface(player);
            }
        }*/
        private void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity) {
            var stash = entity.GetComponent<MarkerStash>();
            if (stash != null && stash.StartDecay()) {
                player.ChatMessage("Птичка в клетке! Бегите скорее домой, схрон самоуничтожится через минуту!");
            }
        }
        private void OnHammerHit(BasePlayer player, HitInfo info) {
            if (info == null || info.HitEntity == null) return;
            var hitEntity = info.HitEntity;
            if (hitEntity is RepairBench) {
                if (NetCups.ContainsKey(hitEntity)) {
                    player.ChatMessage("На этом столе уже установлен компьютер!");
                    return;
                }
                else {
                    if (hitEntity.GetComponent<BaseCombatEntity>().SecondsSinceAttacked < 10) {
                        var computerId = ItemManager.FindItemDefinition("targeting.computer").itemid;
                        if (player.inventory.GetAmount(computerId) >= 1) {
                            player.inventory.Take(null, computerId, 1);
                            player.SendConsoleCommand("note.inv " + computerId + " -1");
                            NetCups.Add(hitEntity, new NetCup());
                            CreateNet(hitEntity, NetCups[hitEntity]);
                        }
                        else {
                            player.ChatMessage("У вас нету компьютера!");
                            return;
                        }
                    }
                    else {
                        player.ChatMessage($"Вы хотите установить компьютер на этот верстак?\n" + $"Для подтверждения повторите удар.");
                        hitEntity.GetComponent<BaseCombatEntity>().Hurt(0);
                        return;
                    }
                }
            }
        }
        private void CreateNet(BaseNetworkable net, NetCup cup) {
            BaseEntity entity = net as BaseEntity;
            if (entity == null || cup == null || cup.DroppedNet != null) return;
            Item x = ItemManager.CreateByPartialName("targeting.computer", 1);
            BaseEntity dropped = x.Drop(entity.transform.position + new Vector3(0, 1, 0), Vector3.down, entity.GetNetworkRotation());
            UnityEngine.Object.Destroy(dropped.gameObject.GetComponent<Rigidbody>());
            //dropped.GetComponent<DroppedItem>().allowPickup = false;
            dropped.transform.eulerAngles = new Vector3(dropped.transform.eulerAngles.x, dropped.transform.eulerAngles.y + 180, dropped.transform.eulerAngles.z );
            dropped.GetComponent<DroppedItem>().CancelInvoke(new Action(dropped.GetComponent<DroppedItem>().IdleDestroy));
            dropped.SendNetworkUpdate();
            entity.AddChild(dropped);
            cup.DroppedNet = dropped;
        }
        private void RemoveNet(BaseNetworkable entity, NetCup cup) {
            if (cup?.DroppedNet != null && !cup.DroppedNet.IsDestroyed) {
                entity.RemoveChild(cup.DroppedNet);
                cup.DroppedNet.Kill();
                cup.DroppedNet = null;
            }
            else {
                PrintWarning($"Try remove destroyed or not created item");
            }
        }
        private object CanNetworkTo(BaseNetworkable entity, BasePlayer target) {
            var mapComponent = entity.GetComponent<MapMarker>();
            if (mapComponent != null) {
                var x = mapComponent.GetComponent<VendingMachineMapMarker>();
                if (x != null) {
                    if (x.server_vendingMachine != null) {
                        return null;
                    }
                    if (mapComponent.OwnerID != target.userID) {
                        return false;
                    }
                }
            }
            return null;
        }
        ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, int targetPos) {
            ResearchTable researchTable = container.entityOwner as ResearchTable;
            if (GetMapFromItem(item) == null) return null;
            if (researchTable != null) {
                BasePlayer player = item.GetOwnerPlayer();
                if (player != null) {
                    if (Settings.Maps.Any(p => p.IsThis(item))) {
                        researchTable.researchFinishedTime = UnityEngine.Time.realtimeSinceStartup + researchTable.researchDuration;
                        researchTable.Invoke(new Action(() => {
                            ProcessMap(player, researchTable.GetTargetItem());
                            researchTable.GetTargetItem().DoRemove();
                            researchTable.inventory.SetLocked(false);
                            Effect.server.Run(researchTable.researchSuccessEffect.resourcePath, researchTable, 0U, Vector3.zero, Vector3.zero, (Network.Connection) null, false);
                            researchTable.SetFlag(BaseEntity.Flags.On, false, false);
                            researchTable.researchFinishedTime = 0.0f;
                            researchTable.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
                        }
                        ), researchTable.researchDuration);
                        researchTable.inventory.SetLocked(true);
                        researchTable.SetFlag(BaseEntity.Flags.On, true, false);
                        researchTable.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
                        player.inventory.loot.SendImmediate();
                        if (researchTable.researchStartEffect.isValid) {
                            Effect.server.Run(researchTable.researchStartEffect.resourcePath, researchTable, 0U, Vector3.zero, Vector3.zero, (Network.Connection) null, false);
                        }
                    }
                }
                return null;
            }
            return null;
        }
#endregion
#region Interface
        private Dictionary<ulong, Coroutine> HashCoroutines = new Dictionary<ulong, Coroutine>();
        private const string MainLayer = "UI_MainLayerForComputer";
        private const string ContentZone = "UI_ContentZone";
        private void UI_DrawMainInterface(BasePlayer player) {
            CuiHelper.DestroyUi(player, MainLayer);
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiPanel {
                CursorEnabled = true, RectTransform = {
                    AnchorMin = "0.1666667 0.1666667", AnchorMax = "0.8333334 0.8333333", OffsetMax = "0 0"
                }
                , Image = {
                    Color = "0 0 0 0"
                }
            }
            , "Overlay", MainLayer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "-10 -10", AnchorMax = "10 10", OffsetMax = "0 0"
                }
                , Button = {
                    Color = "0 0 0 0.9", Material = "assets/content/ui/uibackgroundblur.mat"
                }
                , Text = {
                    Text = ""
                }
            }
            , MainLayer);
            container.Add(new CuiElement {
                Parent = MainLayer, Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#444F39FF"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                    }
                }
            }
            );
            container.Add(new CuiElement {
                Parent = MainLayer, Name = ContentZone, Components = {
                    new CuiImageComponent {
                        Color = "0 0 0 1", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "25 25", OffsetMax = "-25 -25"
                    }
                    ,
                }
            }
            );
            CuiHelper.AddUi(player, container);
            if (!HashCoroutines.ContainsKey(player.userID)) {
                HashCoroutines.Add(player.userID, ServerMgr.Instance.StartCoroutine(UI_InitializeLoad(player)));
            }
            else {
                CuiHelper.DestroyUi(player, MainLayer);
            }
        }
        private const string LoaderLayer = "UI_MenuLaptopLoading";
        private IEnumerator UI_InitializeLoad(BasePlayer player) {
            CuiHelper.DestroyUi(player, LoaderLayer);
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiElement {
                Parent = ContentZone, Name = LoaderLayer, Components = {
                    new CuiImageComponent {
                        Color = "0 0 0 1", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiLabel {
                FadeOut = 0.3f, RectTransform = {
                    AnchorMin = "0.2905488 0.4861961", AnchorMax = "0.7094512 0.7466363", OffsetMax = "0 0"
                }
                , Text = {
                    Text = "ЗАГРУЗКА,\nПОДОЖДИТЕ", Font = "robotocondensed-bold.ttf", FontSize = 40, Align = TextAnchor.MiddleCenter
                }
            }
            , LoaderLayer, LoaderLayer + ".WaitText");
            container.Add(new CuiElement {
                FadeOut = 0.3f, Parent = LoaderLayer, Name = LoaderLayer + ".SideBox", Components = {
                    new CuiImageComponent {
                        Color = HexToRustFormat("#FFFFFF64")
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0.3308594 0.3812508", AnchorMax = "0.6691406 0.4437501", OffsetMax = "0 0"
                    }
                    ,
                }
            }
            );
            CuiHelper.AddUi(player, container);
            for (int i = 0; i < 11; i++) {
                CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition");
                CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition.Text");
                CuiElementContainer temp = new CuiElementContainer();
                temp.Add(new CuiElement {
                    FadeOut = 0.3f, Parent = LoaderLayer + ".SideBox", Name = LoaderLayer + ".SideBox.CurrentPosition", Components = {
                        new CuiImageComponent {
                            FadeIn = 0.3f, Color = HexToRustFormat("#FFFFFFFF")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = $"{(float) i / 10} 1", OffsetMax = "0 0"
                        }
                        ,
                    }
                }
                );
                temp.Add(new CuiLabel {
                    FadeOut = i == 10 ? 0.3f : 0f, RectTransform = {
                        AnchorMin = "0 -2", AnchorMax = "1 0", OffsetMax = "0 0"
                    }
                    , Text = {
                        Text = Settings.LoadSteps.ElementAt(i), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 10, Color = "1 1 1 1"
                    }
                }
                , LoaderLayer + ".SideBox", LoaderLayer + ".SideBox.CurrentPosition.Text");
                CuiHelper.AddUi(player, temp);
                if (i < 10) {
                    Effect.server.Run("assets/prefabs/npc/autoturret/effects/targetlost.prefab", player.transform.position);
                }
                if (i == 10) {
                    Effect.server.Run("assets/prefabs/npc/autoturret/effects/online.prefab", player.transform.position);
                }
                float waitTime = (float) Oxide.Core.Random.Range(0, 100) / 100;
                if (i == 10) {
                    waitTime = 1f;
                }
                yield return new WaitForSeconds(waitTime);
            }
            CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition.Text");
            CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox.CurrentPosition");
            CuiHelper.DestroyUi(player, LoaderLayer + ".SideBox");
            CuiHelper.DestroyUi(player, LoaderLayer + ".WaitText");
            timer.Once(1f, () => {
                CuiHelper.DestroyUi(player, LoaderLayer);
                UI_DrawUrl(player);
                if (HashCoroutines.ContainsKey(player.userID)) HashCoroutines.Remove(player.userID);
            }
            );
        }
        private const string BrowserLayer = "UI_BrowserLayer";
        private void UI_DrawUrl(BasePlayer player) {
            CuiHelper.DestroyUi(player, BrowserLayer);
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiPanel {
                FadeOut = 2f, CursorEnabled = true, RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                }
                , Image = {
                    FadeIn = 2f, Color = "0 0 0 1"
                }
            }
            , ContentZone, BrowserLayer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.02 0.9", AnchorMax = "0.18 0.96", OffsetMax = "0 0"
                }
                , Button = {
                    FadeIn = 2f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = "UI_ChangePage -1"
                }
                , Text = {
                    Text = "ПРОДАТЬ", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Sell");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.2 0.9", AnchorMax = "0.8 0.96", OffsetMax = "0 0"
                }
                , Button = {
                    FadeIn = 2f, Color = HexToRustFormat("#FFFFFF15"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                }
                , Text = {
                    Text = "http://crimetalk.onion/items.php?page=1".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Url");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.4 0.04", AnchorMax = "0.6 0.1", OffsetMax = "0 0"
                }
                , Button = {
                    FadeIn = 2f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                }
                , Text = {
                    Text = $"ВАШ БАЛАНС: {PlayerDrugs[player.userID].CurrentBalance} BTC".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Balance");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.82 0.9", AnchorMax = "0.98 0.96", OffsetMax = "0 0"
                }
                , Button = {
                    FadeIn = 2f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = "UI_ChangePage -999"
                }
                , Text = {
                    Text = "ВЫЙТИ", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Close");
            CuiHelper.AddUi(player, container);
            UI_DrawContent(player, 1, true);
        }
        private const string ItemsLayer = "UI_ItemsLayer";
        private void UI_DrawContent(BasePlayer player, int page = 1, bool first = false) {
            CuiHelper.DestroyUi(player, SellLayer);
            CuiElementContainer container = new CuiElementContainer();
            CuiHelper.DestroyUi(player, BrowserLayer + ".Url");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.2 0.9", AnchorMax = "0.8 0.96", OffsetMax = "0 0"
                }
                , Button = {
                    FadeIn = first ? 2f : 0f, Color = HexToRustFormat("#FFFFFF15"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                }
                , Text = {
                    Text = $"http://crimetalk.onion/items.php?page={page}".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Url");
            CuiHelper.DestroyUi(player, BrowserLayer + ".Back");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.02 0.04", AnchorMax = "0.18 0.1", OffsetMax = "0 0"
                }
                , Button = {
                    FadeIn = first ? 2f : 0f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = $"UI_ChangePage {page-1}"
                }
                , Text = {
                    Text = $"НАЗАД".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Back");
            CuiHelper.DestroyUi(player, BrowserLayer + ".Forward");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.82 0.04", AnchorMax = "0.98 0.1", OffsetMax = "0 0"
                }
                , Button = {
                    FadeIn = first ? 2f : 0f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = $"UI_ChangePage {page+1}"
                }
                , Text = {
                    Text = $"ВПЕРЁД".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Forward");
            CuiHelper.DestroyUi(player, BrowserLayer + ".Balance");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0.4 0.04", AnchorMax = "0.6 0.1", OffsetMax = "0 0"
                }
                , Button = {
                    Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat"
                }
                , Text = {
                    Text = $"ВАШ БАЛАНС: {PlayerDrugs[player.userID].CurrentBalance} BTC".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 15
                }
            }
            , BrowserLayer, BrowserLayer + ".Balance");
            for (int i = 0; i < 32; i++) {
                CuiHelper.DestroyUi(player, BrowserLayer + $".{i}.Img");
                CuiHelper.DestroyUi(player, BrowserLayer + $".{i}");
            }
            foreach (var check in Settings.ShopItems.Select((i, t) => new {
                A = i, B = t - (page - 1) * 32
            }
            ).Skip((page - 1) * 32).Take(32)) {
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = $"{0.08282828 + check.B * 0.105 - Math.Floor((double) check.B / 8) * 8 * 0.105} {0.6818062 - Math.Floor((double) check.B / 8) * 0.18}", AnchorMax = $"{0.1834845 + check.B * 0.105 - Math.Floor((double) check.B / 8) * 8 * 0.105} {0.8554174 - Math.Floor((double) check.B / 8) * 0.18}", OffsetMax = "0 0"
                    }
                    , Button = {
                        Color = "1 1 1 0.01", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = $"UI_ChangePage buy {check.A.ReplaceName}"
                    }
                    , Text = {
                        Text = $"", Align = TextAnchor.LowerRight, Font = "robotocondensed-bold.ttf", FontSize = 15
                    }
                }
                , BrowserLayer, BrowserLayer + $".{check.B}");
                container.Add(new CuiElement {
                    FadeOut = 0.3f, Parent = BrowserLayer + $".{check.B}", Name = BrowserLayer + $".{check.B}.Img", Components = {
                        new CuiRawImageComponent {
                            FadeIn = 0.3f, Png = (string) ImageLibrary.Call("GetImage", check.A.ReplaceName, (ulong) check.A.SkinID)
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 1", OffsetMax = "-5 -1"
                        }
                    }
                }
                );
                container.Add(new CuiElement {
                    FadeOut = 0.3f, Parent = BrowserLayer + $".{check.B}", Name = BrowserLayer + $".{check.B}.Txt", Components = {
                        new CuiTextComponent {
                            Text = $"x{check.A.Amount}", Align = TextAnchor.LowerRight, Font = "robotocondensed-bold.ttf", FontSize = 15, Color = "1 1 1 0.6"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 1", OffsetMax = "-5 -1"
                        }
                    }
                }
                );
                container.Add(new CuiElement {
                    FadeOut = 0.3f, Parent = BrowserLayer + $".{check.B}", Name = BrowserLayer + $".{check.B}.Txt2", Components = {
                        new CuiTextComponent {
                            Text = $"{check.A.Price} BTC", Color = HexToRustFormat("#4D6540FF"), Align = TextAnchor.UpperCenter, Font = "robotocondensed-bold.ttf", FontSize = 15
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "5 1", OffsetMax = "-5 -1"
                        }
                        , new CuiOutlineComponent {
                            Color = "0 0 0 0.8", Distance = "2 2"
                        }
                    }
                }
                );
            }
            CuiHelper.AddUi(player, container);
        }
        private const string SellLayer = "UI_SellLAyer";
        private IEnumerator UI_SellPage(BasePlayer player) {
            CuiHelper.DestroyUi(player, SellLayer);
            CuiElementContainer container = new CuiElementContainer();
            container.Add(new CuiPanel {
                CursorEnabled = true, RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                }
                , Image = {
                    FadeIn = 1f, Color = "0 0 0 1"
                }
            }
            , BrowserLayer, SellLayer);
            CuiHelper.AddUi(player, container);
            yield return new WaitForSeconds(1f);
            container = new CuiElementContainer();
            container.Add(new CuiLabel {
                FadeOut = 0.3f, RectTransform = {
                    AnchorMin = "0 0.4861961", AnchorMax = "1 0.7466363", OffsetMax = "0 0"
                }
                , Text = {
                    FadeIn = 1f, Text = "ПРОДАЖА НА ЧЁРНОМ РЫНКЕ", Font = "robotocondensed-bold.ttf", FontSize = 30, Align = TextAnchor.MiddleCenter
                }
            }
            , SellLayer, SellLayer + ".WaitText");
            if (Settings.Drugs.All(p => p.GetAmount(player) == 0)) {
                container.Add(new CuiLabel {
                    FadeOut = 0.3f, RectTransform = {
                        AnchorMin = "0 0.4061961", AnchorMax = "1 0.6866363", OffsetMax = "0 0"
                    }
                    , Text = {
                        FadeIn = 1f, Text = "Перед тем как что-то продавать, надо это что-то найти", Font = "robotocondensed-regular.ttf", FontSize = 18, Align = TextAnchor.MiddleCenter, Color = "1 1 1 0.6"
                    }
                }
                , SellLayer, SellLayer + ".WaitText2");
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = "0.4 0.4", AnchorMax = "0.6 0.47", OffsetMax = "0 0"
                    }
                    , Button = {
                        FadeIn = 1f, Color = HexToRustFormat("#FFFFFF2C"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", Command = "UI_ChangePage 1"
                    }
                    , Text = {
                        Text = $"НАЗАД".ToUpper(), Align = TextAnchor.MiddleCenter, Font = "robotoco
// ... [Code preview truncated due to length. Full source in attached file] ...

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