C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("IQGradeRemove", "https://topplugin.ru / https://discord.com/invite/5DPTsRmd3G", "0.1.4")]
[Description("Умный Grade Remove")]
class IQGradeRemove : RustPlugin
{
/// <summary>
/// Обновление 0.1.3
/// - Изменен метод проверки на объекты при постройке
/// Обновление 0.1.4
/// - Поправлена проверка на ресурсы при улучшении всех объектов
/// - Исправлен интерфейс
/// - Добавлена проверка на null в хуке OnHammerHit
/// </summary>
#region Vars
public static String PermissionGRMenu = "iqgraderemove.gruse";
public static String PermissionGRNoResource = "iqgraderemove.grusenorecource";
public readonly Dictionary<Int32, String> StatusLevels = new Dictionary<Int32, String>
{
[0] = "ОТКЛЮЧЕНО",
[1] = "ДЕРЕВА",
[2] = "КАМНЯ",
[3] = "МЕТАЛЛА",
[4] = "МВК",
[5] = "УДАЛЕНИЕ",
[6] = "УДАЛЕНИЕ ВСЕГО",
[7] = "УЛУЧШЕНИЕ ВСЕГО",
};
public readonly Dictionary<Int32, String> StatusLevelsAllGrades = new Dictionary<Int32, String>
{
[0] = "В СОЛОМУ",
[1] = "В ДЕРЕВО",
[2] = "В КАМЕНЬ",
[3] = "В МЕТАЛЛ",
[4] = "В МВК",
};
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] = "УДАЛЕНИЕ"
};
public static readonly Dictionary<Int32, String> PermissionsLevel = new Dictionary<Int32, String>
{
[0] = "",
[1] = "iqgraderemove.upwood",
[2] = "iqgraderemove.upstones",
[3] = "iqgraderemove.upmetal",
[4] = "iqgraderemove.uphmetal",
[5] = "iqgraderemove.removeuse",
};
#region Format Time
static Int32 CurrentTime() => Facepunch.Math.Epoch.Current;
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;
}
private static String Format(Int32 units, String form1, String form2, String form3)
{
var tmp = units % 10;
if (units >= 5 && units <= 20 || tmp >= 5 && tmp <= 9)
return $"{units} {form1}";
if (tmp >= 2 && tmp <= 4)
return $"{units} {form2}";
return $"{units} {form3}";
}
#endregion
#endregion
#region Reference
[PluginReference] Plugin Friends;
public Boolean IsRaidBlocked(BasePlayer player)
{
var ret = Interface.Call("CanTeleport", player) as String;
if (ret != null)
return true;
else return false;
}
public Boolean IsFriends(UInt64 userID, UInt64 targetID)
{
if (Friends)
return (Boolean)Friends?.Call("HasFriend", userID, targetID);
else return false;
}
void RegisteredPermissions()
{
var RemoveTimed = config.RemoveSetting.TimedSetting;
foreach (var PermsBlockTimed in RemoveTimed.ItemsTimesAllPermissions)
if (!permission.PermissionExists(PermsBlockTimed.Key, this))
permission.RegisterPermission(PermsBlockTimed.Key, this);
foreach (var PermsBlockTimed in RemoveTimed.ItemsTimesPermissions)
if (!permission.PermissionExists(PermsBlockTimed.Key, this))
permission.RegisterPermission(PermsBlockTimed.Key, this);
if (!permission.PermissionExists(PermissionGRMenu, this))
permission.RegisterPermission(PermissionGRMenu, this);
if (!permission.PermissionExists(PermissionGRNoResource, this))
permission.RegisterPermission(PermissionGRNoResource, this);
foreach (string Permissions in PermissionsLevel.Values)
if (!permission.PermissionExists(Permissions, this))
permission.RegisterPermission(Permissions, this);
}
#endregion
#region Configuration
private static Configuration config = new Configuration();
private class Configuration
{
[JsonProperty("Настройка удаления объектов")]
public RemoveSettings RemoveSetting = new RemoveSettings();
[JsonProperty("Настройка улучшения объектов")]
public GradeSettings GradeSetting = new GradeSettings();
[JsonProperty("Настройка интерфейса")]
public InterfaceSettings InterfaceSetting = new InterfaceSettings();
[JsonProperty("Использовать пермишенсы для включения определенного UP или ремува(смотрите в описании плагина, там указаны права)")]
public bool UsePermission;
#region Remove Configuration
internal class RemoveSettings
{
[JsonProperty("Настройка возврата предметов после удаления")]
public ReturnedSettings ReturnedSetting = new ReturnedSettings();
[JsonProperty("Настройка удаления через время")]
public TimedSettings TimedSetting = new TimedSettings();
[JsonProperty("Настройка запретов")]
public SettingsBlocks SettingsBlock = new SettingsBlocks();
[JsonProperty("Время действия удаления")]
public int RemoveTime;
internal class ReturnedSettings
{
[JsonProperty("Возвращать ресурсы за удаление строений?(true- да/false - нет)")]
public bool UseReturnedResource;
[JsonProperty("Процент возврата ресурсов за удаление строений?(true- да/false - нет)")]
public int PercentReturnRecource;
[JsonProperty("Возвращать все предметы при удалении?(true- да/false - нет)")]
public bool UseAllowedReturned;
[JsonProperty("Снижать состояние предмета при возврате?Эффект будто он поднял его через RUST систему")]
public bool UseDamageReturned;
[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>();
}
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>();
}
}
#endregion
#region Grade Configuration
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;
}
}
#endregion
#region Interface
internal class InterfaceSettings
{
[JsonProperty("Настройка интерфейса")]
public MainInterface MainInterfaces = new MainInterface();
internal class MainInterface
{
[JsonProperty("Цвет панели(HEX)")]
public string ColorPanel;
[JsonProperty("Цвет текста(HEX)")]
public string ColorText;
}
}
#endregion
public static Configuration GetNewConfiguration()
{
return new Configuration
{
UsePermission = false,
#region Remove Configuration
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",
}
}
},
#endregion
#region Grade Configuration
GradeSetting = new GradeSettings
{
GradeTime = 30,
UseBackUp = false,
SettingsBlock = new GradeSettings.SettingsBlocks
{
NoEscape = true,
}
},
#endregion
#region Interface
InterfaceSetting = new InterfaceSettings
{
MainInterfaces = new InterfaceSettings.MainInterface
{
ColorPanel = "#525252",
ColorText = "#C9C0B9FF",
},
},
#endregion
};
}
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch
{
PrintWarning("Ошибка #132" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Data
public Dictionary<ulong, GradeRemove> DataPlayer = new Dictionary<ulong, GradeRemove>();
public Dictionary<uint, int> BuildingRemoveTimers = new Dictionary<uint, int>();
public Dictionary<uint, int> BuildingRemoveBlock = new Dictionary<uint, int>();
void ReadData() {
BuildingRemoveTimers = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<uint, int>>("IQGradeRemove/BlockBuilding");
BuildingRemoveBlock = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<uint, int>>("IQGradeRemove/BuildingRemoveBlock");
}
void WriteData() {
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQGradeRemove/BlockBuilding", BuildingRemoveTimers);
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQGradeRemove/BuildingRemoveBlock", BuildingRemoveBlock);
}
///0 - солома
///1 - дерево
///2 - камень
///3 - металл
///4 - мвк
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();
}
}
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);
}
#endregion
#region Grade Core
public String GradeErrorParse(BasePlayer player, BuildingBlock buildingBlock, BuildingGrade.Enum grade = BuildingGrade.Enum.None)
{
var Data = DataPlayer[player.userID];
var Block = config.GradeSetting.SettingsBlock;
if (DeployVolume.Check(buildingBlock.transform.position, buildingBlock.transform.rotation, PrefabAttribute.server.FindAll<DeployVolume>(buildingBlock.prefabID), ~(1 << buildingBlock.gameObject.layer)))
return GetLang("GRADE_NO_THIS_USER", player.UserIDString);
if (Block.NoEscape && IsRaidBlocked(player))
return GetLang("GRADE_NO_ESCAPE", player.UserIDString);
if (buildingBlock.SecondsSinceAttacked < 30)
return GetLang("GRADE_ATTACKED_BLOCK", player.UserIDString, FormatTime(TimeSpan.FromSeconds(30 - (int)buildingBlock.SecondsSinceAttacked)));
if (!player.CanBuild())
return GetLang("GRADE_NO_AUTH", player.UserIDString);
if (!permission.UserHasPermission(player.UserIDString, PermissionGRNoResource))
{
Int32 Grade = grade == BuildingGrade.Enum.None ? Data.GradeLevel : (Int32)grade;
if (!buildingBlock.CanAffordUpgrade((BuildingGrade.Enum)Grade, player))
return GetLang("GRADE_NO_RESOURCE", player.UserIDString);
}
return "";
}
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());
}
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();
}
}
}
#endregion
#region Remove Core
#region Permanent Block
private void AddRemoveBlockBuild(UInt32 netID, UInt64 userID)
{
var RemoveTime = config.RemoveSetting.TimedSetting;
if (!RemoveTime.UseTimesBlock) return;
if (IsBlockAvailablePermanent(netID)) return;
Int32 Time = GetTimeBlockPermanent(userID);
BuildingRemoveBlock.Add(netID, Time);
}
private Boolean IsBlockAvailablePermanent(UInt32 netID)
{
if (BuildingRemoveBlock.ContainsKey(netID))
return true;
else return false;
}
private Boolean IsBlockBuildPemanent(UInt32 netID)
{
if (IsBlockAvailablePermanent(netID))
if (BuildingRemoveBlock[netID] <= CurrentTime())
return true;
else return false;
else return false;
}
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;
}
#endregion
#region Temporally Block
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);
}
private Boolean IsBlockAvailable(UInt32 netID)
{
if (BuildingRemoveTimers.ContainsKey(netID))
return true;
else return false;
}
private Boolean IsBlockBuild(UInt32 netID)
{
if (IsBlockAvailable(netID))
if (BuildingRemoveTimers[netID] > CurrentTime())
return true;
else return false;
else return false;
}
private Int32 GetTimeBlock(UInt64 userID = 0)
{
var RemoveTime = config.RemoveSetting.TimedSetting;
Int32 Time = Convert.ToInt32(CurrentTime() + RemoveTime.TimesBlock);
if (!userID.IsSteamId()) return Time;
foreach (var Perms in RemoveTime.ItemsTimesPermissions)
if (permission.UserHasPermission(userID.ToString(), Perms.Key))
{
Time = Convert.ToInt32(CurrentTime() + Perms.Value);
return Time;
}
return Time;
}
private Int32 GetTimerBlock(UInt32 netID)
{
Int32 Time = 0;
if (IsBlockAvailable(netID))
Time = Convert.ToInt32(BuildingRemoveTimers[netID] - CurrentTime());
return Time;
}
#endregion
void ReturnedRemoveItems(BasePlayer player, BaseEntity buildingBlock)
{
var Remove = config.RemoveSetting.ReturnedSetting;
if (Remove.UseReturnedResource)
if (buildingBlock is StabilityEntity)
{
Single PercentResource = (Single)((Single)(Remove.PercentReturnRecource) / (Single)(100));
foreach (var CostReturned in (buildingBlock as StabilityEntity).BuildCost())
player.GiveItem(ItemManager.Create(CostReturned.itemDef, Mathf.FloorToInt((Single)CostReturned.amount * PercentResource)));
return;
}
if (Remove.UseAllowedReturned)
{
Item ItemReturned = buildingBlock is BaseOven ? ItemManager.CreateByName(buildingBlock.ShortPrefabName, 1) : ItemManager.Create(buildingBlock.GetComponent<BaseCombatEntity>().pickup.itemTarget, 1);
if (ItemReturned == null) return;
if (Remove.UseDamageReturned)
{
Single healthFraction = buildingBlock.GetComponent<BaseCombatEntity>().Health() / buildingBlock.GetComponent<BaseCombatEntity>().MaxHealth();
ItemReturned.conditionNormalized = Mathf.Clamp01(healthFraction - buildingBlock.GetComponent<BaseCombatEntity>().pickup.subtractCondition);
}
player.GiveItem(ItemReturned);
return;
}
}
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();
});
}
public string RemoveErrorParseBuilding(BasePlayer player, BaseEntity buildingBlock)
{
var Remove = config.RemoveSetting;
var Block = Remove.SettingsBlock;
var RemoveTimed = Remove.TimedSetting;
if (Block.NoEscape && IsRaidBlocked(player))
return GetLang("REMOVE_NO_ESCAPE", 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)));
}
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 (player.IsBuildingBlocked())
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(buildingBlock.ShortPrefabName))
return GetLang("REMOVE_UNREMOVE", player.UserIDString);
return "";
}
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());
}
#endregion
#region Commands
[ConsoleCommand("turned_all_object")]
void TunredAllObject(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (player == null) return;
if (arg == null || arg.Args == null || arg.Args.Length == 0 || arg.Args.Length > 1)
{ return; }
var Data = DataPlayer[player.userID];
}
[ConsoleCommand("up")]
void UPCommandConsole(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (player == null) return;
var Data = DataPlayer[player.userID];
if (arg == null || arg.Args == null || arg.Args.Length == 0 || arg.Args.Length > 2)
Data.GradeUP(player);
else
{
switch (arg.Args.Length)
{
case 0:
{
Data.GradeUP(player);
break;
}
case 1:
{
int GradeLevel;
if (!int.TryParse(arg.Args[0], out GradeLevel) || GradeLevel < 0 || GradeLevel > 4)
return;
Data.GradeUP(player, true, GradeLevel);
break;
}
default:
{
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");
}
[ConsoleCommand("building.upgrade")]
void BUpgradeCommandConsole(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (player == null) return;
var Data = DataPlayer[player.userID];
if (arg == null || arg.Args == null || arg.Args.Length == 0 || arg.Args.Length > 2)
Data.GradeUP(player);
else
{
switch (arg.Args.Length)
{
case 0:
{
Data.GradeUP(player);
break;
}
case 1:
{
int GradeLevel;
if (!int.TryParse(arg.Args[0], out GradeLevel) || GradeLevel < 0 || GradeLevel > 4)
return;
Data.GradeUP(player, true, GradeLevel);
break;
}
default: { 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");
}
[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);
}
[ChatCommand("up")]
void UPCommand(BasePlayer player, string cmd, string[] arg)
{
var Data = DataPlayer[player.userID];
switch (arg.Length)
{
case 0:
{
Data.GradeUP(player);
break;
}
case 1:
{
Int32 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");
}
[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");
}
[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);
}
[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);
}
#endregion
#region Hooks
void OnHammerHit(BasePlayer player, HitInfo info)
{
if (info == null || player == null || info.HitEntity == null) return;
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);
}
}
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;
}
private void OnEntityBuilt(Planner plan, GameObject go)
{
BasePlayer player = plan?.GetOwnerPlayer();
if (player == null || go == null) return;
if (go.ToBaseEntity() is BuildingBlock || go.ToBaseEntity() is BaseEntity)
{
AddRemoveBlockBuild(go.ToBaseEntity().net.ID, player.userID);
AddBlockBuild(go.ToBaseEntity().net.ID, player.userID);
}
BuildingBlock buildingBlock = go.ToBaseEntity().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);
}
#region Server Hooks
public static IQGradeRemove inst;
void Init() => ReadData();
private void OnServerInitialized()
{
inst = this;
foreach (var p in BasePlayer.activePlayerList)
OnPlayerConnected(p);
RegisteredPermissions();
}
void OnPlayerConnected(BasePlayer player) => RegisteredUser(player);
void Unload()
{
WriteData();
foreach (var player in BasePlayer.activePlayerList)
{
CuiHelper.DestroyUi(player, GradeRemoveOverlay);
if (player.HasFlag(BaseEntity.Flags.Reserved10))
player.SetFlag(BaseEntity.Flags.Reserved10, false);
}
}
void OnNewSave(string filename)
{
BuildingRemoveTimers.Clear();
BuildingRemoveBlock.Clear();
WriteData();
}
#endregion
#endregion
#region UI
public static String GradeRemoveOverlay = "GradeRemoveOverlay";
[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);
var container = new CuiElementContainer();
container.Add(new CuiPanel
{
CursorEnabled = false,
Image = { Color = $"0.7075472 0.703154 0.5640352 0" },
RectTransform = { AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "16.19 19.273", OffsetMax = "396.002 78.727" }
}, "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.01005 30" }
}, 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.361005 -1.976" }
}, "InformationPanel", "LinePanel");
container.Add(new CuiButton
{
Button = { Color = HexToRustFormat(MainInterface.ColorPanel), Command = "chat.say /grade" },
Text = { Text = "<", 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);
}
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 ? "#373737" : 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);
}
void Update_Take_Button_REMOVE(BasePlayer player)
{
if (!player.HasFlag(BaseEntity.Flags.Reserved10))
return;
CuiHelper.DestroyUi(player, "ButtonRemove");
CuiHelper.DestroyUi(player, $"UpgradeButtonStatus");
var Interface = config.InterfaceSetting;
var MainInterface = Interface.MainInterfaces;
var container = new CuiElementContainer();
var Data = DataPlayer[player.userID];
String ColorButton = Data.GradeLevel > 4 ? "#373737" : MainInterface.ColorPanel;
container.Add(new CuiButton
{
Button = { Color = HexToRustFormat(ColorButton), Command = "chat.say /remove" },
Text = { Text = GetLang("TITLE_TAKE_REMOVE", player.UserIDString), Font = "robotocondensed-bold.ttf", FontSize = 12, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat(MainInterface.ColorText) },
RectTransform = { AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "288.535 0.273", OffsetMax = "379.905 29.999" }
}, "GradeRemoveOverlay", "ButtonRemove");
CuiHelper.AddUi(player, container);
}
void GradeRemove_Status(BasePlayer player)
{
UpdateLabelStatus(player);
Update_Take_Button_UP(player);
Update_Take_Button_REMOVE(player);
}
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 ? "#373737" : 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);
}
void UpdateButton_
// ... [Code preview truncated due to length. Full source in attached file] ...