C#:
using Oxide.Core;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;
using UnityEngine;
using Oxide.Core.Plugins;
using Newtonsoft.Json;
namespace Oxide.Plugins {
[Info("IQGradeRemove", "Sempai#3239", "1.2.3")]
[Description("Умный Grade Remove")]
class IQGradeRemove : RustPlugin {
public void GradeAll(BasePlayer player, BuildingBlock buildingBlock) {
if (buildingBlock.GetBuildingPrivilege() == null) {
Interface_Error(player, GetLang("GRADE_ALL_NO_AUTH", player.UserIDString));
return;
}
if (!player.IsBuildingAuthed()) {
Interface_Error(player, GetLang("GRADE_NO_AUTH", player.UserIDString));
return;
}
foreach (var Block in buildingBlock.GetBuildingPrivilege().GetBuilding().buildingBlocks.Where(x => x.grade != (BuildingGrade.Enum)DataPlayer[player.userID].GradeLevel)) {
if (!permission.UserHasPermission(player.UserIDString, PermissionGRNoResource)) {
if (!Block.CanAffordUpgrade(((BuildingGrade.Enum)DataPlayer[player.userID].GradeLevel), player)) {
Interface_Error(player, GetLang("GRADE_NO_RESOURCE", player.UserIDString));
return;
}
else {
Block.PayForUpgrade(buildingBlock.GetGrade((BuildingGrade.Enum)DataPlayer[player.userID].GradeLevel), player);
Block.SetGrade((BuildingGrade.Enum)DataPlayer[player.userID].GradeLevel);
Block.SetHealthToMax();
Block.UpdateSkin();
}
}
else {
Block.SetGrade((BuildingGrade.Enum)DataPlayer[player.userID].GradeLevel);
Block.SetHealthToMax();
Block.UpdateSkin();
}
}
}
public Dictionary<ulong, GradeRemove> DataPlayer = new Dictionary<ulong, GradeRemove>();
[ChatCommand("grade")]
void Interface_New_Main(BasePlayer player) {
var Data = DataPlayer[player.userID];
var Interface = config.InterfaceSetting;
var MainInterface = Interface.MainInterfaces;
Data.RebootTimer();
if (player.HasFlag(BaseEntity.Flags.Reserved10)) {
Data.GradeLevel = 0;
CuiHelper.DestroyUi(player, GradeRemoveOverlay);
player.SetFlag(BaseEntity.Flags.Reserved10, false);
return;
}
player.SetFlag(BaseEntity.Flags.Reserved10, true);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = $"0.7075472 0.703154 0.5640352 0"
}
, RectTransform = {
AnchorMin = config.InterfaceSetting.MainInterfaces.Positions.AnchorMin, AnchorMax = config.InterfaceSetting.MainInterfaces.Positions.AnchorMax, OffsetMin = config.InterfaceSetting.MainInterfaces.Positions.OffsetMin, OffsetMax = config.InterfaceSetting.MainInterfaces.Positions.OffsetMax
}
}
, "Overlay", GradeRemoveOverlay);
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = HexToRustFormat(MainInterface.ColorPanel)
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0.092 0.274", OffsetMax = "190.0 30.00487"
}
}
, GradeRemoveOverlay, "InformationPanel");
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = HexToRustFormat(MainInterface.ColorText)
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "159.871 1.976", OffsetMax = "-29.360 -1.976487"
}
}
, "InformationPanel", "LinePanel");
if (Interface.MainInterfaces.ShowCloseButton) {
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat(MainInterface.ColorPanel), Command = "chat.say /grade"
}
, Text = {
Text = Interface.MainInterfaces.SymbolCloseButton, Font = "robotocondensed-regular.ttf", FontSize = 10, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1"
}
, RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "191.404 -29.453", OffsetMax = "210.07 0.273"
}
}
, GradeRemoveOverlay, "CloseUI");
}
CuiHelper.DestroyUi(player, "GradeRemoveOverlay");
CuiHelper.AddUi(player, container);
GradeRemove_Status(player);
GradeRemove_AllObject_Turned(player);
}
[ConsoleCommand("gr.func.turned")]
void UI_ConsoleCommandAdminMenu(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
var Data = DataPlayer[player.userID];
if (Data.GradeAllObject) Data.GradeAllObject = false;
else Data.GradeAllObject = true;
GradeRemove_AllObject_Turned(player);
}
[ConsoleCommand("remove")]
void RemoveCommandConsole(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
var Data = DataPlayer[player.userID];
if (Data.GradeLevel == 5) Data.GradeUP(player, true, 0);
else Data.GradeUP(player, true, 5);
if (!player.HasFlag(BaseEntity.Flags.Reserved10)) Interface_New_Main(player);
GradeRemove_Status(player);
}
///0 - солома
///1 - дерево
///2 - камень
///3 - металл
///4 - мвк
///5 - ремув
public class GradeRemove {
public int ActiveTime;
public int GradeLevel;
public Boolean GradeAllObject;
public Timer TimerEvent = null;
public void GradeUP(BasePlayer player, bool UseMyGrade = false, int CustomGrade = 0) {
if (config.UsePermission) foreach (var Perm in PermissionsLevel.Where(p => inst.permission.UserHasPermission(player.UserIDString, p.Value))) {
if (!UseMyGrade) {
if (GradeLevel == 5) GradeLevel = 0;
if (GradeLevel >= Perm.Key) continue;
GradeLevel = Perm.Key;
}
else if (String.IsNullOrWhiteSpace(PermissionsLevel[CustomGrade]) || inst.permission.UserHasPermission(player.UserIDString, PermissionsLevel[CustomGrade])) {
GradeLevel = CustomGrade;
return;
}
else inst.Interface_Error(player, inst.GetLang("NO_PERM_GRADE_REMOVE", player.UserIDString));
break;
}
else {
if (!UseMyGrade) {
if (GradeLevel > 4) GradeLevel = 0;
else GradeLevel++;
}
else GradeLevel = CustomGrade;
}
RebootTimer();
int TimeActive = CustomGrade != 0 & CustomGrade != 5 ? config.GradeSetting.GradeTime : config.RemoveSetting.RemoveTime;
ActiveTime = Convert.ToInt32(TimeActive + CurrentTime());
}
public void RebootTimer() {
if (TimerEvent != null) TimerEvent.Destroy();
}
}
private static Configuration config = new Configuration();
public Boolean IsRaidBlocked(BasePlayer player) {
var ret = Interface.Call("CanTeleport", player) as String;
if (ret != null) return true;
else return false;
}
/// <summary>
/// Обновление 1.2.3
/// - Корректировка проверки на билду
public static String PermissionGRMenu = "iqgraderemove.gruse";
[ChatCommand("remove")]
void RemoveCommand(BasePlayer player, string cmd, string[] arg) {
var Data = DataPlayer[player.userID];
if (Data.GradeLevel == 5) Data.GradeUP(player, true, 0);
else Data.GradeUP(player, true, 5);
if (!player.HasFlag(BaseEntity.Flags.Reserved10)) Interface_New_Main(player);
GradeRemove_Status(player);
}
public readonly Dictionary<Int32, String> StatusLevels = new Dictionary<Int32, String> {
[0]
= "ОТКЛЮЧЕНО", [1] = "ДЕРЕВА", [2] = "КАМНЯ", [3] = "МЕТАЛЛА", [4] = "МВК", [5] = "УДАЛЕНИЕ", [6] = "УДАЛЕНИЕ ВСЕГО", [7] = "УЛУЧШЕНИЕ ВСЕГО",
}
;
public readonly Dictionary<Int32, String> SoundLevelsGrade = new Dictionary<Int32, String> {
[0]
= "ОТКЛЮЧЕНО", [1] = "assets/bundled/prefabs/fx/build/frame_place.prefab", [2] = "assets/bundled/prefabs/fx/build/promote_stone.prefab", [3] = "assets/bundled/prefabs/fx/build/promote_metal.prefab", [4] = "assets/bundled/prefabs/fx/build/promote_toptier.prefab", [5] = "УДАЛЕНИЕ"
}
;
[ChatCommand("bgrade")]
void BGradeChatCommand(BasePlayer player, string cmd, string[] arg) {
var Data = DataPlayer[player.userID];
switch (arg.Length) {
case 0 : {
Data.GradeUP(player);
break;
}
case 1 : {
int GradeLevel;
if (!int.TryParse(arg[0], out GradeLevel) || GradeLevel < 0 || GradeLevel > 4) return;
Data.GradeUP(player, true, GradeLevel);
break;
}
}
if (!player.HasFlag(BaseEntity.Flags.Reserved10)) Interface_New_Main(player);
GradeRemove_Status(player);
if (Data.GradeLevel != 0) UpdateButton_Upgrade(player);
else CuiHelper.DestroyUi(player, $"UpgradeButtonStatus");
}
object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) {
String Alert = GradeErrorParse(player, entity.GetComponent<BuildingBlock>(), grade);
if (!String.IsNullOrWhiteSpace(Alert)) // grade
{
Interface_Error(player, Alert);
return false;
}
return null;
}
//void OnHammerHit(BasePlayer player, HitInfo info)
void OnHammerHitMethod(BasePlayer player, HitInfo info) {
if (info == null || player == null || info.HitEntity == null) return;
// PrintToChat("OnHammerHit");
var Data = DataPlayer[player.userID];
if (Data.GradeLevel == 5) if (info.HitEntity is BaseEntity) RemoveBuilding(player, info.HitEntity);
BuildingBlock buildingBlock = info.HitEntity as BuildingBlock;
if (buildingBlock == null) return;
if (Data.GradeAllObject && Data.GradeLevel > 0 && Data.GradeLevel != 5) {
GradeAll(player, buildingBlock);
return;
}
if(Data.GradeAllObject && Data.GradeLevel == 5) {
RemoveAll(player, buildingBlock);
return;
}
if (Data.GradeLevel != 0 && Data.GradeLevel != 5) {
if (buildingBlock.grade == (BuildingGrade.Enum)Data.GradeLevel) return;
GradeBuilding(player, buildingBlock);
}
}
public void GradeBuilding(BasePlayer player, BuildingBlock buildingBlock) {
var Data = DataPlayer[player.userID];
String AlertGrrade = GradeErrorParse(player, buildingBlock);
if (!String.IsNullOrWhiteSpace(AlertGrrade)) {
Interface_Error(player, AlertGrrade);
return;
}
if (!config.GradeSetting.UseBackUp) if (buildingBlock.grade > (BuildingGrade.Enum)Data.GradeLevel) return;
if (!permission.UserHasPermission(player.UserIDString, PermissionGRNoResource)) buildingBlock.PayForUpgrade(buildingBlock.GetGrade((BuildingGrade.Enum)Data.GradeLevel), player);
buildingBlock.SetGrade((BuildingGrade.Enum)Data.GradeLevel);
buildingBlock.SetHealthToMax();
buildingBlock.UpdateSkin();
Effect.server.Run(SoundLevelsGrade[Data.GradeLevel], player.GetNetworkPosition());
DataPlayer[player.userID].ActiveTime = (Int32)(config.GradeSetting.GradeTime + 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 is BuildingBlock || entity is BaseEntity) {
if (entity.net == null) return;
AddRemoveBlockBuild(entity.net.ID, player.userID);
AddBlockBuild(entity.net.ID, player.userID);
}
BuildingBlock buildingBlock = entity.GetComponent<BuildingBlock>();
if (buildingBlock == null) return;
var Data = DataPlayer[player.userID];
if (Data == null) return;
// if (Data.GradeLevel == 6 || Data.GradeLevel == 7) return;
if (Data.GradeLevel != 0 && Data.GradeLevel != 5) GradeBuilding(player, buildingBlock);
}
static Int32 CurrentTime() => Facepunch.Math.Epoch.Current;
public void RemoveAll(BasePlayer player, BaseEntity buildingBlock) {
if (buildingBlock.GetBuildingPrivilege() == null) {
Interface_Error(player, GetLang("REMOVE_ALL_NO_AUTH", player.UserIDString));
return;
}
ListHashSet<BuildingBlock> BlocksRemoveAll = new ListHashSet<BuildingBlock>();
foreach (var Block in buildingBlock.GetBuildingPrivilege().GetBuilding().buildingBlocks) if (!BlocksRemoveAll.Contains(Block)) BlocksRemoveAll.Add(Block);
NextTick(() => {
foreach (var Block in BlocksRemoveAll) Block.Kill();
}
);
}
object OnMeleeAttack(BasePlayer player, HitInfo info) {
if (!Tools.Contains(info?.WeaponPrefab?.name)) return null;
OnHammerHitMethod(player, info);
return null;
}
void WriteData() {
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQGradeRemove/BlockBuilding", BuildingRemoveTimers);
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQGradeRemove/BuildingRemoveBlock", BuildingRemoveBlock);
}
private Boolean IsBlockBuildPemanent(UInt32 netID) {
if (IsBlockAvailablePermanent(netID)) if (BuildingRemoveBlock[netID] <= CurrentTime()) return true;
else return false;
else return false;
}
[PluginReference]
Plugin Friends, IQTurret;
private void AddBlockBuild(UInt32 netID, UInt64 userID) {
var RemoveTime = config.RemoveSetting.TimedSetting;
if (!RemoveTime.UseTimesBlock) return;
if (IsBlockAvailable(netID)) return;
Int32 Time = GetTimeBlock(userID);
BuildingRemoveTimers.Add(netID, Time);
}
void RegisteredUser(BasePlayer player) {
if (!DataPlayer.ContainsKey(player.userID)) DataPlayer.Add(player.userID, new GradeRemove {
ActiveTime = 0, GradeLevel = 0
}
);
if (player.HasFlag(BaseEntity.Flags.Reserved10)) player.SetFlag(BaseEntity.Flags.Reserved10, false);
}
Int32 API_GET_GRADE_TIME_PLAYER(BasePlayer player) {
if (player == null) return 0;
if (!DataPlayer.ContainsKey(player.userID)) return 0;
if (DataPlayer[player.userID].GradeLevel == 0) return 0;
if (DataPlayer[player.userID].ActiveTime < CurrentTime()) return 0;
return DataPlayer[player.userID].ActiveTime - CurrentTime();
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
if (config.InterfaceSetting.MainInterfaces.Positions.AnchorMin == null) config.InterfaceSetting.MainInterfaces.Positions.AnchorMin = "0 0";
if (config.InterfaceSetting.MainInterfaces.Positions.AnchorMax == null) config.InterfaceSetting.MainInterfaces.Positions.AnchorMax = "0 0";
if (config.InterfaceSetting.MainInterfaces.Positions.OffsetMin == null) config.InterfaceSetting.MainInterfaces.Positions.OffsetMin = "16.19 19.273";
if (config.InterfaceSetting.MainInterfaces.Positions.OffsetMax == null) config.InterfaceSetting.MainInterfaces.Positions.OffsetMax = "396.002 78.727";
if (config.InterfaceSetting.MainInterfaces.ColorPanelBlured == null) config.InterfaceSetting.MainInterfaces.ColorPanelBlured = "#373737";
if (config.InterfaceSetting.MainInterfaces.ColorTextTwo == null) config.InterfaceSetting.MainInterfaces.ColorTextTwo = "#F3F3F3";
}
catch {
PrintWarning("Ошибка #132" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
public Dictionary<uint, int> BuildingRemoveBlock = new Dictionary<uint, int>();
public Dictionary<uint, int> BuildingRemoveTimers = new Dictionary<uint, int>();
private Int32 GetTimeBlockPermanent(UInt64 userID) {
var RemoveTime = config.RemoveSetting.TimedSetting;
Int32 Time = Convert.ToInt32(CurrentTime() + RemoveTime.TimeAllBlock);
foreach (var Perms in RemoveTime.ItemsTimesAllPermissions) if (permission.UserHasPermission(userID.ToString(), Perms.Key)) {
Time = Convert.ToInt32(CurrentTime() + Perms.Value);
return Time;
}
return Time;
}
public static StringBuilder sb = new StringBuilder();
void Init() => ReadData();
public string RemoveErrorParseBuilding(BasePlayer player, BaseEntity buildingBlock) {
var Remove = config.RemoveSetting;
var Block = Remove.SettingsBlock;
var RemoveTimed = Remove.TimedSetting;
if(buildingBlock.OwnerID == 0) return GetLang("REMOVE_ONLY_FRIENDS", player.UserIDString);
if (Block.NoEscape && IsRaidBlocked(player)) return GetLang("REMOVE_NO_ESCAPE", player.UserIDString);
if(IQTurret) {
if(buildingBlock is ElectricSwitch) if ((Boolean)IQTurret.CallHook("API_IS_TURRETLIST", buildingBlock.skinID)) return GetLang("IQTURRET_NO_DELETE_TUMBLER", player.UserIDString);
}
BuildingBlock buildingBlocks = buildingBlock.GetComponent<BuildingBlock>();
if (buildingBlocks != null) {
if (buildingBlocks.SecondsSinceAttacked < 30) return GetLang("REMOVE_ATTACKED_BLOCK", player.UserIDString, FormatTime(TimeSpan.FromSeconds(30 - (int)buildingBlocks.SecondsSinceAttacked)));
}
BuildingPrivlidge privilege = player.GetBuildingPrivilege(player.WorldSpaceBounds());
if (Block.Friends && player.userID != buildingBlock.OwnerID) {
if (!IsFriends(player.userID, buildingBlock.OwnerID)) return GetLang("REMOVE_ONLY_FRIENDS", player.UserIDString);
else if (player.IsBuildingBlocked()) return GetLang("REMOVE_NO_AUTH", player.UserIDString);
}
else if (privilege != null && !player.IsBuildingAuthed()) {
PrintToChat($"{player?.GetBuildingPrivilege()?.buildingID} - {buildingBlock?.GetBuildingPrivilege()?.buildingID}\n {player.IsBuildingAuthed()}\n");
return GetLang("REMOVE_NO_AUTH", player.UserIDString);
}
if (RemoveTimed.UseTimesBlock && IsBlockBuild(buildingBlock.net.ID)) return GetLang("REMOVE_TIME_EXECUTE", player.UserIDString, FormatTime(TimeSpan.FromSeconds(GetTimerBlock(buildingBlock.net.ID))));
if (RemoveTimed.UseAllBlock && IsBlockBuildPemanent(buildingBlock.net.ID)) return GetLang("REMOVE_TIME_EXECUTE_UNREMOVE", player.UserIDString);
if (Block.ShortnameNoteReturned.Contains(Regex.Replace(buildingBlock.ShortPrefabName.Replace("mining_quarry", "mining.quarry"), "\\.deployed|_deployed", ""))) return GetLang("REMOVE_UNREMOVE", player.UserIDString);
return "";
}
private new void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["TITLE_GR_ADMIN"]
= "<b><size=12>CHOOSE AVAILABLE MODE</size></b>", ["TITLE_TAKE_UP"] = "<b><size=12>UPGRADE</size></b>", ["TITLE_GR_ADMIN_ALL_OBJ"] = "<b><size=12>ВСЕ ПРИВЯЗАННЫЕ ОБЪЕКТЫ</size></b>", ["TITLE_TAKE_REMOVE"] = "<b><size=12>REMOVE</size></b>", ["GR_REMOVE_ALL_USE"] = "<b><size=10>REMOVE ALL</size></b>", ["GR_UP_ALL_USE"] = "<b><size=10>UP ALL</size></b>", ["REMOVE_TITLE"] = "<b><size=10>REMOVE ITEMS : {0}</size></b>", ["REMOVE_NO_ESCAPE"] = "<b><size=10>DO NOT REMOVE BUILDINGS DURING THE RAID</size></b>", ["REMOVE_NO_AUTH"] = "<b><size=10>DO NOT REMOVE OTHER BUILDINGS</size></b>", ["REMOVE_ATTACKED_BLOCK"] = "<b><size=11>CAN BE DELETED THROUG {0}</size></b>", ["REMOVE_TIME_EXECUTE"] = "<b><size=10>YOU CAN REMOVE AN OBJECT THROUGH : {0}</size></b>", ["REMOVE_TIME_EXECUTE_UNREMOVE"] = "<b><size=10>YOU CAN'T REMOVE IT MORE</size></b>", ["REMOVE_UNREMOVE"] = "<b><size=12>YOU CAN'T REMOVE</size></b>", ["REMOVE_ALL_UNDO"] = "<b><size=10>UNDO</size></b>", ["REMOVE_ONLY_FRIENDS"] = "<b><size=10>YOU CAN REMOVE FRIENDS ONLY</size></b>", ["GRADE_TITLE"] = "<b><size=10>UPDATE {0}</size></b>", ["GRADE_NO_ESCAPE"] = "<b><size=10>CANNOT IMPROVE BUILDINGS DURING THE RAID</size></b>", ["GRADE_NO_AUTH"] = "<b><size=10>DO NOT IMPROVE DEVELOPMENTS IN ANOTHER'S TERRITORY</size></b>", ["GRADE_ATTACKED_BLOCK"] = "<b><size=11>YOU CAN IMPROVE THROUGH {0}</size></b>", ["GRADE_NO_RESOURCE"] = "<b><size=11>NOT ENOUGH RESOURCES FOR IMPROVEMENT</size></b>", ["GRADE_NO_THIS_USER"] = "<b><size=11>A PLAYER IS IN THE CONSTRUCTION</size></b>", ["GRADE_ALL_NO_AUTH"] = "<b><size=10>IT IS IMPOSSIBLE TO IMPROVE EVERYTHING WITHOUT A CABINET</size></b>", ["REMOVE_ALL_NO_AUTH"] = "<b><size=10>DO NOT REMOVE ALL WITHOUT CABINET</size></b>", ["NO_PERM_GRADE_REMOVE"] = "<b><size=10>YOU HAVE NO RIGHT TO DO THIS</size></b>", ["IQTURRET_NO_DELETE_TUMBLER"] = "<b><size=10>YOU CANNOT DELETE THIS ITEM!</size></b>",
}
, this);
lang.RegisterMessages(new Dictionary<string, string> {
["TITLE_GR_ADMIN"]
= "<b><size=12>ВЫБЕРИТЕ ДОСТУПНЫЙ РЕЖИМ</size></b>", ["TITLE_GR_ADMIN_ALL_OBJ"] = "<b><size=12>ВСЕ ПРИВЯЗАННЫЕ ОБЪЕКТЫ</size></b>", ["TITLE_TAKE_UP"] = "<b><size=12>УЛУЧШЕНИЕ</size></b>", ["TITLE_TAKE_REMOVE"] = "<b><size=12>УДАЛЕНИЕ</size></b>", ["GR_UP_ALL_USE"] = "<b><size=10>УЛУЧШЕНИЯ ВСЕХ ОБЪЕКТОВ</size></b>", ["REMOVE_TITLE"] = "<b><size=10>УДАЛЕНИЕ ПОСТРОЕК : {0}</size></b>", ["REMOVE_NO_ESCAPE"] = "<b><size=10>НЕЛЬЗЯ УДАЛЯТЬ ПОСТРОЙКИ ВО ВРЕМЯ РЕЙДА</size></b>", ["REMOVE_NO_AUTH"] = "<b><size=10>НЕЛЬЗЯ УДАЛЯТЬ ЧУЖИЕ ПОСТРОЙКИ</size></b>", ["REMOVE_ATTACKED_BLOCK"] = "<b><size=11>УДАЛИТЬ МОЖНО БУДЕТ ЧЕРЕЗ {0}</size></b>", ["REMOVE_TIME_EXECUTE"] = "<b><size=10>ВЫ СМОЖЕТЕ УДАЛИТЬ ОБЪЕКТ ЧЕРЕЗ : {0}</size></b>", ["REMOVE_TIME_EXECUTE_UNREMOVE"] = "<b><size=10>ВЫ БОЛЬШЕ НЕ МОЖЕТЕ УДАЛИТЬ ЭТОТ ОБЪЕКТ</size></b>", ["REMOVE_UNREMOVE"] = "<b><size=12>ВЫ НЕ МОЖЕТЕ УДАЛИТЬ ЭТОТ ОБЪЕКТ</size></b>", ["REMOVE_ALL"] = "<b><size=10>ВКЛЮЧЕНО УДАЛЕНИЯ ВСЕХ ОБЪЕКТОВ</size></b>", ["REMOVE_ALL_UNDO"] = "<b><size=10>ВЕРНУТЬ</size></b>", ["REMOVE_ALL_NO_AUTH"] = "<b><size=10>НЕЛЬЗЯ УДАЛИТЬ ВСЕ БЕЗ ШКАФА</size></b>", ["REMOVE_ONLY_FRIENDS"] = "<b><size=10>ВЫ МОЖЕТЕ УДАЛЯТЬ ТОЛЬКО ПОСТРОЙКИ ДРУЗЕЙ</size></b>", ["GRADE_TITLE"] = "<b><size=10>УЛУЧШЕНИЕ ДО {0} : {1}</size></b>", ["GRADE_NO_ESCAPE"] = "<b><size=10>НЕЛЬЗЯ УЛУЧШАТЬ ПОСТРОЙКИ ВО ВРЕМЯ РЕЙДА</size></b>", ["GRADE_NO_AUTH"] = "<b><size=10>НЕЛЬЗЯ УЛУЧШАТЬ ПОСТРОЙКИ НА ЧУЖОЙ ТЕРРИТОРИИ</size></b>", ["GRADE_ATTACKED_BLOCK"] = "<b><size=11>УЛУЧШИТЬ МОЖНО БУДЕТ ЧЕРЕЗ {0}</size></b>", ["GRADE_NO_RESOURCE"] = "<b><size=11>НЕДОСТАТОЧНО РЕСУРСОВ ДЛЯ УЛУЧШЕНИЯ</size></b>", ["GRADE_NO_THIS_USER"] = "<b><size=11>В ПОСТРОЙКЕ НАХОДИТСЯ ПРЕДМЕТ</size></b>", ["GRADE_ALL_NO_AUTH"] = "<b><size=10>НЕЛЬЗЯ УЛУЧШИТЬ ВСЕ БЕЗ ШКАФА</size></b>", ["NO_PERM_GRADE_REMOVE"] = "<b><size=10>У ВАС НЕТ ПРАВ ДЛЯ ЭТОГО</size></b>", ["IQTURRET_NO_DELETE_TUMBLER"] = "<b><size=10>НЕЛЬЗЯ УДАЛИТЬ ЭТОТ ПРЕДМЕТ!</size></b>",
}
, this, "ru");
PrintWarning("Языковой файл загружен успешно");
}
void GradeRemove_AllObject_Turned(BasePlayer player) {
var Interface = config.InterfaceSetting;
var MainInterface = Interface.MainInterfaces;
var Data = DataPlayer[player.userID];
CuiHelper.DestroyUi(player, $"AdminButtonDeleteAll");
CuiElementContainer container = new CuiElementContainer();
if (permission.UserHasPermission(player.UserIDString, PermissionGRMenu)) {
String ColorButton = Data.GradeAllObject ? MainInterface.ColorPanelBlured : MainInterface.ColorPanel;
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat(ColorButton), Command = "gr.func.turned"
}
, Text = {
Text = GetLang("TITLE_GR_ADMIN_ALL_OBJ", player.UserIDString), Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat(MainInterface.ColorText)
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "193.415 31.363", OffsetMax = "379.905 59.727"
}
}
, "GradeRemoveOverlay", "AdminButtonDeleteAll");
}
CuiHelper.AddUi(player, container);
}
public static String FormatTime(TimeSpan time) {
String result = String.Empty;
if (time.Days != 0) result += $"{Format(time.Days, "д", "д", "д")} ";
if (time.Hours != 0) result += $"{Format(time.Hours, "ч", "ч", "ч")} ";
if (time.Minutes != 0) result += $"{Format(time.Minutes, "м", "м", "м")} ";
if (time.Seconds != 0) result += $"{Format(time.Seconds, "с", "с", "с")} ";
return result;
}
[ConsoleCommand("building.upgrade")]
void BUpgradeCommandConsole(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
var Data = DataPlayer[player.userID];
Int32 GradeLevel;
if (arg?.Args != null && Int32.TryParse(arg.Args[0], out GradeLevel)) {
if (GradeLevel < 0 || GradeLevel > 4) return;
Data.GradeUP(player, true, GradeLevel);
}
else Data.GradeUP(player);
if (!player.HasFlag(BaseEntity.Flags.Reserved10)) Interface_New_Main(player);
GradeRemove_Status(player);
if (Data.GradeLevel != 0) UpdateButton_Upgrade(player);
else CuiHelper.DestroyUi(player, $"UpgradeButtonStatus");
}
void OnPlayerConnected(BasePlayer player) => RegisteredUser(player);
public void RemoveBuilding(BasePlayer player, BaseEntity buildingBlock) {
String Alert = RemoveErrorParseBuilding(player, buildingBlock);
if (!String.IsNullOrWhiteSpace(Alert)) {
Interface_Error(player, Alert);
return;
}
ReturnedRemoveItems(player, buildingBlock);
NextTick(() => {
{
StorageContainer container = buildingBlock.GetComponent<StorageContainer>();
if (container != null) container.DropItems();
buildingBlock.Kill(BaseNetworkable.DestroyMode.Gib);
}
}
);
DataPlayer[player.userID].ActiveTime = (int)(config.RemoveSetting.RemoveTime + CurrentTime());
}
[ConsoleCommand("up")]
void UPCommandConsole(ConsoleSystem.Arg arg) {
BasePlayer player = arg.Player();
if (player == null) return;
var Data = DataPlayer[player.userID];
Int32 GradeLevel;
if (arg?.Args != null && Int32.TryParse(arg.Args[0], out GradeLevel)) {
if (GradeLevel < 0 || GradeLevel > 4) return;
Data.GradeUP(player, true, GradeLevel);
}
else Data.GradeUP(player);
if (!player.HasFlag(BaseEntity.Flags.Reserved10)) Interface_New_Main(player);
GradeRemove_Status(player);
if (Data.GradeLevel != 0) UpdateButton_Upgrade(player);
else CuiHelper.DestroyUi(player, $"UpgradeButtonStatus");
}
void Update_Take_Button_UP(BasePlayer player) {
if (!player.HasFlag(BaseEntity.Flags.Reserved10)) return;
CuiHelper.DestroyUi(player, "ButtonUpgrade");
var Interface = config.InterfaceSetting;
var MainInterface = Interface.MainInterfaces;
var container = new CuiElementContainer();
var Data = DataPlayer[player.userID];
String ColorButton = Data.GradeLevel != 0 && Data.GradeLevel <= 4 ? MainInterface.ColorPanelBlured : MainInterface.ColorPanel;
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat(ColorButton), Command = "chat.say /up"
}
, Text = {
Text = GetLang("TITLE_TAKE_UP", player.UserIDString), Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat(MainInterface.ColorText)
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "193.415 0.273", OffsetMax = "284.785 29.999"
}
}
, "GradeRemoveOverlay", "ButtonUpgrade");
CuiHelper.AddUi(player, container);
}
protected override void SaveConfig() => Config.WriteObject(config);
private Boolean IsBlockAvailable(UInt32 netID) {
if (BuildingRemoveTimers.ContainsKey(netID)) return true;
else return false;
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
void UpdateButton_Upgrade(BasePlayer player) {
if (!config.InterfaceSetting.MainInterfaces.ShowLevelUp) return;
if (!player.HasFlag(BaseEntity.Flags.Reserved10)) return;
var Interface = config.InterfaceSetting;
var MainInterface = Interface.MainInterfaces;
var Data = DataPlayer[player.userID];
CuiHelper.DestroyUi(player, $"UpgradeButtonStatus");
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel {
CursorEnabled = false, Image = {
Color = "0.2196079 0.2196079 0.2196079 0"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0.091 31.363", OffsetMax = "190.001 59.727"
}
}
, GradeRemoveOverlay, "UpgradeButtonStatus");
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat(MainInterface.ColorPanel), Command = "up 1"
}
, Text = {
Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "0 0", OffsetMax = "-145.386 0.364"
}
}
, "UpgradeButtonStatus", "ButtonUpgradeLevelOne");
String HexGradeWood = Data.GradeLevel == 1 ? MainInterface.ColorTextTwo : MainInterface.ColorPanelBlured;
String SpriteCheckWood = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[1]) ? "assets/icons/level_wood.png" : "assets/icons/occupied.png" : "assets/icons/level_wood.png";
String AnchorMinWood = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[1]) ? "0.2 0.1" : "0.25 0.15" : "0.2 0.1";
String AnchorMaxWood = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[1]) ? "0.8 0.9" : "0.75 0.85" : "0.8 0.9";
container.Add(new CuiPanel {
Image = {
Color = HexToRustFormat(HexGradeWood), Sprite = SpriteCheckWood
}
, RectTransform = {
AnchorMin = AnchorMinWood, AnchorMax = AnchorMaxWood
}
}
, "ButtonUpgradeLevelOne", "SpriteLevelOne");
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat(MainInterface.ColorPanel), Command = "up 2"
}
, Text = {
Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "48.993 0", OffsetMax = "-96.393 0.364"
}
}
, "UpgradeButtonStatus", "ButtonUpgradeLeveTwo");
String HexGradeStone = Data.GradeLevel == 2 ? MainInterface.ColorTextTwo : MainInterface.ColorPanelBlured;
String SpriteCheckStone = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[2]) ? "assets/icons/level_stone.png" : "assets/icons/occupied.png" : "assets/icons/level_stone.png";
String AnchorMinStone = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[2]) ? "0.2 0.1" : "0.25 0.15" : "0.2 0.1";
String AnchorMaxStone = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[2]) ? "0.8 0.9" : "0.75 0.85" : "0.8 0.9";
container.Add(new CuiPanel {
Image = {
Color = HexToRustFormat(HexGradeStone), Sprite = SpriteCheckStone
}
, RectTransform = {
AnchorMin = AnchorMinStone, AnchorMax = AnchorMaxStone
}
}
, "ButtonUpgradeLeveTwo", "SpriteLevelTwo");
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat(MainInterface.ColorPanel), Command = "up 3"
}
, Text = {
Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "96.893 0", OffsetMax = "-48.493 0.364"
}
}
, "UpgradeButtonStatus", "ButtonUpgradeLevelThree");
String HexGradeMetal = Data.GradeLevel == 3 ? MainInterface.ColorTextTwo : MainInterface.ColorPanelBlured;
String SpriteCheckMetal = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[3]) ? "assets/icons/level_metal.png" : "assets/icons/occupied.png" : "assets/icons/level_metal.png";
String AnchorMinMetal = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[3]) ? "0.2 0.1" : "0.25 0.15" : "0.2 0.1";
String AnchorMaxMetal = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[3]) ? "0.8 0.9" : "0.75 0.85" : "0.8 0.9";
container.Add(new CuiPanel {
Image = {
Color = HexToRustFormat(HexGradeMetal), Sprite = SpriteCheckMetal
}
, RectTransform = {
AnchorMin = AnchorMinMetal, AnchorMax = AnchorMaxMetal
}
}
, "ButtonUpgradeLevelThree", "SpriteLevelThree");
container.Add(new CuiButton {
Button = {
Color = HexToRustFormat(MainInterface.ColorPanel), Command = "up 4"
}
, Text = {
Text = "", Font = "robotocondensed-regular.ttf", FontSize = 14, Align = TextAnchor.UpperLeft, Color = "1 1 1 1"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMin = "145.386 0", OffsetMax = "0 0.364"
}
}
, "UpgradeButtonStatus", "ButtonUpgradeLevelFo");
String HexGradeTop = Data.GradeLevel == 4 ? MainInterface.ColorTextTwo : MainInterface.ColorPanelBlured;
String SpriteCheckTop = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[4]) ? "assets/icons/level_top.png" : "assets /icons/occupied.png" : "assets/icons/level_top.png";
String AnchorMinTop = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[4]) ? "0.2 0.1" : "0.25 0.15" : "0.2 0.1";
String AnchorMaxTop = config.UsePermission ? permission.UserHasPermission(player.UserIDString, PermissionsLevel[4]) ? "0.8 0.9" : "0.75 0.85" : "0.8 0.9";
container.Add(new CuiPanel {
Image = {
Color = HexToRustFormat(HexGradeTop), Sprite = SpriteCheckTop
}
, RectTransform = {
AnchorMin = AnchorMinTop, AnchorMax = AnchorMaxTop
}
}
, "ButtonUpgradeLevelFo", "SpriteLevelFo");
CuiHelper.AddUi(player, container);
}
private static string HexToRustFormat(string hex) {
Color color;
ColorUtility.TryParseHtmlString(hex, out color);
return string.Format("{0:F2} {1:F2} {2:F2} {3:F2}", color.r, color.g, color.b, color.a);
}
void OnNewSave(string filename) {
BuildingRemoveTimers.Clear();
BuildingRemoveBlock.Clear();
WriteData();
}
private class Configuration {
[JsonProperty("Использовать пермишенсы для включения определенного UP или ремува(смотрите в описании плагина, там указаны права)")]
public bool UsePermission;
[JsonProperty("Настройка улучшения объектов")]
public GradeSettings GradeSetting = new GradeSettings();
[JsonProperty("Настройка удаления объектов")]
public RemoveSettings RemoveSetting = new RemoveSettings();
public static Configuration GetNewConfiguration() {
return new Configuration {
UsePermission = false, RemoveSetting = new RemoveSettings {
RemoveTime = 30, ReturnedSetting = new RemoveSettings.ReturnedSettings {
UseReturnedResource = true, PercentReturnRecource = 50, UseDamageReturned = true, UseAllowedReturned = true, ShortnameNoteReturned = new List<string> {
"campfire",
}
}
, TimedSetting = new RemoveSettings.TimedSettings {
UseAllBlock = false, TimeAllBlock = 60, ItemsTimesAllPermissions = new Dictionary<string, int> {
["iqgraderemove.vip"]
= 200, ["iqgraderemove.prem"] = 250, ["iqgraderemove.gold"] = 300,
}
, UseTimesBlock = false, TimesBlock = 100, ItemsTimesPermissions = new Dictionary<string, int> {
["iqgraderemove.vip"]
= 150, ["iqgraderemove.prem"] = 200, ["iqgraderemove.gold"] = 300,
}
,
}
, SettingsBlock = new RemoveSettings.SettingsBlocks {
Friends = true, NoEscape = true, ShortnameNoteReturned = new List<string> {
"campfire",
}
}
}
, GradeSetting = new GradeSettings {
GradeTime = 30, UseBackUp = false, SettingsBlock = new GradeSettings.SettingsBlocks {
NoEscape = true,
}
}
, InterfaceSetting = new InterfaceSettings {
MainInterfaces = new InterfaceSettings.MainInterface {
ColorPanel = "#525252", ColorPanelBlured = "#373737", ColorText = "#C9C0B9FF", ColorTextTwo = "#F3F3F3", SymbolCloseButton = "<", ShowCloseButton = true, ShowLevelUp = true, HideMenuTimer = true, Positions = new InterfaceSettings.MainInterface.InterfacePosition {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "16.19 19.273", OffsetMax = "396.002 78.727"
}
}
,
}
,
}
;
}
internal class RemoveSettings {
[JsonProperty("Настройка запретов")]
public SettingsBlocks SettingsBlock = new SettingsBlocks();
internal class ReturnedSettings {
[JsonProperty("Снижать состояние предмета при возврате?Эффект будто он поднял его через RUST систему")]
public bool UseDamageReturned;
[JsonProperty("Возвращать все предметы при удалении?(true- да/false - нет)")]
public bool UseAllowedReturned;
[JsonProperty("Возвращать ресурсы за удаление строений?(true- да/false - нет)")]
public bool UseReturnedResource;
[JsonProperty("Предметы,которые не возвращаются при удалении(Shortname)")]
public List<string> ShortnameNoteReturned = new List<string>();
[JsonProperty("Процент возврата ресурсов за удаление строений?(true- да/false - нет)")]
public int PercentReturnRecource;
}
internal class SettingsBlocks {
[JsonProperty("[NoEscape] Запретить удаление во время рейдблока(true - да/false - нет)")]
public bool NoEscape;
[JsonProperty("[Friends] Удалять постройки могут только друзья(Иначе все,кто есть в шкафу)(true - да/false - нет)")]
public bool Friends;
[JsonProperty("Предметы,которые нельзя удалить(Shortname)")]
public List<string> ShortnameNoteReturned = new List<string>();
}
internal class TimedSettings {
[JsonProperty("Включить полный запрет на удаление объекта через N время(Пример : Через 3 часа после постройки,его нельзя будет удалить вообще)")]
public bool UseAllBlock;
[JsonProperty("Через сколько нельзя будет удалять постройку вообще")]
public int TimeAllBlock;
[JsonProperty("Кастомный список предметов,которые нельзя будет удалить через время по правам.[[IQGradeRemove.NAME]] - Время(в сек)")]
public Dictionary<string, int> ItemsTimesAllPermissions = new Dictionary<string, int>();
[JsonProperty("Использовать запрет на удаление постройки на время(После постройки объекта,его N количество времени нельзя будет удалить)")]
public bool UseTimesBlock;
[JsonProperty("Через сколько можно будет удалять постройку(если включено)")]
public int TimesBlock;
[JsonProperty("Кастомный список предметов,которые можно будет удалить через время по правам.[[IQGradeRemove.NAME]] - Время(в сек)")]
public Dictionary<string, int> ItemsTimesPermissions = new Dictionary<string, int>();
}
[JsonProperty("Настройка возврата предметов после удаления")]
public ReturnedSettings ReturnedSetting = new ReturnedSettings();
[JsonProperty("Время действия удаления")]
public int RemoveTime;
[JsonProperty("Настройка удаления через время")]
public TimedSettings TimedSetting = new TimedSettings();
}
internal class GradeSettings {
[JsonProperty("Время действия улучшения")]
public int GradeTime;
[JsonProperty("Разрешить обратное улучшение?(Пример : МВК стенку откатить в деревянную)(true - да/false - нет)")]
public bool UseBackUp;
[JsonProperty("Настройка запретов")]
public SettingsBlocks SettingsBlock = new SettingsBlocks();
internal class SettingsBlocks {
[JsonProperty("[NoEscape] Запретить улучшение во время рейдблока(true - да/false - нет)")]
public bool NoEscape;
}
}
[JsonProperty("Настройка интерфейса")]
public InterfaceSettings InterfaceSetting = new InterfaceSettings();
internal class InterfaceSettings {
[JsonProperty("Настройка интерфейса")]
public MainInterface MainInterfaces = new MainInterface();
internal class MainInterface {
[JsonProperty("Скрывать интерфейс по истечению таймера")]
public Boolean HideMenuTimer;
[JsonProperty("Отображать уровни улучшений в интерфейсе")]
public Boolean ShowLevelUp;
[JsonProperty("Отображать кнопку закрыть в меню")]
public Boolean ShowCloseButton;
[JsonProperty("Символ для кнопки закрыть")]
public String SymbolCloseButton;
[Json
// ... [Code preview truncated due to length. Full source in attached file] ...