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

FREE IQGradeRemove : 2.24.30 2.24.30

Нет прав для скачивания
C#:
using System.Collections;
using System.Linq;
using Newtonsoft.Json;
using System.Collections.Generic;
using System;
using Oxide.Game.Rust.Cui;
using Object = System.Object;
using Oxide.Core.Plugins;
using UnityEngine;
using UnityEngine.Networking;
using Oxide.Core;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace Oxide.Plugins {
    [Info("IQGradeRemove", "Mercury", "2.24.30")]
    [Description("IQGradeRemove")]
    public class IQGradeRemove : RustPlugin {
        private const Boolean LanguageEn = false;
        private String Format(Int32 units, String form) {
            Int32 tmp = units % 10;
            if (units >= 5 && units <= 20 || tmp >= 5 && tmp <= 9) return $"{units}{form}";
            if (tmp >= 2 && tmp <= 4) return $"{units}{form}";
            return $"{units}{form}";
        }
        private void ChatCMDRemove(BasePlayer player) {
            ControllerGradeRemove(player, "5");
            if (!config.useInstructionAlert) return;
            if (playerAlerRemove.Contains(player)) return;
            MessageGameTipsError(player, GetLang("UPGRADE_REMOVE_USE_INSTRUCTION", player.UserIDString));
            playerAlerRemove.Add(player);
        }
        private Dictionary<UInt64, Double> TemporaryBlockBuild = new Dictionary<UInt64, Double>();
        public Boolean IsRaidBlocked(BasePlayer player) {
            Object canTeleportResult = Interface.Call("CanTeleport", player);
            String ret = canTeleportResult as String;
            Object isRB = Interface.Call("IsRaidBlocked", player);
            Boolean isRaidBlocked = isRB as Boolean? ?? false;
            return ret != null || isRaidBlocked;
        }
        private static ImageUI _imageUI;
        private void SetupBlockBuild(String userID, TypeBlock typeBlock, UInt64 buildNetID) {
            Dictionary<UInt64, Double> BlockList = typeBlock == TypeBlock.Temporary ? TemporaryBlockBuild : FullBlockBuild;
            if (!BlockList.ContainsKey(buildNetID)) BlockList[buildNetID] = GetTimeBlock(userID, typeBlock);
        }
        private void Init() {
            ReadData();
            _ = this;
        }
        private class Configuration {
            [JsonProperty(LanguageEn ? "Duration of the selected element (improvement/removal) in seconds" : "Время действия выбранного элемента (улучшени/удаления) в секундах")]
            public Int32 ConfigActiveGradeRemove;
            internal class UpgradePreset {
                [JsonProperty(LanguageEn ? "Allow upgrade remove after recent damage" : "Разрешить улучшение постройки после недавно нанесенного урона")]
                public Boolean UpgradeSecondsAttacks;
                [JsonProperty(LanguageEn ? "Require the structure to be repaired before upgrading it if it does not have full durability" : "Требовать починить строение перед его улучшением, если у строения не полное количество прочности")]
                public Boolean RepairToGrade;
                [JsonProperty(LanguageEn ? "Disable upgrade during raid block" : "Запретить улучшение во время рейдблока")]
                public Boolean NoGradeRaidBlock;
                [JsonProperty(LanguageEn ? "Allow rolling back upgrade-level (Example : stone to wood)" : "Разрешить откатывать улучшение назад (Например : камень в дерево)")]
                public Boolean BackUpgrade;
                [JsonProperty(LanguageEn ? "Return resources when rolling back an upgrade (if metal - into wood - N% of metal resources will be returned)" : "Возвращать ресурсы при откате улучшения назад (если металл - в дерево - будет возвращен N% ресурсов металла)")]
                public Boolean BackUpgradeReturnedItem;
                [JsonProperty(LanguageEn ? "Indicate the percentage of resource return when rolling back the upgrade" : "Укажите % возврата ресурсов при откате улучшения")]
                public Int32 BackUpgradeReturnedItemPercent;
                [JsonProperty(LanguageEn ? "Cooldown settings before upgrade a new object" : "Настройка перезарядки перед улучшением нового объекта")]
                public CooldownController CooldownUpgrade = new CooldownController();
            }
            [JsonProperty(LanguageEn ? "Remove the UI when the player has passed all stages of improvement - or will be looped (there will be no looping if the player does not have rights to a particular element with the support of rights to elements enabled)" : "Удалять интерфейс когда игрок пройдет все этапы улучшения - либо будет зациклено (зацикливание не будет если у игрока нет прав на тот или иной элемент при включенной поддержке прав на элементы)")]
            public Boolean ConfigResetInterface;
            [JsonProperty(LanguageEn ? "Upgrade settings" : "Настройка улучшения")]
            public UpgradePreset UpgradePresets = new UpgradePreset();
            [JsonProperty(LanguageEn ? "Enable support for rights for each element separately (rights are issued separately for each variation)" : "Включить поддержку прав на каждый элемент отдельно (права выдаются отдельно под каждую вариацию)")]
            public Boolean IsCheckPermission;
            public static Configuration GetNewConfiguration() {
                return new Configuration {
                    useInstructionAlert = false, UseDistanceFunc = false, ConfigResetInterface = true, ConfigActiveGradeRemove = 60, IsCheckPermission = false, InterfaceControllers = new InterfaceController() {
                        StaticPanel = new InterfaceController.Coordinates() {
                            AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "58.333 25", OffsetMax = "335.667 73"
                        }
                        , TypeElement = new InterfaceController.TypeElements() {
                            OffsetBetweenElements = -44.5f, SizeSelectedElement = "21.333", TypesElements = new InterfaceController.Coordinates() {
                                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-132 -17.333", OffsetMax = "-97 17.333",
                            }
                        }
                        , AllObject = new InterfaceController.AllObjects {
                            AllObjectsButton = new InterfaceController.Coordinates {
                                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-188.46712 -24", OffsetMax = "-140.467 24"
                            }
                            , SizeSelectedElement = "21.333",
                        }
                        , TimerElements = new InterfaceController.TimerElement() {
                            TimerPosition = new InterfaceController.Coordinates() {
                                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "90.878 -18.828", OffsetMax = "137.255 18.828",
                            }
                            , SizeTimer = 30,
                        }
                    }
                    , CommandsList = new CommandPresets() {
                        UpgradeCommands = new List<String>() {
                            "up", "upgrade", "grade", "bgrade"
                        }
                        , RemoveCommands = new List<String>() {
                            "remove", "rem",
                        }
                    }
                    , UpgradePresets = new UpgradePreset() {
                        UpgradeSecondsAttacks = false, RepairToGrade = true, NoGradeRaidBlock = true, BackUpgrade = false, BackUpgradeReturnedItem = false, BackUpgradeReturnedItemPercent = 50, CooldownUpgrade = new CooldownController() {
                            UseCooldown = false, SecondCooldown = 30,
                        }
                    }
                    , RemovePresets = new RemovePreset() {
                        RemoveSecondsAttacks = false, NoRemoveRaidBlock = true, RemoveOnlyFriends = false, NoRemoveItems = new List<String>() {
                            "shortname.example"
                        }
                        , CooldownRemove = new CooldownController() {
                            UseCooldown = false, SecondCooldown = 30,
                        }
                        , TemporaryBlockBuildRemove = new RemovePreset.BlockRemoveBuilding() {
                            UseBlock = false, TimeRemove = 600, PermissionTime = new Dictionary<String, Int32>() {
                                ["iqgraderemove.elite"]
                                = 100, ["iqgraderemove.vip"] = 300,
                            }
                        }
                        , FullBlockBuildRemove = new RemovePreset.BlockRemoveBuilding() {
                            UseBlock = false, TimeRemove = 600, PermissionTime = new Dictionary<String, Int32>() {
                                ["iqgraderemove.elite"]
                                = 1500, ["iqgraderemove.vip"] = 1000,
                            }
                        }
                        , ReturnedRemoveSettings = new RemovePreset.ReturnedSettings() {
                            ItemsSettings = new RemovePreset.ReturnedSettings.Items {
                                UseReturnedItem = true, UsePercentHealts = true, PercentReturn = 100, UseDamageReturned = true, ShortnameNoteReturned = new List<String>() {
                                    "shortname.example",
                                }
                            }
                            , BuildingSettings = new RemovePreset.ReturnedSettings.Building() {
                                UseReturned = true, UsePercentHealts = true, PercentReturn = 100,
                            }
                        }
                    }
                }
                ;
            }
            [JsonProperty(LanguageEn ? "Use notifications with instructions when using a chat command to delete or improve" : "Использовать уведомления с инструкцией при использовании чат команды на удаление или улучшение")]
            public Boolean useInstructionAlert;
            internal class CommandPresets {
                [JsonProperty(LanguageEn ? "List of commands to upgrade" : "Список команд для улучшения")]
                public List<String> UpgradeCommands = new List<String>();
                [JsonProperty(LanguageEn ? "List of commands to remove" : "Список команд для удаления")]
                public List<String> RemoveCommands = new List<String>();
            }
            [JsonProperty(LanguageEn ? "Setting Commands for functions" : "Настройка команд для функций")]
            public CommandPresets CommandsList = new CommandPresets();
            [JsonProperty(LanguageEn ? "Setting UI" : "Настройка UI")]
            public InterfaceController InterfaceControllers = new InterfaceController();
            [JsonProperty(LanguageEn ? "Allow remote upgrade/remove (just hit with a mallet next to the object) (grant rights)" : "Разрешить дистанционное улучшение/удаление (достаточно просто рядом с объектом ударить киянкой) (выдайте права)")]
            public Boolean UseDistanceFunc;
            internal class RemovePreset {
                [JsonProperty(LanguageEn ? "Allow building remove after recent damage" : "Разрешить удаление постройки после недавно нанесенного урона")]
                public Boolean RemoveSecondsAttacks;
                [JsonProperty(LanguageEn ? "Disable remove during raid block" : "Запретить удаление во время рейдблока")]
                public Boolean NoRemoveRaidBlock;
                [JsonProperty(LanguageEn ? "Only friends can remove structures (otherwise, anyone who has access to the cupboard)" : "Удалять постройки могут только друзья (Иначе все,кто есть в шкафу)")]
                public Boolean RemoveOnlyFriends;
                [JsonProperty(LanguageEn ? "Items that cannot be removed (Shortname)" : "Предметы, которые нельзя удалить (Shortname)")]
                public List<String> NoRemoveItems = new List<String>();
                [JsonProperty(LanguageEn ? "Cooldown settings before removing a new object" : "Настройка перезарядки перед удалением нового объекта")]
                public CooldownController CooldownRemove = new CooldownController();
                [JsonProperty(LanguageEn ? "Temporary construction removal restriction (Exapmle : After placing the object, it won't be possible to remove it for a certain amount of time)" : "Временный запрет на удаление постройки (Например : После установки объекта, его N количество времени нельзя будет удалить)")]
                public BlockRemoveBuilding TemporaryBlockBuildRemove = new BlockRemoveBuilding();
                [JsonProperty(LanguageEn ? "Complete prohibition of object removal (For example: After 3 hours of placing the object, it cannot be removed at all)" : "Полный запрет на удаление объекта (Например : Через 3 часа после установки объекта, его нельзя будет удалить вообще)")]
                public BlockRemoveBuilding FullBlockBuildRemove = new BlockRemoveBuilding();
                [JsonProperty(LanguageEn ? "Resource and item return settings after deletion" : "Настройка возврата ресурсов и предметов после удаления")]
                public ReturnedSettings ReturnedRemoveSettings = new ReturnedSettings();
                internal class BlockRemoveBuilding {
                    [JsonProperty(LanguageEn ? "Use lock function" : "Использовать функцию блокировки")]
                    public Boolean UseBlock;
                    [JsonProperty(LanguageEn ? "Time in seconds" : "Время в секундах")]
                    public Int32 TimeRemove;
                    [JsonProperty(LanguageEn ? "Privilege-based configuration [iqgraderemove.name = time (in seconds)]" : "Настройка по привилегиям [iqgraderemove.name = время (в секундах)]")]
                    public Dictionary<String, Int32> PermissionTime = new Dictionary<String, Int32>();
                }
                internal class ReturnedSettings {
                    [JsonProperty(LanguageEn ? "Resource return settings for building deletion" : "Настройка возврата ресурсов за удаление строений")]
                    public Building BuildingSettings = new Building();
                    [JsonProperty(LanguageEn ? "Resource/item return settings for item deletion" : "Настройка возврата ресурсов/предметов за удаление предметов")]
                    public Items ItemsSettings = new Items();
                    internal class Building {
                        [JsonProperty(LanguageEn ? "Enable resource return for building deletion" : "Возвращать ресурсы за удаление строений")]
                        public Boolean UseReturned;
                        [JsonProperty(LanguageEn ? "Use return percentage based on building durability (disregards 'Resource return percentage for building deletion')" : "Использовать процент возврата в зависимости от количество прочности строения (не будет учитываться пункт 'Процент возврата ресурсов за удаление строений')")]
                        public Boolean UsePercentHealts;
                        [JsonProperty(LanguageEn ? "Resource return percentage for building deletion (regardless of building durability)" : "Процент возврата ресурсов за удаление строений (вне зависимости от количества прочности строения)")]
                        public Int32 PercentReturn;
                    }
                    internal class Items {
                        [JsonProperty(LanguageEn ? "Return items after deletion, otherwise return % of item's resources (if craftable)" : "Возвращать предметы после удаления, иначе будет возвращаться % ресурсов от предмета (если его возможно крафтить)")]
                        public Boolean UseReturnedItem;
                        [JsonProperty(LanguageEn ? "Use return percentage based on item durability (disregards 'Resource return percentage for item deletion')" : "Использовать процент возврата в зависимости от количество прочности строения (не будет учитываться пункт 'Процент возврата ресурсов за удаление предмета')")]
                        public Boolean UsePercentHealts;
                        [JsonProperty(LanguageEn ? "Resource return percentage for item deletion (if percentage return is enabled)" : "Процент возврата ресурсов за удаление предмета (если включен возврат процента)")]
                        public Int32 PercentReturn;
                        [JsonProperty(LanguageEn ? "Reduce item condition upon return" : "Снижать состояние предмета при возврате")]
                        public Boolean UseDamageReturned;
                        [JsonProperty(LanguageEn ? "Items to be ignored after deletion - they will simply be deleted without any return of items or resources (Shortname)" : "Предметы, которые игнорируются после удаления - они просто удалятся без возврата предмета или ресурсов (Shortname)")]
                        public List<String> ShortnameNoteReturned = new List<String>();
                    }
                }
            }
            [JsonProperty(LanguageEn ? "Remove settings" : "Настройка удаления")]
            public RemovePreset RemovePresets = new RemovePreset();
            internal class CooldownController {
                [JsonProperty(LanguageEn ? "Use cooldown before action" : "Использовать перезарядку перед действием")]
                public Boolean UseCooldown;
                [JsonProperty(LanguageEn ? "Time in seconds" : "Время в секундах")]
                public Single SecondCooldown;
            }
            internal class InterfaceController {
                internal class TimerElement {
                    [JsonProperty(LanguageEn ? "Setting the timer position" : "Настройка расположения таймера")]
                    public Coordinates TimerPosition = new Coordinates();
                    [JsonProperty(LanguageEn ? "Timer text size" : "Размер текста таймера")]
                    public Int32 SizeTimer;
                }
                [JsonProperty(LanguageEn ? "Setting the 'All' element" : "Настройка элемента 'All'")]
                public AllObjects AllObject = new AllObjects();
                internal class TypeElements {
                    [JsonProperty(LanguageEn ? "Customize the user interface of the active type (wood/stone, etc.)" : "Настройка UI активных типов (дерево/камень и т.д)")]
                    public Coordinates TypesElements = new Coordinates();
                    [JsonProperty(LanguageEn ? "Spacing between elements" : "Отступы между элементами")]
                    public Single OffsetBetweenElements;
                    [JsonProperty(LanguageEn ? "Element stroke size" : "Размер обводки выбранного элемента")]
                    public String SizeSelectedElement;
                }
                [JsonProperty(LanguageEn ? "Setting up the main panel UI" : "Настройка UI главной панели")]
                public Coordinates StaticPanel = new Coordinates();
                internal class Coordinates {
                    public String AnchorMin;
                    public String AnchorMax;
                    public String OffsetMin;
                    public String OffsetMax;
                }
                internal class AllObjects {
                    [JsonProperty(LanguageEn ? "Buttonn stroke size" : "Размер обводки кнопки")]
                    public String SizeSelectedElement;
                    [JsonProperty(LanguageEn ? "Setting up the 'All' button" : "Настройка кнопки 'All'")]
                    public Coordinates AllObjectsButton = new Coordinates();
                }
                [JsonProperty(LanguageEn ? "Setting up controls" : "Настройка элементов управления")]
                public TypeElements TypeElement = new TypeElements();
                [JsonProperty(LanguageEn ? "Setting up timers" : "Настройка таймера")]
                public TimerElement TimerElements = new TimerElement();
            }
        }
        void ReadData() {
            TemporaryBlockBuild = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, Double>>("IQSystem/IQGradeRemove/TemporaryBlockBuilding");
            FullBlockBuild = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, Double>>("IQSystem/IQGradeRemove/FullBlockBuilding");
        }
        String CanRemove(BasePlayer player, BaseEntity entity) {
            Configuration.RemovePreset RemoveConfig = config.RemovePresets;
            LocalRepositoryUser repository = LocalRepository[player];
            Object canRemove = Interface.Call("canRemove", player, entity);
            if (canRemove != null) return canRemove is String ? (String)canRemove : GetLang("REMOVE_NOT_REMOVE_OBJECT", player.UserIDString);
            if(entity.OwnerID == 0) return GetLang("REMOVE_NOT_REMOVE_ALIEN_OBJECT", player.UserIDString);
            if (RemoveConfig.NoRemoveRaidBlock && IsRaidBlocked(player)) return GetLang("REMOVE_NO_ESCAPE", player.UserIDString);
            Double CooldownTime = repository.GetCooldownTime();
            if (CooldownTime > 0) return GetLang("REMOVE_TIME_EXECUTE", player.UserIDString, FormatTime(TimeSpan.FromSeconds(CooldownTime), player.UserIDString));
            if(IQTurret) {
                if(entity is ElectricSwitch) if ((Boolean)IQTurret.CallHook("API_IS_TURRETLIST", entity)) return GetLang("REMOVE_IQTURRET_NO_DELETE_TUMBLER", player.UserIDString);
            }
            BuildingBlock buildingBlocks = entity as BuildingBlock;
            if (buildingBlocks != null) {
                if (!config.RemovePresets.RemoveSecondsAttacks && buildingBlocks.SecondsSinceAttacked < 30) return GetLang("REMOVE_SINCE_ATTACKED_BLOCK", player.UserIDString, FormatTime(TimeSpan.FromSeconds(30 - (Int32)buildingBlocks.SecondsSinceAttacked), player.UserIDString));
            }
            BuildingPrivlidge privilege = player.GetBuildingPrivilege(player.WorldSpaceBounds());
            if (RemoveConfig.RemoveOnlyFriends && player.userID != entity.OwnerID) {
                if (!IsFriends(player, entity.OwnerID) || player.IsBuildingBlocked()) return GetLang("REMOVE_NOT_REMOVE_ALIEN_OBJECT", player.UserIDString);
            }
            else if (privilege != null && !player.IsBuildingAuthed()) return GetLang("REMOVE_NOT_REMOVE_ALIEN_OBJECT", player.UserIDString);
            else if(privilege == null && entity.OwnerID != player.userID) return GetLang("REMOVE_NOT_REMOVE_ALIEN_OBJECT", player.UserIDString);
            Int32 TemporaryTimeBlock = Convert.ToInt32(GetTimeBlockBuild(TypeBlock.Temporary, entity.net.ID.Value));
            if (RemoveConfig.TemporaryBlockBuildRemove.UseBlock && TemporaryTimeBlock > 0) return GetLang("REMOVE_TIME_EXECUTE", player.UserIDString, FormatTime(TimeSpan.FromSeconds(TemporaryTimeBlock), player.UserIDString));
            Int32 FullTimeBlock = Convert.ToInt32(GetTimeBlockBuild(TypeBlock.Full, entity.net.ID.Value));
            if (RemoveConfig.FullBlockBuildRemove.UseBlock && FullTimeBlock < 0) return GetLang("REMOVE_FULL_BLOCK_REMOVE", player.UserIDString);
            return RemoveConfig.NoRemoveItems.Contains(Regex.Replace(entity.ShortPrefabName.Replace("mining_quarry", "mining.quarry"), "\\.deployed|_deployed", "")) ? GetLang("REMOVE_NOT_REMOVE_OBJECT", player.UserIDString) : "";
        }
        [ConsoleCommand("upgrade.func")]
        private void UpgradeFuncCMD(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            LocalRepository[player].ActionAssignment(player, Convert.ToInt32(arg.Args[0]));
        }
        [ConsoleCommand("func.turn.all.objects")]
        private void FuncCommandAllObjects(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            LocalRepositoryUser localRepositoryUser = LocalRepository[player];
            if (!localRepositoryUser.HasAllObjectsPermission(player)) return;
            localRepositoryUser.TurnedAllObjects(player);
        }
        private void AllObjectAction(BasePlayer player, BaseEntity entity) {
            LocalRepositoryUser repository = LocalRepository[player];
            Boolean IsAllObjects = repository.IsAllObjects(player);
            if (!IsAllObjects) return;
            List<BuildingBlock> buildingBlocks = Facepunch.Pool.GetList<BuildingBlock>();
            buildingBlocks = GetBlocks(player, entity);
            if (buildingBlocks == null) return;
            if (repository.selectedType == ActionType.Remove) {
                if (!permission.UserHasPermission(player.UserIDString, PermissionsAllObjectsRemove)) {
                    MessageGameTipsError(player, GetLang("NO_PERMISSION", player.UserIDString));
                    return;
                }
                foreach (BuildingBlock Block in buildingBlocks) Block.Kill();
            }
            else if (repository.selectedType != ActionType.None && repository.selectedType != ActionType.Remove) {
                BuildingGrade.Enum gradeType = (BuildingGrade.Enum)repository.GetGradeLevel;
                List<BuildingBlock> blocksToChange = buildingBlocks.Where(block => block.grade != gradeType && (permission.UserHasPermission(player.UserIDString, PermissionAllObjectsBack) || config.UpgradePresets.BackUpgrade || repository.GetGradeLevel > (Int32)block.grade)).ToList();
                IEnumerator processUpgradeBlocks = ProcessUpgradeBlocks(blocksToChange, gradeType, player);
                if(RoutineUpgradeAllPlayers.ContainsKey(player)) if (RoutineUpgradeAllPlayers[player] != null) ServerMgr.Instance.StopCoroutine(RoutineUpgradeAllPlayers[player]);
                Coroutine upgradeAllRoutine = ServerMgr.Instance.StartCoroutine(processUpgradeBlocks);
                RoutineUpgradeAllPlayers[player] = upgradeAllRoutine;
                repository.ResetTimer(player);
            }
            Facepunch.Pool.FreeList(ref buildingBlocks);
        }
        Object OnStructureRepair(BaseCombatEntity entity, BasePlayer player) {
            if (entity == null || player == null) return null;
            if (LocalRepository[player].selectedType != ActionType.Remove && LocalRepository[player].selectedType != ActionType.None && !config.UpgradePresets.RepairToGrade) return false;
            if (LocalRepository[player].selectedType == ActionType.Remove) return false;
            return null;
        }
        private void ControllerGradeRemove(BasePlayer player, String ArgNumber = "") {
            if (String.IsNullOrWhiteSpace(ArgNumber)) {
                LocalRepository[player].ActionAssignment(player);
                return;
            }
            if (!Int32.TryParse(ArgNumber, out Int32 actionType)) return;
            LocalRepository[player].ActionAssignment(player, actionType);
        }
        private void OnPlayerConnected(BasePlayer player) => RegisteredPlayer(player);
        private String FormatTime(TimeSpan time, String userID) {
            StringBuilder result = new StringBuilder();
            if (time.Days > 0) result.Append(Format(time.Days, GetLang("FORMAT_TIME_DAY", userID)));
            if (time.Hours > 0) result.Append($" {Format(time.Hours, GetLang("FORMAT_TIME_HOURSE", userID))}");
            if (time.Minutes > 0) result.Append($" {Format(time.Minutes, GetLang("FORMAT_TIME_MINUTES", userID))}");
            if (time.Days == 0 && time.Hours == 0 && time.Minutes == 0 && time.Seconds > 0) result.Append($" {Format(time.Seconds, GetLang("FORMAT_TIME_SECONDS", userID))}");
            return result.ToString().Trim();
        }
        private Int32 GetFilteredCollidersCount(Collider[] colliders, int count) {
            return colliders.Take(count).Count(x => x.name.Contains("assets") && !x.name.Contains("building") && !x.name.Contains("player"));
        }
        private UInt64[] GetFriendList(BasePlayer targetPlayer) {
            List<UInt64> FriendList = new List<UInt64>();
            if (Friends) {
                if (Friends?.Call("GetFriends", targetPlayer.userID) is UInt64[] frinedList) FriendList.AddRange(frinedList);
            }
            if (Clans) {
                if (Clans?.Call("GetClanMembers", targetPlayer.UserIDString) is UInt64[] ClanMembers) FriendList.AddRange(ClanMembers);
            }
            if(targetPlayer.Team != null) FriendList.AddRange(targetPlayer.Team.members);
            return FriendList.ToArray();
        }
        private Double GetTimeBlockBuild(TypeBlock typeBlock, UInt64 buildNetID) {
            Dictionary<UInt64, Double> BlockList = typeBlock == TypeBlock.Temporary ? TemporaryBlockBuild : FullBlockBuild;
            return BlockList.TryGetValue(buildNetID, out Double timeBlock) ? timeBlock - CurrentTime : 0;
        }
        Int32 API_GET_GRADE_LEVEL_PLAYER(BasePlayer player) {
            if (player == null) return 0;
            if (!LocalRepository.ContainsKey(player)) return 0;
            return (Int32)LocalRepository[player].selectedType;
        }
        private const String PermissionsUpMetal = "iqgraderemove.upmetal";
        private String GetLang(String LangKey, String userID = null, params Object[] args) {
            sb.Clear();
            if (args == null) return lang.GetMessage(LangKey, this, userID);
            sb.AppendFormat(lang.GetMessage(LangKey, this, userID), args);
            return sb.ToString();
        }
        private const String PermissionsUpStone = "iqgraderemove.upstones";
        private const String PermissionsAllObjects = "iqgraderemove.allobjects";
        void OnHammerHit(BasePlayer player, HitInfo info) {
            if (info == null || player == null || info.HitEntity == null) return;
            LocalRepositoryUser repositoryUser = LocalRepository[player];
            BaseEntity hitEntity = info.HitEntity;
            if (repositoryUser.IsAllObjects(player)) {
                AllObjectAction(player, hitEntity);
                return;
            }
            if (repositoryUser.selectedType == ActionType.Remove) RemoveHit(player, hitEntity, repositoryUser);
            else if(repositoryUser.selectedType != ActionType.Remove && repositoryUser.selectedType != ActionType.None) UpgradeHit(player, hitEntity, repositoryUser);
        }
        private String NormalizePrefabName(String prefabName) {
            foreach (KeyValuePair<String, String> replacement in PrefabNameNormalized) prefabName = prefabName.Replace(replacement.Key, replacement.Value);
            return Regex.Replace(prefabName, "\\.deployed|_deployed", "");
        }
        private void DrawUI_Button_AllObject(BasePlayer player, Boolean TurnedAllObject) {
            if (_interface == null) return;
            String Interface = InterfaceBuilder.GetInterface("UI_AllObject_Button");
            if (Interface == null) return;
            Interface = Interface.Replace("%ALL_BUTTON%", "func.turn.all.objects");
            CuiHelper.AddUi(player, Interface);
            if(TurnedAllObject) DrawUI_Button_AllObject_Selectel(player);
        }
        private Dictionary<UInt64, Double> FullBlockBuild = new Dictionary<UInt64, Double>();
        object OnPayForUpgrade(BasePlayer player, BuildingBlock block, ConstructionGrade gradeTarget) {
            if (permission.UserHasPermission(player.UserIDString, PermissionGRNoResource)) return false;
            return null;
        }
        private void ConsoleCMDUp(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            ControllerGradeRemove(player);
        }
        private readonly Dictionary<String, String> PrefabNameNormalized = new Dictionary<String, String>() {
            ["mining_quarry"]
            = "mining.quarry", ["refinery_small"] = "small.oil.refinery", ["water_catcher_large"] = "water.catcher.large", ["water_catcher_small"] = "water.catcher.small", ["small_stash_deployed"] = "stash.small", ["stocking_small_deployed"] = "stocking.small", ["stocking_large_deployed"] = "stocking.large", ["landmine"] = "trap.landmine", ["survivalfishtrap.deployed"] = "fishtrap.small", ["survivalfishtrap.deployed"] = "fishtrap.small", ["waterpurifier.deployed"] = "water.purifier", ["electric.windmill.small"] = "generator.wind.scrap", ["wall.external.high.wood"] = "wall.external.high", ["barricade.cover.wood"] = "barricade.wood.cover",
        }
        ;
        Object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) {
            BuildingBlock buildingBlock = entity as BuildingBlock;
            if (buildingBlock == null) return null;
            if(entity.prefabID is 135948323 or 3594832) return null;
            String canUpgrade = CanUpgrade(player, buildingBlock, LocalRepository[player], grade);
            if (String.IsNullOrWhiteSpace(canUpgrade)) {
                UInt64 SkinBuilding = GetBuildingSkin(player, grade);
                buildingBlock.SetHealthToMax();
                if (grade == BuildingGrade.Enum.Metal && SkinBuilding == 10221) buildingBlock.SetCustomColour(player.LastBlockColourChangeId);
                return null;
            }
            MessageGameTipsError(player, canUpgrade);
            return true;
        }
        private void ChatCMDUp(BasePlayer player, String cmd, String[] args) {
            if (args.Length >= 1) ControllerGradeRemove(player, args[0]);
            else ControllerGradeRemove(player);
            if (!config.useInstructionAlert) return;
            if (playerAlerUp.Contains(player)) return;
            MessageGameTipsError(player, GetLang("UPGRADE_UP_USE_INSTRUCTION", player.UserIDString));
            playerAlerUp.Add(player);
        }
        private enum ActionType {
            None, Wood, Stone, Metal, Hqm, Remove,
        }
        private Boolean CheckNearbyCollider(BuildingBlock block) {
            Collider[] colliders = new Collider[30];
            Int32 colliderCount = Physics.OverlapSphereNonAlloc(block.CenterPoint() + new Vector3(0f, 0f, 0f), 2f, colliders);
            Int32 FilteredCountFloor = GetFilteredCollidersCount(colliders, colliderCount);
            return FilteredCountFloor < 1;
        }
        private Dictionary<BasePlayer, LocalRepositoryUser> LocalRepository = new Dictionary<BasePlayer, LocalRepositoryUser>();
        private void OnServerInitialized() {
            if (config.CommandsList.UpgradeCommands.Count == 0) {
                PrintWarning(LanguageEn ? "You don't have upgrade commands, the plugin can't work" : "У вас не указаны команды для улучшения, плагин не может работать");
                Interface.Oxide.UnloadPlugin(Name);
                return;
            }
            if (config.CommandsList.UpgradeCommands.Count == 0) {
                PrintWarning(LanguageEn ? "You don't have remove commands, the plugin can't work" : "У вас не указаны команды для удаления, плагин не может работать");
                Interface.Oxide.UnloadPlugin(Name);
                return;
            }
            _imageUI = new ImageUI();
            _imageUI.DownloadImage();
            if (!config.UseDistanceFunc) Unsubscribe("OnPlayerInput");
            RegisteredPermissions();
            foreach (String upgradeCommand in config.CommandsList.UpgradeCommands) {
                cmd.AddChatCommand(upgradeCommand, this, nameof(ChatCMDUp));
                cmd.AddConsoleCommand(upgradeCommand, this, nameof(ConsoleCMDUp));
            }
            foreach (String removeCommand in config.CommandsList.RemoveCommands) {
                cmd.AddChatCommand(removeCommand, this, nameof(ChatCMDRemove));
                cmd.AddConsoleCommand(removeCommand, this, nameof(ConsoleCMDRemove));
            }
            foreach (BasePlayer player in BasePlayer.activePlayerList) OnPlayerConnected(player);
        }
        private void Unload() {
            InterfaceBuilder.DestroyAll();
            WriteData();
            if (_imageUI != null) {
                _imageUI.UnloadImages();
                _imageUI = null;
            }
            if(RoutineUpgradeAllPlayers != null && RoutineUpgradeAllPlayers.Count != 0) foreach (KeyValuePair<BasePlayer, Coroutine> routineUpgradeAllPlayer in RoutineUpgradeAllPlayers) {
                if(routineUpgradeAllPlayer.Value != null) ServerMgr.Instance.StopCoroutine(routineUpgradeAllPlayer.Value);
            }
            _ = null;
        }
        private const String PermissionsUpWood = "iqgraderemove.upwood";
        private void HandleBuildingReturn(BasePlayer player, StabilityEntity buildingBlock, Configuration.RemovePreset.ReturnedSettings.Building BuildingSettings) {
            Single PercentReturn = BuildingSettings.UsePercentHealts ? buildingBlock.health / buildingBlock.MaxHealth() : BuildingSettings.PercentReturn / 100.0f;
            foreach (ItemAmount CostReturned in buildingBlock.BuildCost()) {
                Int32 amount = Mathf.FloorToInt(CostReturned.amount * PercentReturn);
                if (amount <= 0) continue;
                player.GiveItem(ItemManager.Create(CostReturned.itemDef, amount));
            }
        }
        private class InterfaceBuilder {
            public static InterfaceBuilder Instance;
            public const String UI_GREADE_REMOVE_OVERLAY = "UI_GREADE_REMOVE_OVERLAY";
            public Dictionary<String, String> Interfaces;
            public InterfaceBuilder() {
                Instance = this;
                Interfaces = new Dictionary<String, String>();
                Building_Static_Panel();
                Building_TypeElement();
                Building_Selectel();
                Building_Timer();
                Building_AllObjectButton();
                Building_SelectelAllObjects();
                Building_Timer_Update();
            }
            public static void AddInterface(String name, String json) {
                if (Instance.Interfaces.ContainsKey(name)) {
                    _.PrintError($"Error! Tried to add existing cui elements! -> {name}");
                    return;
                }
                Instance.Interfaces.Add(name, json);
            }
            public static String GetInterface(String name) {
                if (Instance.Interfaces.TryGetValue(name, out String json) == false) _.PrintWarning($"Warning! UI elements not found by name! -> {name}");
                return json;
            }
            public static void DestroyAll() {
                foreach (BasePlayer player in BasePlayer.activePlayerList) CuiHelper.DestroyUi(player, UI_GREADE_REMOVE_OVERLAY);
            }
            private void Building_Static_Panel() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiElement {
                    Name = UI_GREADE_REMOVE_OVERLAY, Parent = "Overlay", DestroyUi = UI_GREADE_REMOVE_OVERLAY, Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Png = _imageUI.GetImage("HUDPANEL")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = config.InterfaceControllers.StaticPanel.AnchorMin, AnchorMax = config.InterfaceControllers.StaticPanel.AnchorMax, OffsetMin = config.InterfaceControllers.StaticPanel.OffsetMin, OffsetMax = config.InterfaceControllers.StaticPanel.OffsetMax
                        }
                    }
                }
                );
                AddInterface("UI_Static_Panel", container.ToJson());
            }
            private void Building_Timer() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiElement {
                    Name = "TimerInfo", Parent = UI_GREADE_REMOVE_OVERLAY, DestroyUi = "TimerInfo", Components = {
                        new CuiTextComponent {
                            Text = "%TIMER_TEXT%", Font = "robotocondensed-bold.ttf", FontSize = config.InterfaceControllers.TimerElements.SizeTimer, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = config.InterfaceControllers.TimerElements.TimerPosition.AnchorMin, AnchorMax = config.InterfaceControllers.TimerElements.TimerPosition.AnchorMax, OffsetMin = config.InterfaceControllers.TimerElements.TimerPosition.OffsetMin, OffsetMax = config.InterfaceControllers.TimerElements.TimerPosition.OffsetMax
                        }
                    }
                }
                );
                AddInterface("UI_Timer_Label", container.ToJson());
            }
            private void Building_Timer_Update() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiElement {
                    Name = "TimerInfo", Parent = UI_GREADE_REMOVE_OVERLAY, Update = true, Components = {
                        new CuiTextComponent {
                            Text = "%TIMER_TEXT%", Font = "robotocondensed-bold.ttf", FontSize = config.InterfaceControllers.TimerElements.SizeTimer, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = config.InterfaceControllers.TimerElements.TimerPosition.AnchorMin, AnchorMax = config.InterfaceControllers.TimerElements.TimerPosition.AnchorMax, OffsetMin = config.InterfaceControllers.TimerElements.TimerPosition.OffsetMin, OffsetMax = config.InterfaceControllers.TimerElements.TimerPosition.OffsetMax
                        }
                    }
                }
                );
                AddInterface("UI_Timer_Label_Update", container.ToJson());
            }
            private void Building_TypeElement() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiElement {
                    Name = "%NAME_TYPE%", Parent = UI_GREADE_REMOVE_OVERLAY, DestroyUi = "%NAME_TYPE%", Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Png = "%TYPE_ICON%"
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = config.InterfaceControllers.TypeElement.TypesElements.AnchorMin, AnchorMax = config.InterfaceControllers.TypeElement.TypesElements.AnchorMax, OffsetMin = "%OFFSET_MIN%", OffsetMax = "%OFFSET_MAX%"
                        }
                    }
                }
                );
                container.Add(new CuiButton {
                    Button = {
                        Color = "0 0 0 0", Command = "%COMMAND_TYPE%"
                    }
                    , Text = {
                        Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "0 0 0 0"
                    }
                    , RectTransform = {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "-4 -4", OffsetMax = "4 4"
                    }
                }
                , "%NAME_TYPE%", "ButtonType_%NAME_TYPE%", "ButtonType_%NAME_TYPE%");
                AddInterface("UI_TypeElement", container.ToJson());
            }
            private void Building_Selectel() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiElement {
                    Name = "SelectedElement", Parent = "%NAME_TYPE%", DestroyUi = "SelectedElement", Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Png = _imageUI.GetImage("SELECTED_ELEMENT")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"-{config.InterfaceControllers.TypeElement.SizeSelectedElement} -{config.InterfaceControllers.TypeElement.SizeSelectedElement}", OffsetMax = $"{config.InterfaceControllers.TypeElement.SizeSelectedElement} {config.InterfaceControllers.TypeElement.SizeSelectedElement}"
                        }
                    }
                }
                );
                AddInterface("UI_Selectel", container.ToJson());
            }
            private void Building_SelectelAllObjects() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiElement {
                    Name = "SelectedElementAllObject", Parent = "AllType", DestroyUi = "SelectedElementAllObject", Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Png = _imageUI.GetImage("SELECTED_ELEMENT")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = $"-{config.InterfaceControllers.AllObject.SizeSelectedElement} -{config.InterfaceControllers.AllObject.SizeSelectedElement}", OffsetMax = $"{config.InterfaceControllers.AllObject.SizeSelectedElement} {config.InterfaceControllers.AllObject.SizeSelectedElement}"
                        }
                    }
                }
                );
                container.Add(new CuiButton {
                    Button = {
                        Color = "0 0 0 0", Command = "%ALL_BUTTON%"
                    }
                    , Text = {
                        Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "0 0 0 0"
                    }
                    , RectTransform = {
                        AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "-4 -4", OffsetMax = "4 4"
                    }
                }
                , "SelectedElementAllObject", "AllType_Button", "AllType_Button");
                AddInterface("UI_Selectel_AllObject", container.ToJson());
            }
            private void Building_AllObjectButton() {
                CuiElementContainer container = new CuiElementContainer();
                container.Add(new CuiElement {
                    Name = "AdminAllObjects", Parent = UI_GREADE_REMOVE_OVERLAY, DestroyUi = "AdminAllObjects", Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Png = _imageUI.GetImage("ALL_BUTTON")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = config.InterfaceControllers.AllObject.AllObjectsButton.AnchorMin, AnchorMax = config.InterfaceControllers.AllObject.AllObjectsButton.AnchorMax, OffsetMin = config.InterfaceControllers.AllObject.AllObjectsButton.OffsetMin, OffsetMax = config.InterfaceControllers.AllObject.AllObjectsButton.OffsetMax
                        }
                    }
                }
                );
                container.Add(new CuiElement {
                    Name = "AllType", Parent = "AdminAllObjects", DestroyUi = "AllType", Components = {
                        new CuiRawImageComponent {
                            Color = "1 1 1 1", Png = _imageUI.GetImage("ALL")
                        }
                        , new CuiRectTransformComponent {
                            AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-17.33321 -17.3359484", OffsetMax = "17.333 17.333"
                      
// ... [Code preview truncated due to length. Full source in attached file] ...

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