C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Game.Rust.Cui;
using System.Text.RegularExpressions;
using Oxide.Core.Plugins;
using Pool = Facepunch.Pool;
using System.Text;
using System;
using Time = UnityEngine.Time;
using System.Linq;
using Physics = UnityEngine.Physics;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using Object = System.Object;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using Oxide.Core;
namespace Oxide.Plugins {
[Info("IQGradeRemove", "Mercury", "2.34.45")]
[Description("IQGradeRemove")]
public class IQGradeRemove : RustPlugin {
private static ImageUI _imageUI;
private class Configuration {
[JsonProperty(LanguageEn ? "Remove settings" : "Настройка удаления")]
public RemovePreset RemovePresets = new RemovePreset();
[JsonProperty(LanguageEn ? "Setting Commands for functions" : "Настройка команд для функций")]
public CommandPresets CommandsList = new CommandPresets();
[JsonProperty(LanguageEn ? "Upgrade settings" : "Настройка улучшения")]
public UpgradePreset UpgradePresets = new UpgradePreset();
[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 ? "Setting UI" : "Настройка UI")]
public InterfaceController InterfaceControllers = new InterfaceController();
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 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 ? "Return attached items to the item being removed (For example, a combination lock to the door) (Return of items or % of resources on deletion must be enabled)" : "Возвращать прикрепленные предметы к удаляемому предмету (Например кодовый замок к двери) (Должен быть включен возврат предметов или % ресурсов при удалении)")]
public Boolean returnedChildItems;
[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>();
}
}
}
internal class InterfaceController {
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;
}
internal class TimerElement {
[JsonProperty(LanguageEn ? "Setting the timer position" : "Настройка расположения таймера")]
public Coordinates TimerPosition = new Coordinates();
[JsonProperty(LanguageEn ? "Timer text size" : "Размер текста таймера")]
public Int32 SizeTimer;
}
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();
internal class AllObjects {
[JsonProperty(LanguageEn ? "Setting up the 'All' button" : "Настройка кнопки 'All'")]
public Coordinates AllObjectsButton = new Coordinates();
[JsonProperty(LanguageEn ? "Buttonn stroke size" : "Размер обводки кнопки")]
public String SizeSelectedElement;
}
[JsonProperty(LanguageEn ? "Setting up timers" : "Настройка таймера")]
public TimerElement TimerElements = new TimerElement();
[JsonProperty(LanguageEn ? "Enable the `Close UI` button (Don't forget to add its image)" : "Включить кнопку `Закрытия UI` (Не забудьте добавить ее изображение)")]
public Boolean closeUIUsed;
[JsonProperty(LanguageEn ? "Setting the 'All' element" : "Настройка элемента 'All'")]
public AllObjects AllObject = new AllObjects();
[JsonProperty(LanguageEn ? "Setting up controls" : "Настройка элементов управления")]
public TypeElements TypeElement = new TypeElements();
}
[JsonProperty(LanguageEn ? "Use notifications with instructions when using a chat command to delete or improve" : "Использовать уведомления с инструкцией при использовании чат команды на удаление или улучшение")]
public Boolean useInstructionAlert;
[JsonProperty(LanguageEn ? "Disable the connection of the plugin with the radial RUST menu (true - yes/false - no)" : "Отключить связь плагина с радиальным меню RUST (true - да/false - нет)")]
public Boolean disableControllRadialMenu;
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 ? "Require authorization in the cupboard before improving the building" : "Требовать авторизацию в шкафу перед улучшением постройки")]
public Boolean NoGradeWithoutCupboard;
[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();
}
internal class CooldownController {
[JsonProperty(LanguageEn ? "Use cooldown before action" : "Использовать перезарядку перед действием")]
public Boolean UseCooldown;
[JsonProperty(LanguageEn ? "Time in seconds" : "Время в секундах")]
public Single SecondCooldown;
}
[JsonProperty(LanguageEn ? "Allow remote upgrade/remove (just hit with a mallet next to the object) (grant rights)" : "Разрешить дистанционное улучшение/удаление (достаточно просто рядом с объектом ударить киянкой) (выдайте права)")]
public Boolean UseDistanceFunc;
[JsonProperty(LanguageEn ? "Enable support for rights for each element separately (rights are issued separately for each variation)" : "Включить поддержку прав на каждый элемент отдельно (права выдаются отдельно под каждую вариацию)")]
public Boolean IsCheckPermission;
[JsonProperty(LanguageEn ? "Duration of the selected element (improvement/removal) in seconds" : "Время действия выбранного элемента (улучшени/удаления) в секундах")]
public Int32 ConfigActiveGradeRemove;
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() {
NoGradeWithoutCupboard = false, 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() {
returnedChildItems = false, 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,
}
}
}
}
;
}
}
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 Boolean IsFriends(BasePlayer player, UInt64 targetPlayerID) {
List<UInt64> FriendList = GetFriendList(player);
try {
return FriendList != null && FriendList.Contains(targetPlayerID);
}
finally {
Pool.FreeUnmanaged(ref FriendList);
}
}
private void OnServerInitialized() {
if (AutoBaseUpgrade && AutoBaseUpgrade.Version < new VersionNumber(1, 2, 2)) {
NextTick(() => {
PrintError(LanguageEn ? "You have an outdated version of AutoBaseUpgrade installed.Please update to version 1.2.2 or higher" : "У вас установлена устаревшая версия AutoBaseUpgrade, обновитесь до версии выше 1.2.2");
Interface.Oxide.UnloadPlugin(Name);
}
);
}
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));
}
if (config.RemovePresets.TemporaryBlockBuildRemove.UseBlock || config.RemovePresets.FullBlockBuildRemove.UseBlock) timerSaveData = timer.Every(900f, () => WriteData());
else Unsubscribe(nameof(OnEntityKill));
foreach (BasePlayer player in BasePlayer.activePlayerList) OnPlayerConnected(player);
}
private void RemoveBlockBuild(String userID, TypeBlock typeBlock, UInt64 buildNetID) {
Configuration.RemovePreset.BlockRemoveBuilding ConfigureBlock = typeBlock == TypeBlock.Temporary ? config.RemovePresets.TemporaryBlockBuildRemove : config.RemovePresets.FullBlockBuildRemove;
if (!ConfigureBlock.UseBlock) return;
Dictionary<UInt64, Double> BlockList = typeBlock == TypeBlock.Temporary ? TemporaryBlockBuild : FullBlockBuild;
if (!BlockList.ContainsKey(buildNetID)) return;
BlockList.Remove(buildNetID);
}
/// <summary>
/// TODO: RaidBlock + radialMenu в VK от Андрей Чичеренко
/// - Исправление после обновления игры
/// </summary>
[PluginReference]
Plugin IQTurret, Friends, Clans, IQRecycler, XBuildingSkinMenu, AutoBaseUpgrade, RaidBlock, NoEscape;
private static StringBuilder sb = new StringBuilder();
private UInt32 GetShippingContainerBlockColourForPlayer(BasePlayer player) {
Int32 infoInt = player.GetInfoInt("client.SelectedShippingContainerBlockColour", 0);
if (infoInt >= 0) return (UInt32)infoInt;
return (UInt32)0;
}
private Double GetTimeBlock(String userID, TypeBlock typeBlock) {
Configuration.RemovePreset.BlockRemoveBuilding ConfigureBlock = typeBlock == TypeBlock.Temporary ? config.RemovePresets.TemporaryBlockBuildRemove : config.RemovePresets.FullBlockBuildRemove;
if (!ConfigureBlock.UseBlock) return 0;
Int32 TimeBlock = ConfigureBlock.TimeRemove;
foreach (KeyValuePair<String, Int32> permissionTimeBlock in ConfigureBlock.PermissionTime.OrderBy(x => x.Value)) {
if (permission.UserHasPermission(userID, permissionTimeBlock.Key)) TimeBlock = permissionTimeBlock.Value;
}
return TimeBlock + CurrentTime();
}
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
}
}
}
);
if (config.InterfaceControllers.closeUIUsed) {
container.Add(new CuiElement {
Name = "CLOSE_BUTTON_IMG", Parent = UI_GREADE_REMOVE_OVERLAY, DestroyUi = "CLOSE_BUTTON_IMG", Components = {
new CuiRawImageComponent {
Color = "1 1 1 1", Png = _imageUI.GetImage("CLOSE_BUTTON")
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "138.267 -25.333", OffsetMax = "188.933 25.333"
}
}
}
);
container.Add(new CuiButton {
Button = {
Color = "0 0 0 0", Command = "close.ui.func"
}
, Text = {
Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.MiddleCenter, Color = "0 0 0 0"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
, "CLOSE_BUTTON_IMG", "CLOSE_BUTTON", "CLOSE_BUTTON");
}
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.3383204", OffsetMax = "17.333 17.333"
}
}
}
);
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"
}
}
, "AllType", "AllType_Button", "AllType_Button");
AddInterface("UI_AllObject_Button", container.ToJson());
}
}
private IEnumerator ProcessUpgradeBlocks(List<BuildingBlock> blocksToChange, BuildingGrade.Enum gradeType, BasePlayer player) {
Int32 tryUpObjectFinded = 0;
for (Int32 i = 0; i < blocksToChange.Count; i++) {
BuildingBlock Block = blocksToChange[i];
if (!permission.UserHasPermission(player.UserIDString, PermissionGRNoResource) && !Block.CanAffordUpgrade(gradeType, Block.skinID, player)) {
MessageGameTipsError(player, GetLang("UPGRADE_NOT_ENOUGHT_RESOURCE", player.UserIDString));
yield break;
}
if (Block.name.Contains("foundation") && DeployVolume.Check(Block.transform.position, Block.transform.rotation, PrefabAttribute.server.FindAll<DeployVolume>(Block.prefabID), ~(1 << Block.gameObject.layer))) {
tryUpObjectFinded++;
continue;
}
if (config.UpgradePresets.BackUpgradeReturnedItem) {
if ((Int32)gradeType <= (Int32)Block.grade) {
foreach (ItemAmount itemAmount in Block.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);
}
}
}
ConstructionGrade grade = Block.blockDefinition.GetGrade(gradeType, 0);
if (!permission.UserHasPermission(player.UserIDString, PermissionGRNoResource)) Block.PayForUpgrade(grade, player);
Block.SetHealthToMax();
UInt64 SkinBuilding = GetBuildingSkin(player, gradeType);
Block.ChangeGradeAndSkin(gradeType, SkinBuilding, true, true);
yield return new WaitForSeconds(0.05f);
}
if (tryUpObjectFinded != 0) MessageGameTipsError(player, GetLang("ALL_OBJECTS_FINDED_OBJECT", player.UserIDString));
}
private List<BasePlayer> playerAlerUp = new();
private Dictionary<BasePlayer, LocalRepositoryUser> LocalRepository = new Dictionary<BasePlayer, LocalRepositoryUser>();
private const String PermissionsUpStone = "iqgraderemove.upstones";
private static InterfaceBuilder _interface;
Object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) {
BuildingBlock buildingBlock = entity as BuildingBlock;
if (buildingBlock == null) return null;
if(entity.prefabID is 138320323 or 3832032) return null;
Boolean isAutoBaseUpgrade = AutoBaseUpgrade != null && AutoBaseUpgrade.Call<Boolean>("IsBaseUpgradeProcess", entity.GetBuildingPrivilege());
String canUpgrade = config.disableControllRadialMenu || isAutoBaseUpgrade ? String.Empty : 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(GetShippingContainerBlockColourForPlayer(player));
return null;
}
MessageGameTipsError(player, canUpgrade);
return true;
}
private Dictionary<UInt64, Double> TemporaryBlockBuild = new Dictionary<UInt64, Double>();
private static Double CurrentTime() => Facepunch.Math.Epoch.Current;
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 List<BasePlayer> playerAlerRemove = new();
private void OnNewSave(string filename) {
if (FullBlockBuild != null && FullBlockBuild.Count != 0) FullBlockBuild.Clear();
if (TemporaryBlockBuild != null && TemporaryBlockBuild.Count != 0) TemporaryBlockBuild.Clear();
WriteData(true);
}
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 (permission.UserHasPermission(player.UserIDString, PermissionsRemoveAdmin)) return RemoveConfig.NoRemoveItems.Contains(Regex.Replace(entity.ShortPrefabName.Replace("mining_quarry", "mining.quarry"), "\\.deployed|_deployed", "")) ? 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) : "";
}
private void OnEntityKill(BaseEntity entity) {
if (entity == null) return;
if (entity.prefabID is 138320323 or 3832032) return;
if (entity.net == null) return;
if (!entity.OwnerID.IsSteamId()) return;
String ownerID = entity.OwnerID.ToString();
RemoveBlockBuild(ownerID, TypeBlock.Temporary, entity.net.ID.Value);
RemoveBlockBuild(ownerID, TypeBlock.Full, entity.net.ID.Value);
}
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.InterfaceControll
// ... [Code preview truncated due to length. Full source in attached file] ...