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

FREE CaptureZone : 1.0.0 1.0.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Newtonsoft.Json.Linq;
using Oxide.Core.Libraries.Covalence;
using Rust;
namespace Oxide.Plugins {
    [Info("CaptureZone", "King", "1.0.0")]
    public class CaptureZone : RustPlugin {
#region [Vars]
        [PluginReference]
        private Plugin ImageLibrary = null, Clans = null, MenuAlerts = null;
        private string[] _gatherHooks = {
            "OnDispenserGather", "OnDispenserBonus",
        }
        ;
        private static CaptureZone plugin;
        private Dictionary<String, DateTime> CooldownNotifyFarm = new Dictionary<String, DateTime>();
        private List<ulong> _CaptureCupboard = new List<ulong>();
        private List<ulong> _CaptureDropBox = new List<ulong>();
        private List<ulong> openUI = new List<ulong>();
        private Dictionary<string, int> _itemIds = new Dictionary<string, int>();
#endregion
#region [Data]
        public List<CaptureData> _CaptureList = new List<CaptureData>();
        public class CaptureData {
            public string captureName;
            public string nameClan;
            public int lastCapture;
            public ulong Cupboard;
            public ulong ResourseChest;
            public Vector3 capturePosition;
        }
        private void SaveCapture() {
            Interface.Oxide.DataFileSystem.WriteObject($"{Name}/CaptureList", _CaptureList);
        }
        private void LoadCapture() {
            try {
                _CaptureList = Interface.Oxide.DataFileSystem.ReadObject<List<CaptureData>>($"{Name}/CaptureList");
            }
            catch (Exception e) {
                PrintError(e.ToString());
            }
            if (_CaptureList == null) _CaptureList = new List<CaptureData>();
        }
#endregion
#region [Oxide]
        private void OnPluginLoaded(Plugin plugin) {
            NextTick(() => {
                foreach (string hook in _gatherHooks) {
                    Unsubscribe(hook);
                    Subscribe(hook);
                }
            }
            );
        }
        private void Init() {
            plugin = this;
            LoadCapture();
        }
        private void OnServerInitialized() {
            GetCaptureZone();
            cmd.AddChatCommand("capture", this, "ChatCommandCaptureZoneUI");
            cmd.AddChatCommand("newcapture", this, "NewSpawnCaptureZone");
            cmd.AddChatCommand("removecapture", this, "DeleteCaptureZone");
            ImageLibrary?.Call("AddImage", "https://i.imgur.com/rMC4ulM.png", "button_capture_zone");
        }
        private void Unload() {
            SaveCapture();
            foreach (var key in _CaptureList) RemoveCaptureZone(key.capturePosition);
            _CaptureManager.RemoveAll(x => {
                UnityEngine.Object.Destroy(x);
                return true;
            }
            );
            foreach (BasePlayer player in BasePlayer.activePlayerList) CuiHelper.DestroyUi(player, "CaptureUI");
            plugin = null;
        }
        private void OnNewSave(string filename) {
            _CaptureList.Clear();
            SaveCapture();
        }
#endregion
#region [Rust]
        private void OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item) {
            if(dispenser == null || player == null) return;
            var clan = GetClanTag(player.userID);
            if (string.IsNullOrEmpty(clan)) return;
            CaptureManager ActiveCaptureZone = FindCaptureZoneDistance(player.transform.position);
            if (ActiveCaptureZone == null || string.IsNullOrEmpty(ActiveCaptureZone._data.nameClan)) return;
            var memberList = GetClanMembers(ActiveCaptureZone._data.nameClan);
            if (memberList == null || memberList == new List<string>()) return;
            var entity = ActiveCaptureZone._entity;
            if (entity == null) return;
            var inventory = entity.GetComponent<StorageContainer>().inventory;
            if (inventory == null) return;
            var amount = Convert.ToInt32(item.amount * (config._ZoneSettings.CapturePrecent / 100f));
            if (amount <= 0) return;
            var itemToCreate = ItemManager.CreateByName(item.info.shortname, amount);
            if (itemToCreate.amount <= 0) return;
            itemToCreate.MoveToContainer(inventory);
            if (CooldownNotifyFarm.ContainsKey(ActiveCaptureZone._data.nameClan)) if (CooldownNotifyFarm[ActiveCaptureZone._data.nameClan].Subtract(DateTime.Now).TotalSeconds >= 0) return;
            if (inventory.capacity == inventory.itemList.Count) {
                foreach (var key in memberList) {
                    var id = Convert.ToUInt64(key);
                    var memberClan = BasePlayer.FindByID(id);
                    if (memberClan == null || !memberClan.IsConnected) continue;
                    memberClan.ChatMessage($"Инвентарь территории {ActiveCaptureZone._data.captureName} переполен, залутайте его!");
                    CooldownNotifyFarm[ActiveCaptureZone._data.nameClan] = DateTime.Now.AddSeconds(5);
                }
            }
        }
        private void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item) => OnDispenserGather(dispenser, player, item);
        private object OnEntityGroundMissing(BaseEntity entity) {
            if (entity.OwnerID == 9997) return false;
            return null;
        }
        private object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if(entity.OwnerID == 9997) return true;
            return null;
        }
        object CanLootEntity(BasePlayer player, DropBox DropBox) {
            if (player == null || DropBox == null || !_CaptureDropBox.Contains(DropBox.net.ID.Value)) return null;
            var clanName = GetClanTag(player.userID);
            if (string.IsNullOrEmpty(clanName)) return false;
            CaptureManager ActiveCaptureZone = FindCaptureZoneDropBox(DropBox.net.ID.Value);
            if (ActiveCaptureZone != null) {
                if (clanName != ActiveCaptureZone._data.nameClan) return false;
            }
            return null;
        }
        object OnCupboardAuthorize(BuildingPrivlidge privilege, BasePlayer player) {
            if (privilege == null || player == null || !_CaptureCupboard.Contains(privilege.net.ID.Value)) return null;
            CaptureManager ActiveCaptureZone = FindCaptureZoneCupboard(privilege.net.ID.Value);
            if (ActiveCaptureZone != null) {
                var clan = GetClanTag(player.userID);
                if (string.IsNullOrEmpty(clan)) {
                    player.ChatMessage("У вас нет клана.");
                    return false;
                }
                if (ActiveCaptureZone.CaptureClan == clan) {
                    player.ChatMessage("Ваш клан уже захватывает данную территорию!");
                    return false;
                }
                var CaptureOtherZone = FindCaptureOtherClan(clan);
                if (CaptureOtherZone != null) {
                    player.ChatMessage("Ваш клан уже захватывает другую территорию, дождитесь завершения захвата.");
                    return false;
                }
                ActiveCaptureZone.StartCapture(clan, player);
                return false;
            }
            return null;
        }
        private object CanBuild(Planner builder, Construction prefab, Construction.Target target) {
            var player = builder.GetOwnerPlayer();
            if (player == null) return null;
            CaptureManager ActiveCaptureZone = FindCaptureZoneDistance(player.transform.position);
            if (ActiveCaptureZone != null) {
                if (Vector3.Distance(player.transform.position, ActiveCaptureZone.transform.position) < config._ZoneSettings.RadiusBuild) {
                    player.ChatMessage("Нельзя строится так близко к захвату!");
                    return false;
                }
            }
            return null;
        }
#endregion
#region [Capture]
        private void GetCaptureZone() {
            /*if (_CaptureList.Count == 0)
            {
                var MapSize = TerrainMeta.Size / 2;

                Dictionary<Vector3, String> ListPosition = new Dictionary<Vector3, String>()
                {
                    [new Vector3(-MapSize.x, 0, MapSize.z)] = "A", // Левая верхняя
                    [new Vector3(MapSize.x / 9, 0, MapSize.z)] = "B", // Центральная верхняя
                    [new Vector3(MapSize.x, 0, MapSize.z)] = "C", // Правая верхняя

                    [new Vector3(-MapSize.x, 0, MapSize.z / 9)] = "D", // Левая Центральная
                    [new Vector3(MapSize.x / 9, 0, MapSize.z / 9)] = "E", // Центральная Центральная
                    [new Vector3(MapSize.x, 0, MapSize.z / 9)] = "F", // Правая Центральная

                    [new Vector3(-MapSize.x, 0, -MapSize.z)] = "G", // Левая Нижняя
                    [new Vector3(MapSize.x / 9, 0, -MapSize.z)] = "H", // Центральная Нижняя
                    [new Vector3(MapSize.x, 0, -MapSize.z)] = "L", // Правая Нижняя
                };

                foreach (var key in ListPosition)
                {
                    var center = key.Key / 2;
                    Vector3 lastPosition = center;

                    for (int i = 0; i < 300; i++)
                    {
                        lastPosition = RandomCircle(lastPosition);
                        if (ValidPosition(ref lastPosition))
                        {
                            GetNewData(lastPosition, key.Value);
                            break;
                        }
                    }
                }
            }
            else
            {*/
            foreach (var key in _CaptureList) {
                SpawnCaptureZone(key.capturePosition);
            }
            //}
        }
        private void GetNewData(Vector3 position, String Name) {
            _CaptureList.Add(new CaptureData {
                captureName = Name, nameClan = string.Empty, lastCapture = 0, Cupboard = 0, ResourseChest = 0, capturePosition = position,
            }
            );
            SpawnCaptureZone(position);
        }
#endregion
#region [Prefab]
        public class PrefabCaptureZone {
            public Vector3 Position;
            public string ShortPrefabName;
            public Vector3 Rotation;
            public PrefabCaptureZone(string shortname, Vector3 pos, Vector3 rot) {
                ShortPrefabName = shortname;
                Position = pos;
                Rotation = rot;
            }
        }
        public List<PrefabCaptureZone> _PrefabCaptureZone = new List<PrefabCaptureZone> {
            // Foundation
            new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, -3), new Vector3(0, 0, 0)),  // CupboardPositionRoom
            new PrefabCaptureZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(0, 0, 1.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(0, 0, -1.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/door.double.hinged/door.double.hinged.toptier.prefab", new Vector3(-1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/deployable/tool cupboard/cupboard.tool.deployed.prefab", new Vector3(1.1f, 0.1f, 0), new Vector3(0, 270, 0)),  // Room
            new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(0, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.garagedoor/wall.frame.garagedoor.prefab", new Vector3(0, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(0, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.garagedoor/wall.frame.garagedoor.prefab", new Vector3(0, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-3, 0, 4.5f), new Vector3(0, 270, 0)),  //Floor
            new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(0, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, -3), new Vector3(0, 0, 0)),  //Rest
            new PrefabCaptureZone("assets/prefabs/deployable/signs/sign.pole.banner.large.prefab", new Vector3(0, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(-0.7f, 1.5f, 1.6f), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(0.7f, 1.5f, 1.6f), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(-0.7f, 1.5f, -1.6f), new Vector3(0, 180, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(0.7f, 1.5f, -1.6f), new Vector3(0, 180, 0)), new PrefabCaptureZone("assets/prefabs/deployable/dropbox/dropbox.deployed.prefab", new Vector3(0.8f, 1.2f, 0), new Vector3(0, 90, 0)),
        }
        ;
        private void RemoveCaptureZone(Vector3 position) {
            List<BaseEntity> list_entity = new List<BaseEntity>();
            Vis.Entities(position, 25, list_entity);
            list_entity = list_entity.Distinct().ToList();
            list_entity = list_entity.Where(x => !(x is BasePlayer) && !(x is PlayerCorpse) && !(x is DroppedItemContainer) && !(x is DroppedItem)).ToList();
            foreach(BaseEntity entity in list_entity) if(entity != null && !entity.IsDestroyed) entity.Kill();
        }
        private void SpawnCaptureZone(Vector3 position) {
            RemoveCaptureZone(position);
            var find = _CaptureList.FirstOrDefault(p => p.capturePosition == position);
            if (find == null) return;
            foreach(var key in _PrefabCaptureZone) {
                BaseEntity prefab = GameManager.server.CreateEntity(key.ShortPrefabName, position + key.Position, Quaternion.Euler(key.Rotation)) as BaseEntity;
                prefab.OwnerID = 9997;
                prefab.Spawn();
                if (prefab is BuildingBlock) {
                    BuildingBlock block = prefab as BuildingBlock;
                    block.grade = BuildingGrade.Enum.TopTier;
                    block.SetHealthToMax();
                }
                if (prefab is BuildingPrivlidge) {
                    BuildingPrivlidge build = prefab as BuildingPrivlidge;
                    _CaptureCupboard.Add(build.net.ID.Value);
                    find.Cupboard = build.net.ID.Value;
                }
                if (prefab is DropBox) {
                    DropBox dropbox = prefab as DropBox;
                    dropbox.inventory.SetFlag(ItemContainer.Flag.NoItemInput, true);
                    dropbox.inventory.capacity = 40;
                    _CaptureDropBox.Add(dropbox.net.ID.Value);
                    find.ResourseChest = dropbox.net.ID.Value;
                    var obj = new GameObject();
                    obj.transform.position = dropbox.transform.position;
                    var component = obj.AddComponent<CaptureManager>();
                    component.GetComponent<CaptureManager>().Init(find, dropbox);
                    _CaptureManager.Add(component);
                }
                if (prefab is Door) {
                    Door door = prefab as Door;
                    door.pickup.enabled = false;
                    door.canTakeLock = false;
                    door.canTakeCloser = false;
                    door.SendNetworkUpdateImmediate();
                }
                if (prefab is BaseLadder) {
                    BaseLadder ladder = prefab as BaseLadder;
                    ladder.pickup.enabled = false;
                }
            }
        }
#endregion
#region [UI]
        private void ChatCommandCaptureZoneUI(BasePlayer player) => CaptureZoneUI(player, 0);
        private void CaptureZoneUI(BasePlayer player, int page) {
            var container = new CuiElementContainer();
            string Layer = "CaptureZone_UI";
            string colored = "0 0 0 0.5";
            container.Add(new CuiPanel {
                CursorEnabled = true, RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                }
                , Image = {
                    Material = "assets/content/ui/uibackgroundblur.mat", Color = "0 0 0 0.77"
                }
            }
            , "Overlay", Layer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1"
                }
                , Button = {
                    Color = "0.36 0.33 0.28 0.3", Material = "assets/icons/greyout.mat", Close = Layer
                }
            }
            , Layer);
            container.Add(new CuiPanel {
                RectTransform = {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-493 -293", OffsetMax = "497.5 293"
                }
                , Image = {
                    Color = "0.3773585 0.3755785 0.3755785 0.3407843", Material = "assets/icons/greyout.mat"
                }
            }
            , Layer, Layer + ".Main");
            container.Add(new CuiElement {
                Parent = Layer + ".Main", Components = {
                    new CuiTextComponent {
                        Text = $"Список территорий", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 20, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0.915", AnchorMax = $"1 1"
                    }
                    ,
                }
            }
            );
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = $"0.00325 0.01", AnchorMax = $"0.035 0.067"
                }
                , Button = {
                    Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Command = page >= 1 ? $"UI_CAPTURE ChangePageCapture {page - 1}" : ""
                }
                , Text = {
                    Text = $"-", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 18, Font = "robotocondensed-bold.ttf"
                }
            }
            , Layer + ".Main");
            container.Add(new CuiPanel {
                RectTransform = {
                    AnchorMin = $"0.0395 0.01", AnchorMax = $"0.07125 0.067"
                }
                , Image = {
                    Color = "0.2 0.2 0.2 0.65", Material = "assets/icons/greyout.mat"
                }
            }
            , Layer + ".Main", Layer + ".Main" + ".pText");
            container.Add(new CuiLabel {
                RectTransform = {
                    AnchorMin = $"0 0", AnchorMax = $"1 1"
                }
                , Text = {
                    Text = $"{page + 1}", Color = "1 1 1 0.85", Font = "robotocondensed-regular.ttf", FontSize = 16, Align = TextAnchor.MiddleCenter
                }
            }
            , Layer + ".Main" + ".pText");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = $"0.07575 0.01", AnchorMax = $"0.1075 0.067"
                }
                , Button = {
                    Color = "0.46 0.44 0.42 0.65", Material = "assets/icons/greyout.mat", Command = _CaptureManager.Skip(9 * (page + 1)).Count() > 0 ? $"UI_CAPTURE ChangePageCapture {page + 1}" : ""
                }
                , Text = {
                    Text = $"+", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 18, Font = "robotocondensed-bold.ttf"
                }
            }
            , Layer + ".Main");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = $"0.890915 0.01", AnchorMax = $"0.99379 0.067", OffsetMax = "0 0"
                }
                , Button = {
                    Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Close = Layer
                }
                , Text = {
                    Text = $"ЗАКРЫТЬ", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
                }
            }
            , Layer + ".Main");
            container.Add(new CuiPanel {
                RectTransform = {
                    AnchorMin = "0 0.86", AnchorMax = "0.999 0.92"
                }
                , Image = {
                    Color = "1 1 1 0"
                }
            }
            , Layer + ".Main", Layer + ".Main" + ".Text");
            container.Add(new CuiLabel {
                Text = {
                    Text = $"НАЗВАНИЕ ТЕРРИТОРИИ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
                }
                , RectTransform = {
                    AnchorMin = $"0.025 0", AnchorMax = $"1 1"
                }
                ,
            }
            , Layer + ".Main" + ".Text");
            container.Add(new CuiLabel {
                Text = {
                    Text = $"ВЛАДЕЛЕЦ ТЕРРИТОРИИ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
                }
                , RectTransform = {
                    AnchorMin = $"0.23 0", AnchorMax = $"1 1"
                }
                ,
            }
            , Layer + ".Main" + ".Text");
            container.Add(new CuiLabel {
                Text = {
                    Text = $"СОСТОЯНИЕ ТЕРРИТОРИИ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
                }
                , RectTransform = {
                    AnchorMin = $"0.42 0", AnchorMax = $"1 1"
                }
                ,
            }
            , Layer + ".Main" + ".Text");
            container.Add(new CuiLabel {
                Text = {
                    Text = $"СОБРАТЬ РЕСУРСЫ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
                }
                , RectTransform = {
                    AnchorMin = $"0.85 0", AnchorMax = $"1 1"
                }
                ,
            }
            , Layer + ".Main" + ".Text");
            for (int y = 0; y < 9; y++) {
                container.Add(new CuiPanel {
                    RectTransform = {
                        AnchorMin = $"0.0055 {0.775 - y * 0.085}", AnchorMax = $"0.989 {0.85 - y * 0.085}"
                    }
                    , Image = {
                        Color = colored
                    }
                }
                , Layer + ".Main", Layer + ".Main" + $".TopLine{y}");
            }
            int i = 0;
            foreach (var key in _CaptureManager.Skip(page * 9).Take(9)) {
                string nameClan = key._data.nameClan;
                if (string.IsNullOrEmpty(key._data.nameClan)) nameClan = "Никто";
                bool isTime = Facepunch.Math.Epoch.Current - key._data.lastCapture < config._ZoneSettings.CaptureCooldown;
                string State = key._IsCapture == true ? "Идет захват" : isTime == true ? $"{GetFormatTime(TimeSpan.FromSeconds(key._data.lastCapture + config._ZoneSettings.CaptureCooldown - Facepunch.Math.Epoch.Current))}" : "Можно захватить";
                container.Add(new CuiLabel {
                    Text = {
                        Text = $"{key._data.captureName}", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
                    }
                    , RectTransform = {
                        AnchorMin = $"0.027 0", AnchorMax = $"1 1"
                    }
                    ,
                }
                , Layer + ".Main" + $".TopLine{i}");
                container.Add(new CuiLabel {
                    Text = {
                        Text = $"{nameClan}", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
                    }
                    , RectTransform = {
                        AnchorMin = $"0.234 0", AnchorMax = $"1 1"
                    }
                    ,
                }
                , Layer + ".Main" + $".TopLine{i}");
                container.Add(new CuiLabel {
                    Text = {
                        Text = $"{State}", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
                    }
                    , RectTransform = {
                        AnchorMin = $"0.424 0", AnchorMax = $"1 1"
                    }
                    ,
                }
                , Layer + ".Main" + $".TopLine{i}");
                container.Add(new CuiLabel {
                    Text = {
                        Text = $"Открыть", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleCenter
                    }
                    , RectTransform = {
                        AnchorMin = $"0.85 0", AnchorMax = $"0.985 0.98"
                    }
                    ,
                }
                , Layer + ".Main" + $".TopLine{i}");
                container.Add(new CuiButton {
                    Button = {
                        Color = "0 0 0 0", Command = $"UI_CAPTURE OpenInventory {key._data.ResourseChest}"
                    }
                    , RectTransform = {
                        AnchorMin = $"0.85 0", AnchorMax = $"0.985 0.98"
                    }
                    ,
                }
                , Layer + ".Main" + $".TopLine{i}");
                i++;
            }
            CuiHelper.DestroyUi(player, Layer);
            CuiHelper.AddUi(player, container);
        }
        private void CaptureZoneUI_Inventory(BasePlayer player, StorageContainer containers, CaptureManager Capture) {
            var container = new CuiElementContainer();
            var Items = containers.inventory.itemList.Count;
            string Layer = "CaptureZone_UI";
            string colored = "0 0 0 0.5";
            container.Add(new CuiPanel {
                CursorEnabled = true, RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
                }
                , Image = {
                    Material = "assets/content/ui/uibackgroundblur.mat", Color = "0 0 0 0.77"
                }
            }
            , "Overlay", Layer);
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = "0 0", AnchorMax = "1 1"
                }
                , Button = {
                    Color = "0.36 0.33 0.28 0.3", Material = "assets/icons/greyout.mat", Close = Layer
                }
            }
            , Layer);
            container.Add(new CuiPanel {
                RectTransform = {
                    AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-493 -293", OffsetMax = "497.5 293"
                }
                , Image = {
                    Color = "0.3773585 0.3755785 0.3755785 0.3407843", Material = "assets/icons/greyout.mat"
                }
            }
            , Layer, Layer + ".Main");
            container.Add(new CuiElement {
                Parent = Layer + ".Main", Components = {
                    new CuiTextComponent {
                        Text = $"Ивентарь ящика территории {Capture._data.captureName}", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 20, Font = "robotocondensed-bold.ttf"
                    }
                    , new CuiRectTransformComponent {
                        AnchorMin = "0 0.915", AnchorMax = $"1 1"
                    }
                    ,
                }
            }
            );
            if (Items == 0) {
                container.Add(new CuiElement {
                    Parent = Layer + ".Main", Components = {
                        new CuiTextComponent {
                            Text = $"Инвентарь к сожалению пуст :(", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 32, Font = "robotocondensed-bold.ttf"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0 0", AnchorMax = $"1 1"
                        }
                        ,
                    }
                }
                );
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = $"0.890915 0.01", AnchorMax = $"0.99379 0.067", OffsetMax = "0 0"
                    }
                    , Button = {
                        Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Close = Layer
                    }
                    , Text = {
                        Text = $"ЗАКРЫТЬ", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
                    }
                }
                , Layer + ".Main");
                container.Add(new CuiButton {
                    RectTransform = {
                        AnchorMin = $"0.77804 0.01", AnchorMax = $"0.880915 0.067", OffsetMax = "0 0"
                    }
                    , Button = {
                        Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Command = "UI_CAPTURE ReturnToMenu"
                    }
                    , Text = {
                        Text = $"НАЗАД", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
                    }
                }
                , Layer + ".Main");
                CuiHelper.DestroyUi(player, Layer);
                CuiHelper.AddUi(player, container);
                return;
            }
            for (int i = 0, y = 0, x = 0; i < 40; i++) {
                container.Add(new CuiPanel {
                    RectTransform = {
                        AnchorMin = $"{0.01 + (x * 0.123)} {0.76 - (y * 0.17)}", AnchorMax = $"{0.117 + (x * 0.123)} {0.92 - (y * 0.17)}"
                    }
                    , Image = {
                        Color = colored
                    }
                }
                , Layer + ".Main", Layer + ".Main" + $"Item{i}");
                if (Items - 1 >= i) {
                    var Item = containers.inventory.itemList.ElementAt(i);
                    container.Add(new CuiElement {
                        Parent = Layer + ".Main" + $"Item{i}", Components = {
                            new CuiImageComponent {
                                ItemId = FindItemID(Item.info.shortname), SkinId = 0
                            }
                            , new CuiRectTransformComponent {
                                AnchorMin = "0.1 0.1", AnchorMax = "0.9 0.9"
                            }
                        }
                    }
                    );
                    container.Add(new CuiButton {
                        RectTransform = {
                            AnchorMin = "0 0 ", AnchorMax = "1 1", OffsetMax = "-5 0", OffsetMin = "5 2"
                        }
                        , Button = {
                            Color = "0 0 0 0", Command = $"UI_CAPTURE TakeItemInventory {Capture._data.ResourseChest} {Item.info.shortname}"
                        }
                        , Text = {
                            Text = $"{Item.amount}" + "шт", Align = TextAnchor.LowerCenter, Font = "robotocondensed-regular.ttf", FontSize = 12
                        }
                    }
                    , Layer + ".Main" + $"Item{i}");
                }
                x++;
                if (x == 8) {
                    x = 0;
                    y++;
                }
            }
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = $"0.77804 0.01", AnchorMax = $"0.880915 0.067", OffsetMax = "0 0"
                }
                , Button = {
                    Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Command = "UI_CAPTURE ReturnToMenu"
                }
                , Text = {
                    Text = $"НАЗАД", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
                }
            }
            , Layer + ".Main");
            container.Add(new CuiButton {
                RectTransform = {
                    AnchorMin = $"0.890915 0.01", AnchorMax = $"0.99379 0.067", OffsetMax = "0 0"
                }
                , Button = {
                    Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Close = Layer
                }
                , Text = {
                    Text = $"ЗАКРЫТЬ", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
                }
            }
            , Layer + ".Main");
            CuiHelper.DestroyUi(player, Layer);
            CuiHelper.AddUi(player, container);
        }
#endregion
#region [ConsoleCommand]
        [ConsoleCommand("UI_CAPTURE")]
        private void CaptureUIHandler(ConsoleSystem.Arg args) {
            BasePlayer player = args?.Player();
            if (player == null || !args.HasArgs()) return;
            var clan = GetClanTag(player.userID);
            if (clan == null) return;
            switch (args.Args[0]) {
                case "OpenInventory" : {
                    var find = FindCaptureZoneDropBox(ulong.Parse(args.Args[1]));
                    if (find == null) return;
                    if (string.IsNullOrEmpty(clan)) {
                        player.ChatMessage("У вас нет клана.");
                        return;
                    }
                    if (find._data.nameClan != clan) {
                        player.ChatMessage("Данная территория находится не под вашем контролем.");
                        return;
                    }
                    StorageContainer container;
                    container = find._entity.GetComponent<StorageContainer>();
                    container.inventory.MarkDirty();
                    container.UpdateNetworkGroup();
                    CaptureZoneUI_Inventory(player, container, find);
                    break;
                }
                case "TakeItemInventory" : {
                    var find = FindCaptureZoneDropBox(ulong.Parse(args.Args[1]));
                    if (find == null || find._data.nameClan != clan) return;
                    StorageContainer container;
                    container = find._entity.GetComponent<StorageContainer>();
                    var findItem = container.inventory.itemList.FirstOrDefault(p => p.info.shortname == args.Args[2]);
                    if (findItem == null) return;
                    var item = ItemManager.CreateByName(findItem.info.shortname, findItem.amount, findItem.skin);
                    item.name = findItem.name;
                    item.MarkDirty();
                    player.GiveItem(item, BaseEntity.GiveItemReason.PickedUp);
                    findItem.RemoveFromContainer();
                    CaptureZoneUI_Inventory(player, container, find);
                    break;
                }
                case "ReturnToMenu" : {
                    CaptureZoneUI(player, 0);
                    break;
                }
                case "ChangePageCapture" : {
                    CaptureZoneUI(player, int.Parse(args.Args[1]));
                    break;
                }
            }
        }
#endregion
#region [Component]
        private CaptureManager FindCaptureZoneDistance(Vector3 pos) => _CaptureManager.Where(p => Vector3.Distance(p.transform.position, pos) < config._ZoneSettings.RadiusZone).FirstOrDefault();
        private CaptureManager FindCaptureZoneCupboard(ulong netID) => _CaptureManager.FirstOrDefault(p => p._data.Cupboard == netID);
        private CaptureManager FindCaptureZoneDropBox(ulong netID) => _CaptureManager.FirstOrDefault(p => p._data.ResourseChest == netID);
        private CaptureManager FindCaptureOtherClan(string nameClan) => _CaptureManager.FirstOrDefault(p => p.CaptureClan == nameClan);
        private static List<CaptureManager> _CaptureManager = new List<CaptureManager>();
        public class CaptureManager : MonoBehaviour {
            private List<BasePlayer> _Players;
            private MapMarkerGenericRadius mapMarker;
            private VendingMachineMapMarker vendingMarker;
            private SphereCollider sphereCollider;
            public CaptureData _data;
            public BaseEntity _entity;
            public bool _IsCapture = false;
            public int CaptureTime = 0;
            public string CaptureClan = string.Empty;
            private void Awake() {
                sphereCollider = gameObject.AddComponent<SphereCollider>();
                sphereCollider.gameObject.layer = (int)Rust.Layer.Reserved1;
                sphereCollider.isTrigger = true;
                sphereCollider.radius = config._ZoneSettings.RadiusZone;
                InvokeRepeating("Timer", 1f, 1f);
            }
            private void OnTriggerEnter(Collider other) {
                var target = other.GetComponentInParent<BasePlayer>();
                if (target == null || _Players.Contains(target)) return;
                var Text = _data.nameClan == string.Empty ? "Данная территория не захвачена, успей захватить" : $"Вы зашли в территорию {_data.captureName}.\nПод владением клана: {_data.nameClan}";
                target.ChatMessage($"{Text}");
                _Players.Remove(target);
            }
            private void OnTriggerExit(Collider other) {
                var target = other.GetComponentInParent<BasePlayer>();
                if (target == null && !_Players.Contains(target)) return;
                var Text = _data.nameClan == string.Empty ? "Вы вышли из территории которая не захвачена, успей захватить" : $"Вы вышли из территории {_data.captureName}.\nПод владением клана: {_data.nameClan}";
                target.ChatMessage($"{Text}");
                _Players.Remove(target);
            }
            public void Init(CaptureData data, BaseEntity entity) {
                _data = data;
                _entity = entity;
                _Players = new List<BasePlayer>();
                if (Facepunch.Math.Epoch.Current - _data.lastCapture < config._ZoneSettings.CaptureCooldown) AddMarker(config._MarkerInGameSettings.markerColorCantCapture);
                else AddMarker(config._MarkerInGameSettings.markerColorCanCapture);
            }
            private void Timer() {
                if (_IsCapture) {
                    bool HavePlayerCapture = false;
                    var _clanList = plugin.GetClanMembers(CaptureClan);
                    if (_clanList == null || _clanList == new List<string>()) {
                        CaptureClan = string.Empty;
                        _IsCapture = false;
                        CaptureTime = 0;
                        return;
                    }
                    foreach (var key in _clanList) {
                        var id = Convert.ToUInt64(key);
                        var memberClan = BasePlayer.FindByID(id);
                        if (memberClan == null || !memberClan.IsConnected) continue;
                        if (Vector3.Distance(memberClan.transform.position, transform.position) < config._ZoneSettings.RadiusCapture) {
                            HavePlayerCapture = true;
                            break;
                        }
                    }
                    if (!HavePlayerCapture) {
                        CaptureClan = string.Empty;
                        _IsCapture = false;
                        CaptureTime = 0;
                        foreach (var key in _clanList) {
                            var id = Convert.ToUInt64(key);
                            var memberClan = BasePlayer.FindByID(id);
                            if (memberClan == null || !memberClan.IsConnected) continue;
                            if (config.useMenuAlerts) {
                                plugin.MenuAlerts?.Call("RemoveAlertMenu", memberClan, $"{plugin.Name}");
                            }
                            else {
                                CuiHelper.DestroyUi(memberClan, "CaptureUI");
                                if (plugin.openUI.Contains(memberClan.userID)) plugin.openUI.Remove(memberClan.userID);
                            }
                            memberClan.ChatMessage("Ваш клан ушел слишком далеко.Ваш захват сбит, начните захват заново!");
                        }
                        AddMarker(config._MarkerInGameSettings.markerColorCanCapture);
                    }
                    CaptureTime++;
                    if (CaptureTime >= config._ZoneSettings.CaputureSecond) {
                        FinishCapture();
                    }
                    else {
                        if (!config.useMenuAlerts) {
                            foreach (var key in _clanList) {
                                var id = Convert.ToUInt64(key);
                                var memberClan = BasePlayer.FindByID(id);
                                if (memberClan == null || !memberClan.IsConnected) continue;
                                if (plugin.openUI.Contains(memberClan.userID)) plugin.CaptureZoneInfoUpdate(memberClan, this);
                            }
                        }
                    }
                }
                if (Facepunch.Math.Epoch.Current - _data.lastCapture == config._ZoneSettings.CaptureCooldown && !_IsCapture) {
                    plugin.Server.Broadcast($"<color=#ffde5a>ВНИМАНИЕ!</color>\n<size=12>Территорию <color=#ffde5a>{_data.captureName}</color> можно снова захватить!");
                    mapMarker.color1 = ConvertToColor(config._MarkerInGameSettings.markerColorCanCapture);
                }
                mapMarker.SendUpdate();
            }
            public void StartCapture(String tag, BasePlaye
// ... [Code preview truncated due to length. Full source in attached file] ...

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