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

FREE IQGradeRemove : 2.27.33 2.27.33

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Game.Rust.Cui;
using UnityEngine.Networking;
using System.IO;
using Oxide.Core.Plugins;
using System.Collections;
using Newtonsoft.Json;
using Object = System.Object;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Text;
using UnityEngine;
using Oxide.Core;
using System;
using System.Linq;
namespace Oxide.Plugins {
    [Info("IQGradeRemove", "Mercury", "2.27.33")]
    [Description("IQGradeRemove")]
    public class IQGradeRemove : RustPlugin {
        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 List<BasePlayer> playerAlerRemove = new();
        private const String PermissionsUpWood = "iqgraderemove.upwood";
        protected override void LoadConfig() {
            base.LoadConfig();
            try {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
                if (config.InterfaceControllers == null) {
                    if (config.InterfaceControllers.StaticPanel == null) {
                        config.InterfaceControllers = new Configuration.InterfaceController() {
                            StaticPanel = new Configuration.InterfaceController.Coordinates() {
                                AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "58.333 25", OffsetMax = "335.667 73"
                            }
                        }
                        ;
                    }
                    if (config.InterfaceControllers.AllObject == null) {
                        config.InterfaceControllers.AllObject = new Configuration.InterfaceController.AllObjects() {
                            AllObjectsButton = new Configuration.InterfaceController.Coordinates() {
                                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-188.46712 -24", OffsetMax = "-140.467 24"
                            }
                            , SizeSelectedElement = "21.333"
                        }
                        ;
                    }
                    if (config.InterfaceControllers.TypeElement == null) {
                        config.InterfaceControllers.TypeElement = new Configuration.InterfaceController.TypeElements() {
                            SizeSelectedElement = "21.333", OffsetBetweenElements = -44.5f, TypesElements = new Configuration.InterfaceController.Coordinates() {
                                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-132 -17.333", OffsetMax = "-97 17.333",
                            }
                        }
                        ;
                    }
                    if (config.InterfaceControllers.TimerElements == null) {
                        config.InterfaceControllers.TimerElements = new Configuration.InterfaceController.TimerElement() {
                            TimerPosition = new Configuration.InterfaceController.Coordinates() {
                                AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "90.878 -18.828", OffsetMax = "137.255 18.828",
                            }
                            , SizeTimer = 30,
                        }
                        ;
                    }
                }
                if (config.InterfaceControllers.StaticPanel.AnchorMin == null) config.InterfaceControllers.StaticPanel.AnchorMin = "0 0";
                if (config.InterfaceControllers.StaticPanel.AnchorMax == null) config.InterfaceControllers.StaticPanel.AnchorMax = "0 0";
                if (config.InterfaceControllers.StaticPanel.OffsetMin == null) config.InterfaceControllers.StaticPanel.OffsetMin = "58.333 25";
                if (config.InterfaceControllers.StaticPanel.OffsetMax == null) config.InterfaceControllers.StaticPanel.OffsetMax = "335.667 73";
                if (config.InterfaceControllers.AllObject.AllObjectsButton.AnchorMin == null) config.InterfaceControllers.AllObject.AllObjectsButton.AnchorMin = "0.5 0.5";
                if (config.InterfaceControllers.AllObject.AllObjectsButton.AnchorMax == null) config.InterfaceControllers.AllObject.AllObjectsButton.AnchorMax = "0.5 0.5";
                if (config.InterfaceControllers.AllObject.AllObjectsButton.OffsetMin == null) config.InterfaceControllers.AllObject.AllObjectsButton.OffsetMin = "-188.46712 -24";
                if (config.InterfaceControllers.AllObject.AllObjectsButton.OffsetMax == null) config.InterfaceControllers.AllObject.AllObjectsButton.OffsetMax = "-140.467 24";
                if (config.InterfaceControllers.AllObject.SizeSelectedElement == null) config.InterfaceControllers.AllObject.SizeSelectedElement = "21.333";
                if (config.InterfaceControllers.TypeElement.TypesElements.AnchorMin == null) config.InterfaceControllers.TypeElement.TypesElements.AnchorMin = "0.5 0.5";
                if (config.InterfaceControllers.TypeElement.TypesElements.AnchorMax == null) config.InterfaceControllers.TypeElement.TypesElements.AnchorMax = "0.5 0.5";
                if (config.InterfaceControllers.TypeElement.TypesElements.OffsetMin == null) config.InterfaceControllers.TypeElement.TypesElements.OffsetMin = "-132 -17.333";
                if (config.InterfaceControllers.TypeElement.TypesElements.OffsetMax == null) config.InterfaceControllers.TypeElement.TypesElements.OffsetMax = "-97 17.333";
                if (config.InterfaceControllers.TypeElement.OffsetBetweenElements == 0) config.InterfaceControllers.TypeElement.OffsetBetweenElements = -44.5f;
                if (config.InterfaceControllers.TypeElement.SizeSelectedElement == null) config.InterfaceControllers.TypeElement.SizeSelectedElement = "21.333";
                if (config.InterfaceControllers.TimerElements.TimerPosition.AnchorMin == null) config.InterfaceControllers.TimerElements.TimerPosition.AnchorMin = "0.5 0.5";
                if (config.InterfaceControllers.TimerElements.TimerPosition.AnchorMax == null) config.InterfaceControllers.TimerElements.TimerPosition.AnchorMax = "0.5 0.5";
                if (config.InterfaceControllers.TimerElements.TimerPosition.OffsetMin == null) config.InterfaceControllers.TimerElements.TimerPosition.OffsetMin = "90.878 -18.828";
                if (config.InterfaceControllers.TimerElements.TimerPosition.OffsetMax == null) config.InterfaceControllers.TimerElements.TimerPosition.OffsetMax = "137.255 18.828";
                if (config.InterfaceControllers.TimerElements.SizeTimer == 0) config.InterfaceControllers.TimerElements.SizeTimer = 30;
            }
            catch {
                PrintWarning(LanguageEn ? $"Error reading #54327 configuration 'oxide/config/{Name}', creating a new configuration!!" : $"Ошибка чтения #54327 конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }
        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 class LocalRepositoryUser {
            private Boolean isReset;
            public Int32 activityTime = 0;
            private Boolean isAllObject = false;
            private Timer timerInfo;
            public ActionType selectedType = ActionType.None;
            private Double CooldownUpgrade;
            private Double CooldownRemove;
            private Boolean UseCooldown() {
                return selectedType switch {
                    ActionType.None => false, ActionType.Remove => config.RemovePresets.CooldownRemove.UseCooldown, _ => config.UpgradePresets.CooldownUpgrade.UseCooldown
                }
                ;
            }
            public void SetupCooldownData() {
                switch (selectedType) {
                    case ActionType.None : return;
                    case ActionType.Remove : CooldownRemove = CurrentTime + config.RemovePresets.CooldownRemove.SecondCooldown;
                    break;
                    case ActionType.Wood : case ActionType.Stone : case ActionType.Metal : case ActionType.Hqm : default : CooldownUpgrade = CurrentTime + config.UpgradePresets.CooldownUpgrade.SecondCooldown;
                    break;
                }
            }
            public Boolean IsCooldown() {
                if (!UseCooldown()) return false;
                Double remainingCooldown = (selectedType == ActionType.Remove) ? CooldownRemove - CurrentTime : CooldownUpgrade - CurrentTime;
                return remainingCooldown > 0;
            }
            public Double GetCooldownTime() {
                if (!UseCooldown()) return 0;
                if (!IsCooldown()) {
                    SetupCooldownData();
                    return 0;
                }
                if (selectedType == ActionType.Remove) return CooldownRemove - CurrentTime;
                return CooldownUpgrade - CurrentTime;
            }
            public Boolean HasAllObjectsPermission(BasePlayer player) => _.permission.UserHasPermission(player.UserIDString, PermissionsAllObjects);
            public Boolean IsAllObjects(BasePlayer player) => HasAllObjectsPermission(player) && isAllObject && selectedType != ActionType.None;
            public void TurnedAllObjects(BasePlayer player) {
                isAllObject = !isAllObject;
                _.DrawUI_Button_AllObject(player, IsAllObjects(player));
            }
            public Int32 GetGradeLevel => selectedType is ActionType.Remove or ActionType.None ? -1 : (Int32)selectedType;
            public void ActionAssignment(BasePlayer player, Int32 customType = -1) {
                Int32 correctedCustomType = customType is > 5 or < 1 ? 1 : customType;
                Int32 nextTypeAsInt = (customType != -1) ? correctedCustomType : (Int32)selectedType + 1;
                if (customType != -1) {
                    if (!isReset && (Int32)selectedType == nextTypeAsInt) {
                        isReset = true;
                        DeleteTimerUI(player);
                        return;
                    }
                    isReset = false;
                }
                if (config.IsCheckPermission) {
                    Boolean anyPermissionFound = false;
                    Boolean sameTypeFound = false;
                    Boolean onlyOneTypeAvailable = true;
                    while (nextTypeAsInt <= (Int32)ActionType.Remove) {
                        if (HasPermissionTypes(player, nextTypeAsInt)) {
                            anyPermissionFound = true;
                            if (nextTypeAsInt != (Int32)selectedType) onlyOneTypeAvailable = false;
                            else sameTypeFound = true;
                            break;
                        }
                        nextTypeAsInt++;
                    }
                    if (onlyOneTypeAvailable) {
                        if (sameTypeFound && timerInfo is {
                            Destroyed : false
                        }
                        ) {
                            isReset = true;
                            DeleteTimerUI(player);
                            return;
                        }
                        if (!anyPermissionFound && (timerInfo == null || timerInfo.Destroyed)) {
                            _.MessageGameTipsError(player, _.GetLang("NO_PERMISSION", player.UserIDString));
                            return;
                        }
                        DeleteTimerUI(player);
                        return;
                    }
                }
                if (nextTypeAsInt > (Int32)ActionType.Remove) {
                    if (isReset || !config.ConfigResetInterface) {
                        nextTypeAsInt = (Int32)ActionType.Wood;
                        isReset = false;
                    }
                    else {
                        isReset = true;
                        DeleteTimerUI(player);
                        return;
                    }
                }
                selectedType = (ActionType)nextTypeAsInt;
                _.DrawUI_StaticPanel(player);
                ResetTimer(player);
            }
            public Boolean HasPermissionTypes(BasePlayer player, Int32 actionType) {
                if (!config.IsCheckPermission) return true;
                return actionType switch {
                    (Int32)ActionType.Wood => _.permission.UserHasPermission(player.UserIDString, PermissionsUpWood), (Int32)ActionType.Stone => _.permission.UserHasPermission(player.UserIDString, PermissionsUpStone), (Int32)ActionType.Metal => _.permission.UserHasPermission(player.UserIDString, PermissionsUpMetal), (Int32)ActionType.Hqm => _.permission.UserHasPermission(player.UserIDString, PermissionsUpHqm), (Int32)ActionType.Remove => _.permission.UserHasPermission(player.UserIDString, PermissionsRemove), _ => false
                }
                ;
            }
            public void ResetTimer(BasePlayer player) {
                timerInfo?.Destroy();
                activityTime = (Int32)CurrentTime + config.ConfigActiveGradeRemove;
                _.DrawUI_Timer(player, (Int32)(activityTime - CurrentTime));
                timerInfo = _.timer.Repeat(1f, config.ConfigActiveGradeRemove, () => {
                    TimerController(player);
                }
                );
            }
            private void TimerController(BasePlayer player) {
                if (CurrentTime >= activityTime) DeleteTimerUI(player);
                else _.DrawUI_Timer_Update(player, (Int32)(activityTime - CurrentTime));
            }
            private void DeleteTimerUI(BasePlayer player) {
                CuiHelper.DestroyUi(player, InterfaceBuilder.UI_GREADE_REMOVE_OVERLAY);
                timerInfo?.Destroy();
                selectedType = ActionType.None;
            }
        }
        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 enum ActionType {
            None, Wood, Stone, Metal, Hqm, Remove, RemoveAdmin
        }
        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_double"] = "barricade.wood.cover",
        }
        ;
        private List<BasePlayer> playerAlerUp = new();
        Int32 API_GET_GRADE_TIME_PLAYER(BasePlayer player) {
            if (player == null) return 0;
            if (!LocalRepository.ContainsKey(player)) return 0;
            return LocalRepository[player].selectedType == ActionType.None ? 0 : LocalRepository[player].activityTime - CurrentTime <= 0 ? 0 : Convert.ToInt32(LocalRepository[player].activityTime - CurrentTime);
        }
        private void OnEntityBuilt(Planner plan, GameObject go) {
            if (plan == null) return;
            BasePlayer player = plan.GetOwnerPlayer();
            if (player == null || go == null) return;
            BaseEntity entity = go.ToBaseEntity();
            if (entity == null) return;
            if(entity.prefabID is 133905323 or 3390532) return;
            if (entity.net == null) return;
            SetupBlockBuild(player.UserIDString, TypeBlock.Temporary, entity.net.ID.Value);
            SetupBlockBuild(player.UserIDString, TypeBlock.Full, entity.net.ID.Value);
            BuildingBlock buildingBlock = entity as BuildingBlock;
            if (buildingBlock == null) return;
            LocalRepositoryUser repository = LocalRepository[player];
            if (repository.selectedType != ActionType.None && repository.selectedType != ActionType.Remove) UpgradeHit(player, buildingBlock, repository);
        }
        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;
        }
        private static StringBuilder sb = new StringBuilder();
        private Dictionary<BasePlayer, Coroutine> RoutineUpgradeAllPlayers = new Dictionary<BasePlayer, Coroutine>();
        private void ConsoleCMDUp(ConsoleSystem.Arg arg) {
            BasePlayer player = arg.Player();
            if (player == null) return;
            ControllerGradeRemove(player);
        }
        private void DrawUI_Types_Selected(BasePlayer player, String NameType) {
            if (_interface == null) return;
            String Interface = InterfaceBuilder.GetInterface("UI_Selectel");
            if (Interface == null) return;
            Interface = Interface.Replace("%NAME_TYPE%", NameType);
            CuiHelper.AddUi(player, Interface);
        }
        private void UpgradeHit(BasePlayer player, BaseEntity entity, LocalRepositoryUser repositoryUser) {
            BuildingBlock buildingBlock = entity as BuildingBlock;
            if (buildingBlock == null) return;
            String canUpgradeResult = CanUpgrade(player, buildingBlock, repositoryUser);
            if (!String.IsNullOrWhiteSpace(canUpgradeResult)) {
                MessageGameTipsError(player, canUpgradeResult);
                return;
            }
            Int32 GradeLevel = repositoryUser.GetGradeLevel;
            if (GradeLevel == -1) return;
            BuildingGrade.Enum selectedGrade = (BuildingGrade.Enum)GradeLevel;
            if (selectedGrade == buildingBlock.grade) return;
            // Unsubscribe(nameof(OnStructureUpgrade));
            //
            // // if (Interface.Call("OnStructureUpgrade", buildingBlock, player, (BuildingGrade.Enum) selectedGrade) != null)
            // //     return;
            // //
            // Subscribe(nameof(OnStructureUpgrade));
            if (!config.UpgradePresets.BackUpgrade) {
                if (GradeLevel <= (Int32)buildingBlock.grade) return;
            }
            else if (config.UpgradePresets.BackUpgradeReturnedItem) {
                if (GradeLevel <= (Int32)buildingBlock.grade) {
                    foreach (ItemAmount itemAmount in buildingBlock.BuildCost()) {
                        Int32 amountItem = (Int32)(itemAmount.amount * (config.UpgradePresets.BackUpgradeReturnedItemPercent / 100.0f));
                        if(amountItem <= 0) continue;
                        Item backItem = ItemManager.CreateByName(itemAmount.itemDef.shortname, amountItem);
                        if (backItem == null) continue;
                        player.GiveItem(backItem);
                    }
                }
            }
            UInt64 SkinBuilding = GetBuildingSkin(player, selectedGrade);
            if (!permission.UserHasPermission(player.UserIDString, PermissionGRNoResource)) buildingBlock.PayForUpgrade(buildingBlock.blockDefinition.GetGrade(selectedGrade, SkinBuilding), player);
            buildingBlock.SetHealthToMax();
            buildingBlock.ClientRPC<Int32, UInt64>((Network.Connection) null, "DoUpgradeEffect", GradeLevel, 0);
            buildingBlock.ChangeGradeAndSkin(selectedGrade, SkinBuilding, true, true);
            if(buildingBlock.grade == BuildingGrade.Enum.Metal && SkinBuilding != 0 && SkinBuilding == 10221) buildingBlock.SetCustomColour(player.LastBlockColourChangeId == 0 ? buildingBlock.currentSkin.GetStartingDetailColour(0) : player.LastBlockColourChangeId);
            repositoryUser.ResetTimer(player);
        }
        private void RegisteredPermissions() {
            if (!permission.PermissionExists(PermissionsAllObjects, this)) permission.RegisterPermission(PermissionsAllObjects, this);
            if (!permission.PermissionExists(PermissionGRNoResource, this)) permission.RegisterPermission(PermissionGRNoResource, this);
            if (!permission.PermissionExists(PermissionAllObjectsBack, this)) permission.RegisterPermission(PermissionAllObjectsBack, this);
            if (!permission.PermissionExists(PermissionsUpWood, this)) permission.RegisterPermission(PermissionsUpWood, this);
            if (!permission.PermissionExists(PermissionsUpStone, this)) permission.RegisterPermission(PermissionsUpStone, this);
            if (!permission.PermissionExists(PermissionsUpMetal, this)) permission.RegisterPermission(PermissionsUpMetal, this);
            if (!permission.PermissionExists(PermissionsUpHqm, this)) permission.RegisterPermission(PermissionsUpHqm, this);
            if (!permission.PermissionExists(PermissionsRemove, this)) permission.RegisterPermission(PermissionsRemove, this);
            if (!permission.PermissionExists(PermissionsDistanceFunc, this)) permission.RegisterPermission(PermissionsDistanceFunc, this);
            if (!permission.PermissionExists(PermissionsRemoveAdmin, this)) permission.RegisterPermission(PermissionsRemoveAdmin, this);
            if (!permission.PermissionExists(PermissionsAllObjectsRemove, this)) permission.RegisterPermission(PermissionsAllObjectsRemove, this);
            foreach (KeyValuePair<String, Int32> fullBlockSettigns in config.RemovePresets.FullBlockBuildRemove.PermissionTime) {
                if (!permission.PermissionExists(fullBlockSettigns.Key, this)) permission.RegisterPermission(fullBlockSettigns.Key, this);
            }
            foreach (KeyValuePair<String, Int32> temporaryBlockSettigns in config.RemovePresets.TemporaryBlockBuildRemove.PermissionTime) {
                if (!permission.PermissionExists(temporaryBlockSettigns.Key, this)) permission.RegisterPermission(temporaryBlockSettigns.Key, this);
            }
        }
        private static Double CurrentTime => Facepunch.Math.Epoch.Current;
        private void ReturnedRemoveItems(BasePlayer player, BaseEntity entity) {
            String NormalizePrefab = NormalizePrefabName(entity.ShortPrefabName);
            Configuration.RemovePreset.ReturnedSettings.Items ItemsSettings = config.RemovePresets.ReturnedRemoveSettings.ItemsSettings;
            Configuration.RemovePreset.ReturnedSettings.Building BuildingSettings = config.RemovePresets.ReturnedRemoveSettings.BuildingSettings;
            try {
                if (!ItemsSettings.ShortnameNoteReturned.Contains(NormalizePrefab)) if (HandleItemReturn(player, entity, NormalizePrefab, ItemsSettings)) return;
            }
            catch (Exception) {
                //PrintError(LanguageEn ? $"[NormalizePrefabName] Key name not found.Please notify the developer about this message and send them this text.Missing key normalizer for the prefab {entity.ShortPrefabName}" : $"[NormalizePrefabName] Not found key name.Сообщите разработчику об этом уведомлении и пришлите ему этот текст.Отсуствует ключ-нормализатор к префабу {entity.ShortPrefabName}");
                return;
            }
            if (BuildingSettings.UseReturned && entity is StabilityEntity buildingBlock) HandleBuildingReturn(player, buildingBlock, BuildingSettings);
        }
        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 const String PermissionsUpMetal = "iqgraderemove.upmetal";
        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 UInt64 GetBuildingSkin(BasePlayer player, BuildingGrade.Enum grade) {
            if (XBuildingSkinMenu == null) return 0;
            if (XBuildingSkinMenu.Version < new Oxide.Core.VersionNumber(1, 1, 4)) {
                PrintWarning(LanguageEn ? "You have an outdated version of the XBuildingSkinMenu plugin installed.For full functionality between IQGradeRemove and XBuildingSkinMenu, you need to update XBuildingSkinMenu to version 1.0.7 or higher!" : "У вас установлена устаревшая версия плагина XBuildingSkinMenu, для полноценного функционала между IQGradeRemove и XBuildingSkinMenu вам требуется обновить XBuildingSkinMenu до версии 1.0.7 или выше!");
                return 0;
            }
            return XBuildingSkinMenu?.Call<UInt64>("GetBuildingSkin", player, grade) ?? 0;
        }
        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 static IQGradeRemove _;
        private const String PermissionsDistanceFunc = "iqgraderemove.distancefunc";
        private class Configuration {
            internal class CooldownController {
                [JsonProperty(LanguageEn ? "Use cooldown before action" : "Использовать перезарядку перед действием")]
                public Boolean UseCooldown;
                [JsonProperty(LanguageEn ? "Time in seconds" : "Время в секундах")]
                public Single SecondCooldown;
            }
            [JsonProperty(LanguageEn ? "Enable support for rights for each element separately (rights are issued separately for each variation)" : "Включить поддержку прав на каждый элемент отдельно (права выдаются отдельно под каждую вариацию)")]
            public Boolean IsCheckPermission;
            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 ? "Duration of the selected element (improvement/removal) in seconds" : "Время действия выбранного элемента (улучшени/удаления) в секундах")]
            public Int32 ConfigActiveGradeRemove;
            [JsonProperty(LanguageEn ? "Use notifications with instructions when using a chat command to delete or improve" : "Использовать уведомления с инструкцией при использовании чат команды на удаление или улучшение")]
            public Boolean useInstructionAlert;
            [JsonProperty(LanguageEn ? "Upgrade settings" : "Настройка улучшения")]
            public UpgradePreset UpgradePresets = new UpgradePreset();
            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>();
            }
            internal class InterfaceController {
                [JsonProperty(LanguageEn ? "Setting up timers" : "Настройка таймера")]
                public TimerElement TimerElements = new TimerElement();
                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 controls" : "Настройка элементов управления")]
                public TypeElements TypeElement = new TypeElements();
                internal class TimerElement {
                    [JsonProperty(LanguageEn ? "Setting the timer position" : "Настройка расположения таймера")]
                    public Coordinates TimerPosition = new Coordinates();
                    [JsonProperty(LanguageEn ? "Timer text size" : "Размер текста таймера")]
                    public Int32 SizeTimer;
                }
                internal class AllObjects {
                    [JsonProperty(LanguageEn ? "Setting up the 'All' button" : "Настройка кнопки 'All'")]
                    public Coordinates AllObjectsButton = new Coordinates();
                    [JsonProperty(LanguageEn ? "Buttonn stroke size" : "Размер обводки кнопки")]
                    public String SizeSelectedElement;
                }
                internal class Coordinates {
                    public String AnchorMin;
                    public String AnchorMax;
                    public String OffsetMin;
                    public String OffsetMax;
                }
                [JsonProperty(LanguageEn ? "Setting up the main panel UI" : "Настройка UI главной панели")]
                public Coordinates StaticPanel = new Coordinates();
                [JsonProperty(LanguageEn ? "Setting the 'All' element" : "Настройка элемента 'All'")]
                public AllObjects AllObject = new AllObjects();
            }
            [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 ? "Allow remote upgrade/remove (just hit with a mallet next to the object) (grant rights)" : "Разрешить дистанционное улучшение/удаление (достаточно просто рядом с объектом ударить киянкой) (выдайте права)")]
            public Boolean UseDistanceFunc;
            [JsonProperty(LanguageEn ? "Disable the connection of the plugin with the radial RUST menu (true - yes/false - no)" : "Отключить связь плагина с радиальным меню RUST (true - да/false - нет)")]
            public Boolean disableControllRadialMenu;
            [JsonProperty(LanguageEn ? "Setting Commands for functions" : "Настройка команд для функций")]
            public CommandPresets CommandsList = new CommandPresets();
            public static Configuration GetNewConfiguration() {
                return new Configuration {
                    disableControllRadialMenu = false, 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 ? "Remove settings" : "Настройка удаления")]
            public RemovePreset RemovePresets = new RemovePreset();
            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 ? "Setting UI" : "Настройка UI")]
            public InterfaceController InterfaceControllers = new InterfaceController();
        }
        private void RemoveHit(BasePlayer player, BaseEntity entity, LocalRepositoryUser repositoryUser) {
            String canRemoveResult = CanRemove(player, entity);
            if (!String.IsNullOrWhiteSpace(canRemoveResult)) {
                MessageGameTipsError(player, canRemoveResult);
                return;
            }
            ReturnedRemoveItems(player, entity);
            NextTick(() => {
                {
                    StorageContainer container = entity as StorageContainer;
                    if (container != null) container.DropItems();
                    entity.Kill(BaseNetworkable.DestroyMode.Gib);
                }
            }
            );
            repositoryUser.ResetTimer(player);
        }
        /// <summary>
        /// - Добавлена ссылка на картинки
        /// - Добавлена возможность отвязать функции плагина от радиального меню RUST
        /// - Добавлено разрешение - iqgraderemove.removeadmin , позволяющее удалять объекты игнорируя ограничения (будьте внимательны, вы сможете удалять объекты сервера, которые невозможно скрафтить (например : переработчики, машины, коптеры))
        /// - Исправлен возврат префаба деревянной баррикады после обновления игры
        /// - Исправлен конфликт с AutoBaseUpgrade
        /// </summary>
        [PluginReference]
        Plugin IQTurret, Friends, Clans, IQRecycler, XBuildingSkinMenu, AutoBaseUpgrade;
        private Item CreateItem(BaseEntity entity, String NormalizePrefab) {
            return entity switch {
                ModularCarGarage when entity.ShortPrefabName.Contains("electrical.modularcarlift") => ItemManager.CreateByName("modularcarlift", 1, entity.skinID), BaseCombatEntity baseCombat when baseCombat.pickup.itemTarget == null => ItemManager.CreateByName(NormalizePrefab, 1, entity.skinID), BaseCombatEntity baseCombat => ItemManager.Create(baseCombat.pickup.itemTarget, 1, 
// ... [Code preview truncated due to length. Full source in attached file] ...

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