C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Newtonsoft.Json.Linq;
using Oxide.Core.Libraries.Covalence;
using Rust;
namespace Oxide.Plugins {
[Info("CaptureZone", "King", "1.0.0")]
public class CaptureZone : RustPlugin {
#region [Vars]
[PluginReference]
private Plugin ImageLibrary = null, Clans = null, MenuAlerts = null;
private string[] _gatherHooks = {
"OnDispenserGather", "OnDispenserBonus",
}
;
private static CaptureZone plugin;
private Dictionary<String, DateTime> CooldownNotifyFarm = new Dictionary<String, DateTime>();
private List<ulong> _CaptureCupboard = new List<ulong>();
private List<ulong> _CaptureDropBox = new List<ulong>();
private List<ulong> openUI = new List<ulong>();
private Dictionary<string, int> _itemIds = new Dictionary<string, int>();
#endregion
#region [Data]
public List<CaptureData> _CaptureList = new List<CaptureData>();
public class CaptureData {
public string captureName;
public string nameClan;
public int lastCapture;
public ulong Cupboard;
public ulong ResourseChest;
public Vector3 capturePosition;
}
private void SaveCapture() {
Interface.Oxide.DataFileSystem.WriteObject($"{Name}/CaptureList", _CaptureList);
}
private void LoadCapture() {
try {
_CaptureList = Interface.Oxide.DataFileSystem.ReadObject<List<CaptureData>>($"{Name}/CaptureList");
}
catch (Exception e) {
PrintError(e.ToString());
}
if (_CaptureList == null) _CaptureList = new List<CaptureData>();
}
#endregion
#region [Oxide]
private void OnPluginLoaded(Plugin plugin) {
NextTick(() => {
foreach (string hook in _gatherHooks) {
Unsubscribe(hook);
Subscribe(hook);
}
}
);
}
private void Init() {
plugin = this;
LoadCapture();
}
private void OnServerInitialized() {
GetCaptureZone();
cmd.AddChatCommand("capture", this, "ChatCommandCaptureZoneUI");
cmd.AddChatCommand("newcapture", this, "NewSpawnCaptureZone");
cmd.AddChatCommand("removecapture", this, "DeleteCaptureZone");
ImageLibrary?.Call("AddImage", "https://i.imgur.com/rMC4ulM.png", "button_capture_zone");
}
private void Unload() {
SaveCapture();
foreach (var key in _CaptureList) RemoveCaptureZone(key.capturePosition);
_CaptureManager.RemoveAll(x => {
UnityEngine.Object.Destroy(x);
return true;
}
);
foreach (BasePlayer player in BasePlayer.activePlayerList) CuiHelper.DestroyUi(player, "CaptureUI");
plugin = null;
}
private void OnNewSave(string filename) {
_CaptureList.Clear();
SaveCapture();
}
#endregion
#region [Rust]
private void OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item) {
if(dispenser == null || player == null) return;
var clan = GetClanTag(player.userID);
if (string.IsNullOrEmpty(clan)) return;
CaptureManager ActiveCaptureZone = FindCaptureZoneDistance(player.transform.position);
if (ActiveCaptureZone == null || string.IsNullOrEmpty(ActiveCaptureZone._data.nameClan)) return;
var memberList = GetClanMembers(ActiveCaptureZone._data.nameClan);
if (memberList == null || memberList == new List<string>()) return;
var entity = ActiveCaptureZone._entity;
if (entity == null) return;
var inventory = entity.GetComponent<StorageContainer>().inventory;
if (inventory == null) return;
var amount = Convert.ToInt32(item.amount * (config._ZoneSettings.CapturePrecent / 100f));
if (amount <= 0) return;
var itemToCreate = ItemManager.CreateByName(item.info.shortname, amount);
if (itemToCreate.amount <= 0) return;
itemToCreate.MoveToContainer(inventory);
if (CooldownNotifyFarm.ContainsKey(ActiveCaptureZone._data.nameClan)) if (CooldownNotifyFarm[ActiveCaptureZone._data.nameClan].Subtract(DateTime.Now).TotalSeconds >= 0) return;
if (inventory.capacity == inventory.itemList.Count) {
foreach (var key in memberList) {
var id = Convert.ToUInt64(key);
var memberClan = BasePlayer.FindByID(id);
if (memberClan == null || !memberClan.IsConnected) continue;
memberClan.ChatMessage($"Инвентарь территории {ActiveCaptureZone._data.captureName} переполен, залутайте его!");
CooldownNotifyFarm[ActiveCaptureZone._data.nameClan] = DateTime.Now.AddSeconds(5);
}
}
}
private void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item) => OnDispenserGather(dispenser, player, item);
private object OnEntityGroundMissing(BaseEntity entity) {
if (entity.OwnerID == 9997) return false;
return null;
}
private object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
if(entity.OwnerID == 9997) return true;
return null;
}
object CanLootEntity(BasePlayer player, DropBox DropBox) {
if (player == null || DropBox == null || !_CaptureDropBox.Contains(DropBox.net.ID.Value)) return null;
var clanName = GetClanTag(player.userID);
if (string.IsNullOrEmpty(clanName)) return false;
CaptureManager ActiveCaptureZone = FindCaptureZoneDropBox(DropBox.net.ID.Value);
if (ActiveCaptureZone != null) {
if (clanName != ActiveCaptureZone._data.nameClan) return false;
}
return null;
}
object OnCupboardAuthorize(BuildingPrivlidge privilege, BasePlayer player) {
if (privilege == null || player == null || !_CaptureCupboard.Contains(privilege.net.ID.Value)) return null;
CaptureManager ActiveCaptureZone = FindCaptureZoneCupboard(privilege.net.ID.Value);
if (ActiveCaptureZone != null) {
var clan = GetClanTag(player.userID);
if (string.IsNullOrEmpty(clan)) {
player.ChatMessage("У вас нет клана.");
return false;
}
if (ActiveCaptureZone.CaptureClan == clan) {
player.ChatMessage("Ваш клан уже захватывает данную территорию!");
return false;
}
var CaptureOtherZone = FindCaptureOtherClan(clan);
if (CaptureOtherZone != null) {
player.ChatMessage("Ваш клан уже захватывает другую территорию, дождитесь завершения захвата.");
return false;
}
ActiveCaptureZone.StartCapture(clan, player);
return false;
}
return null;
}
private object CanBuild(Planner builder, Construction prefab, Construction.Target target) {
var player = builder.GetOwnerPlayer();
if (player == null) return null;
CaptureManager ActiveCaptureZone = FindCaptureZoneDistance(player.transform.position);
if (ActiveCaptureZone != null) {
if (Vector3.Distance(player.transform.position, ActiveCaptureZone.transform.position) < config._ZoneSettings.RadiusBuild) {
player.ChatMessage("Нельзя строится так близко к захвату!");
return false;
}
}
return null;
}
#endregion
#region [Capture]
private void GetCaptureZone() {
/*if (_CaptureList.Count == 0)
{
var MapSize = TerrainMeta.Size / 2;
Dictionary<Vector3, String> ListPosition = new Dictionary<Vector3, String>()
{
[new Vector3(-MapSize.x, 0, MapSize.z)] = "A", // Левая верхняя
[new Vector3(MapSize.x / 9, 0, MapSize.z)] = "B", // Центральная верхняя
[new Vector3(MapSize.x, 0, MapSize.z)] = "C", // Правая верхняя
[new Vector3(-MapSize.x, 0, MapSize.z / 9)] = "D", // Левая Центральная
[new Vector3(MapSize.x / 9, 0, MapSize.z / 9)] = "E", // Центральная Центральная
[new Vector3(MapSize.x, 0, MapSize.z / 9)] = "F", // Правая Центральная
[new Vector3(-MapSize.x, 0, -MapSize.z)] = "G", // Левая Нижняя
[new Vector3(MapSize.x / 9, 0, -MapSize.z)] = "H", // Центральная Нижняя
[new Vector3(MapSize.x, 0, -MapSize.z)] = "L", // Правая Нижняя
};
foreach (var key in ListPosition)
{
var center = key.Key / 2;
Vector3 lastPosition = center;
for (int i = 0; i < 300; i++)
{
lastPosition = RandomCircle(lastPosition);
if (ValidPosition(ref lastPosition))
{
GetNewData(lastPosition, key.Value);
break;
}
}
}
}
else
{*/
foreach (var key in _CaptureList) {
SpawnCaptureZone(key.capturePosition);
}
//}
}
private void GetNewData(Vector3 position, String Name) {
_CaptureList.Add(new CaptureData {
captureName = Name, nameClan = string.Empty, lastCapture = 0, Cupboard = 0, ResourseChest = 0, capturePosition = position,
}
);
SpawnCaptureZone(position);
}
#endregion
#region [Prefab]
public class PrefabCaptureZone {
public Vector3 Position;
public string ShortPrefabName;
public Vector3 Rotation;
public PrefabCaptureZone(string shortname, Vector3 pos, Vector3 rot) {
ShortPrefabName = shortname;
Position = pos;
Rotation = rot;
}
}
public List<PrefabCaptureZone> _PrefabCaptureZone = new List<PrefabCaptureZone> {
// Foundation
new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, -3), new Vector3(0, 0, 0)), // CupboardPositionRoom
new PrefabCaptureZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(0, 0, 1.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(0, 0, -1.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/door.double.hinged/door.double.hinged.toptier.prefab", new Vector3(-1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/deployable/tool cupboard/cupboard.tool.deployed.prefab", new Vector3(1.1f, 0.1f, 0), new Vector3(0, 270, 0)), // Room
new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(0, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.garagedoor/wall.frame.garagedoor.prefab", new Vector3(0, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(0, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.garagedoor/wall.frame.garagedoor.prefab", new Vector3(0, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabCaptureZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-3, 0, 4.5f), new Vector3(0, 270, 0)), //Floor
new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(0, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, -3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, 3), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, -3), new Vector3(0, 0, 0)), //Rest
new PrefabCaptureZone("assets/prefabs/deployable/signs/sign.pole.banner.large.prefab", new Vector3(0, 3, 0), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(-0.7f, 1.5f, 1.6f), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(0.7f, 1.5f, 1.6f), new Vector3(0, 0, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(-0.7f, 1.5f, -1.6f), new Vector3(0, 180, 0)), new PrefabCaptureZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(0.7f, 1.5f, -1.6f), new Vector3(0, 180, 0)), new PrefabCaptureZone("assets/prefabs/deployable/dropbox/dropbox.deployed.prefab", new Vector3(0.8f, 1.2f, 0), new Vector3(0, 90, 0)),
}
;
private void RemoveCaptureZone(Vector3 position) {
List<BaseEntity> list_entity = new List<BaseEntity>();
Vis.Entities(position, 25, list_entity);
list_entity = list_entity.Distinct().ToList();
list_entity = list_entity.Where(x => !(x is BasePlayer) && !(x is PlayerCorpse) && !(x is DroppedItemContainer) && !(x is DroppedItem)).ToList();
foreach(BaseEntity entity in list_entity) if(entity != null && !entity.IsDestroyed) entity.Kill();
}
private void SpawnCaptureZone(Vector3 position) {
RemoveCaptureZone(position);
var find = _CaptureList.FirstOrDefault(p => p.capturePosition == position);
if (find == null) return;
foreach(var key in _PrefabCaptureZone) {
BaseEntity prefab = GameManager.server.CreateEntity(key.ShortPrefabName, position + key.Position, Quaternion.Euler(key.Rotation)) as BaseEntity;
prefab.OwnerID = 9997;
prefab.Spawn();
if (prefab is BuildingBlock) {
BuildingBlock block = prefab as BuildingBlock;
block.grade = BuildingGrade.Enum.TopTier;
block.SetHealthToMax();
}
if (prefab is BuildingPrivlidge) {
BuildingPrivlidge build = prefab as BuildingPrivlidge;
_CaptureCupboard.Add(build.net.ID.Value);
find.Cupboard = build.net.ID.Value;
}
if (prefab is DropBox) {
DropBox dropbox = prefab as DropBox;
dropbox.inventory.SetFlag(ItemContainer.Flag.NoItemInput, true);
dropbox.inventory.capacity = 40;
_CaptureDropBox.Add(dropbox.net.ID.Value);
find.ResourseChest = dropbox.net.ID.Value;
var obj = new GameObject();
obj.transform.position = dropbox.transform.position;
var component = obj.AddComponent<CaptureManager>();
component.GetComponent<CaptureManager>().Init(find, dropbox);
_CaptureManager.Add(component);
}
if (prefab is Door) {
Door door = prefab as Door;
door.pickup.enabled = false;
door.canTakeLock = false;
door.canTakeCloser = false;
door.SendNetworkUpdateImmediate();
}
if (prefab is BaseLadder) {
BaseLadder ladder = prefab as BaseLadder;
ladder.pickup.enabled = false;
}
}
}
#endregion
#region [UI]
private void ChatCommandCaptureZoneUI(BasePlayer player) => CaptureZoneUI(player, 0);
private void CaptureZoneUI(BasePlayer player, int page) {
var container = new CuiElementContainer();
string Layer = "CaptureZone_UI";
string colored = "0 0 0 0.5";
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
, Image = {
Material = "assets/content/ui/uibackgroundblur.mat", Color = "0 0 0 0.77"
}
}
, "Overlay", Layer);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.36 0.33 0.28 0.3", Material = "assets/icons/greyout.mat", Close = Layer
}
}
, Layer);
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-493 -293", OffsetMax = "497.5 293"
}
, Image = {
Color = "0.3773585 0.3755785 0.3755785 0.3407843", Material = "assets/icons/greyout.mat"
}
}
, Layer, Layer + ".Main");
container.Add(new CuiElement {
Parent = Layer + ".Main", Components = {
new CuiTextComponent {
Text = $"Список территорий", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 20, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0.915", AnchorMax = $"1 1"
}
,
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"0.00325 0.01", AnchorMax = $"0.035 0.067"
}
, Button = {
Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Command = page >= 1 ? $"UI_CAPTURE ChangePageCapture {page - 1}" : ""
}
, Text = {
Text = $"-", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 18, Font = "robotocondensed-bold.ttf"
}
}
, Layer + ".Main");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = $"0.0395 0.01", AnchorMax = $"0.07125 0.067"
}
, Image = {
Color = "0.2 0.2 0.2 0.65", Material = "assets/icons/greyout.mat"
}
}
, Layer + ".Main", Layer + ".Main" + ".pText");
container.Add(new CuiLabel {
RectTransform = {
AnchorMin = $"0 0", AnchorMax = $"1 1"
}
, Text = {
Text = $"{page + 1}", Color = "1 1 1 0.85", Font = "robotocondensed-regular.ttf", FontSize = 16, Align = TextAnchor.MiddleCenter
}
}
, Layer + ".Main" + ".pText");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"0.07575 0.01", AnchorMax = $"0.1075 0.067"
}
, Button = {
Color = "0.46 0.44 0.42 0.65", Material = "assets/icons/greyout.mat", Command = _CaptureManager.Skip(9 * (page + 1)).Count() > 0 ? $"UI_CAPTURE ChangePageCapture {page + 1}" : ""
}
, Text = {
Text = $"+", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 18, Font = "robotocondensed-bold.ttf"
}
}
, Layer + ".Main");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"0.890915 0.01", AnchorMax = $"0.99379 0.067", OffsetMax = "0 0"
}
, Button = {
Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Close = Layer
}
, Text = {
Text = $"ЗАКРЫТЬ", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
}
}
, Layer + ".Main");
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0 0.86", AnchorMax = "0.999 0.92"
}
, Image = {
Color = "1 1 1 0"
}
}
, Layer + ".Main", Layer + ".Main" + ".Text");
container.Add(new CuiLabel {
Text = {
Text = $"НАЗВАНИЕ ТЕРРИТОРИИ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
}
, RectTransform = {
AnchorMin = $"0.025 0", AnchorMax = $"1 1"
}
,
}
, Layer + ".Main" + ".Text");
container.Add(new CuiLabel {
Text = {
Text = $"ВЛАДЕЛЕЦ ТЕРРИТОРИИ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
}
, RectTransform = {
AnchorMin = $"0.23 0", AnchorMax = $"1 1"
}
,
}
, Layer + ".Main" + ".Text");
container.Add(new CuiLabel {
Text = {
Text = $"СОСТОЯНИЕ ТЕРРИТОРИИ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
}
, RectTransform = {
AnchorMin = $"0.42 0", AnchorMax = $"1 1"
}
,
}
, Layer + ".Main" + ".Text");
container.Add(new CuiLabel {
Text = {
Text = $"СОБРАТЬ РЕСУРСЫ", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
}
, RectTransform = {
AnchorMin = $"0.85 0", AnchorMax = $"1 1"
}
,
}
, Layer + ".Main" + ".Text");
for (int y = 0; y < 9; y++) {
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = $"0.0055 {0.775 - y * 0.085}", AnchorMax = $"0.989 {0.85 - y * 0.085}"
}
, Image = {
Color = colored
}
}
, Layer + ".Main", Layer + ".Main" + $".TopLine{y}");
}
int i = 0;
foreach (var key in _CaptureManager.Skip(page * 9).Take(9)) {
string nameClan = key._data.nameClan;
if (string.IsNullOrEmpty(key._data.nameClan)) nameClan = "Никто";
bool isTime = Facepunch.Math.Epoch.Current - key._data.lastCapture < config._ZoneSettings.CaptureCooldown;
string State = key._IsCapture == true ? "Идет захват" : isTime == true ? $"{GetFormatTime(TimeSpan.FromSeconds(key._data.lastCapture + config._ZoneSettings.CaptureCooldown - Facepunch.Math.Epoch.Current))}" : "Можно захватить";
container.Add(new CuiLabel {
Text = {
Text = $"{key._data.captureName}", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
}
, RectTransform = {
AnchorMin = $"0.027 0", AnchorMax = $"1 1"
}
,
}
, Layer + ".Main" + $".TopLine{i}");
container.Add(new CuiLabel {
Text = {
Text = $"{nameClan}", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
}
, RectTransform = {
AnchorMin = $"0.234 0", AnchorMax = $"1 1"
}
,
}
, Layer + ".Main" + $".TopLine{i}");
container.Add(new CuiLabel {
Text = {
Text = $"{State}", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleLeft
}
, RectTransform = {
AnchorMin = $"0.424 0", AnchorMax = $"1 1"
}
,
}
, Layer + ".Main" + $".TopLine{i}");
container.Add(new CuiLabel {
Text = {
Text = $"Открыть", Color = "1 1 1 1", FontSize = 14, Font = "robotocondensed-regular.ttf", Align = TextAnchor.MiddleCenter
}
, RectTransform = {
AnchorMin = $"0.85 0", AnchorMax = $"0.985 0.98"
}
,
}
, Layer + ".Main" + $".TopLine{i}");
container.Add(new CuiButton {
Button = {
Color = "0 0 0 0", Command = $"UI_CAPTURE OpenInventory {key._data.ResourseChest}"
}
, RectTransform = {
AnchorMin = $"0.85 0", AnchorMax = $"0.985 0.98"
}
,
}
, Layer + ".Main" + $".TopLine{i}");
i++;
}
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, container);
}
private void CaptureZoneUI_Inventory(BasePlayer player, StorageContainer containers, CaptureManager Capture) {
var container = new CuiElementContainer();
var Items = containers.inventory.itemList.Count;
string Layer = "CaptureZone_UI";
string colored = "0 0 0 0.5";
container.Add(new CuiPanel {
CursorEnabled = true, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0"
}
, Image = {
Material = "assets/content/ui/uibackgroundblur.mat", Color = "0 0 0 0.77"
}
}
, "Overlay", Layer);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Button = {
Color = "0.36 0.33 0.28 0.3", Material = "assets/icons/greyout.mat", Close = Layer
}
}
, Layer);
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-493 -293", OffsetMax = "497.5 293"
}
, Image = {
Color = "0.3773585 0.3755785 0.3755785 0.3407843", Material = "assets/icons/greyout.mat"
}
}
, Layer, Layer + ".Main");
container.Add(new CuiElement {
Parent = Layer + ".Main", Components = {
new CuiTextComponent {
Text = $"Ивентарь ящика территории {Capture._data.captureName}", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 20, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0.915", AnchorMax = $"1 1"
}
,
}
}
);
if (Items == 0) {
container.Add(new CuiElement {
Parent = Layer + ".Main", Components = {
new CuiTextComponent {
Text = $"Инвентарь к сожалению пуст :(", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 32, Font = "robotocondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = $"1 1"
}
,
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"0.890915 0.01", AnchorMax = $"0.99379 0.067", OffsetMax = "0 0"
}
, Button = {
Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Close = Layer
}
, Text = {
Text = $"ЗАКРЫТЬ", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
}
}
, Layer + ".Main");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"0.77804 0.01", AnchorMax = $"0.880915 0.067", OffsetMax = "0 0"
}
, Button = {
Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Command = "UI_CAPTURE ReturnToMenu"
}
, Text = {
Text = $"НАЗАД", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
}
}
, Layer + ".Main");
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, container);
return;
}
for (int i = 0, y = 0, x = 0; i < 40; i++) {
container.Add(new CuiPanel {
RectTransform = {
AnchorMin = $"{0.01 + (x * 0.123)} {0.76 - (y * 0.17)}", AnchorMax = $"{0.117 + (x * 0.123)} {0.92 - (y * 0.17)}"
}
, Image = {
Color = colored
}
}
, Layer + ".Main", Layer + ".Main" + $"Item{i}");
if (Items - 1 >= i) {
var Item = containers.inventory.itemList.ElementAt(i);
container.Add(new CuiElement {
Parent = Layer + ".Main" + $"Item{i}", Components = {
new CuiImageComponent {
ItemId = FindItemID(Item.info.shortname), SkinId = 0
}
, new CuiRectTransformComponent {
AnchorMin = "0.1 0.1", AnchorMax = "0.9 0.9"
}
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0 0 ", AnchorMax = "1 1", OffsetMax = "-5 0", OffsetMin = "5 2"
}
, Button = {
Color = "0 0 0 0", Command = $"UI_CAPTURE TakeItemInventory {Capture._data.ResourseChest} {Item.info.shortname}"
}
, Text = {
Text = $"{Item.amount}" + "шт", Align = TextAnchor.LowerCenter, Font = "robotocondensed-regular.ttf", FontSize = 12
}
}
, Layer + ".Main" + $"Item{i}");
}
x++;
if (x == 8) {
x = 0;
y++;
}
}
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"0.77804 0.01", AnchorMax = $"0.880915 0.067", OffsetMax = "0 0"
}
, Button = {
Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Command = "UI_CAPTURE ReturnToMenu"
}
, Text = {
Text = $"НАЗАД", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
}
}
, Layer + ".Main");
container.Add(new CuiButton {
RectTransform = {
AnchorMin = $"0.890915 0.01", AnchorMax = $"0.99379 0.067", OffsetMax = "0 0"
}
, Button = {
Color = "0.46 0.44 0.42 0.85", Material = "assets/icons/greyout.mat", Close = Layer
}
, Text = {
Text = $"ЗАКРЫТЬ", Color = "1 1 1 0.85", Align = TextAnchor.MiddleCenter, FontSize = 14, Font = "robotocondensed-bold.ttf"
}
}
, Layer + ".Main");
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, container);
}
#endregion
#region [ConsoleCommand]
[ConsoleCommand("UI_CAPTURE")]
private void CaptureUIHandler(ConsoleSystem.Arg args) {
BasePlayer player = args?.Player();
if (player == null || !args.HasArgs()) return;
var clan = GetClanTag(player.userID);
if (clan == null) return;
switch (args.Args[0]) {
case "OpenInventory" : {
var find = FindCaptureZoneDropBox(ulong.Parse(args.Args[1]));
if (find == null) return;
if (string.IsNullOrEmpty(clan)) {
player.ChatMessage("У вас нет клана.");
return;
}
if (find._data.nameClan != clan) {
player.ChatMessage("Данная территория находится не под вашем контролем.");
return;
}
StorageContainer container;
container = find._entity.GetComponent<StorageContainer>();
container.inventory.MarkDirty();
container.UpdateNetworkGroup();
CaptureZoneUI_Inventory(player, container, find);
break;
}
case "TakeItemInventory" : {
var find = FindCaptureZoneDropBox(ulong.Parse(args.Args[1]));
if (find == null || find._data.nameClan != clan) return;
StorageContainer container;
container = find._entity.GetComponent<StorageContainer>();
var findItem = container.inventory.itemList.FirstOrDefault(p => p.info.shortname == args.Args[2]);
if (findItem == null) return;
var item = ItemManager.CreateByName(findItem.info.shortname, findItem.amount, findItem.skin);
item.name = findItem.name;
item.MarkDirty();
player.GiveItem(item, BaseEntity.GiveItemReason.PickedUp);
findItem.RemoveFromContainer();
CaptureZoneUI_Inventory(player, container, find);
break;
}
case "ReturnToMenu" : {
CaptureZoneUI(player, 0);
break;
}
case "ChangePageCapture" : {
CaptureZoneUI(player, int.Parse(args.Args[1]));
break;
}
}
}
#endregion
#region [Component]
private CaptureManager FindCaptureZoneDistance(Vector3 pos) => _CaptureManager.Where(p => Vector3.Distance(p.transform.position, pos) < config._ZoneSettings.RadiusZone).FirstOrDefault();
private CaptureManager FindCaptureZoneCupboard(ulong netID) => _CaptureManager.FirstOrDefault(p => p._data.Cupboard == netID);
private CaptureManager FindCaptureZoneDropBox(ulong netID) => _CaptureManager.FirstOrDefault(p => p._data.ResourseChest == netID);
private CaptureManager FindCaptureOtherClan(string nameClan) => _CaptureManager.FirstOrDefault(p => p.CaptureClan == nameClan);
private static List<CaptureManager> _CaptureManager = new List<CaptureManager>();
public class CaptureManager : MonoBehaviour {
private List<BasePlayer> _Players;
private MapMarkerGenericRadius mapMarker;
private VendingMachineMapMarker vendingMarker;
private SphereCollider sphereCollider;
public CaptureData _data;
public BaseEntity _entity;
public bool _IsCapture = false;
public int CaptureTime = 0;
public string CaptureClan = string.Empty;
private void Awake() {
sphereCollider = gameObject.AddComponent<SphereCollider>();
sphereCollider.gameObject.layer = (int)Rust.Layer.Reserved1;
sphereCollider.isTrigger = true;
sphereCollider.radius = config._ZoneSettings.RadiusZone;
InvokeRepeating("Timer", 1f, 1f);
}
private void OnTriggerEnter(Collider other) {
var target = other.GetComponentInParent<BasePlayer>();
if (target == null || _Players.Contains(target)) return;
var Text = _data.nameClan == string.Empty ? "Данная территория не захвачена, успей захватить" : $"Вы зашли в территорию {_data.captureName}.\nПод владением клана: {_data.nameClan}";
target.ChatMessage($"{Text}");
_Players.Remove(target);
}
private void OnTriggerExit(Collider other) {
var target = other.GetComponentInParent<BasePlayer>();
if (target == null && !_Players.Contains(target)) return;
var Text = _data.nameClan == string.Empty ? "Вы вышли из территории которая не захвачена, успей захватить" : $"Вы вышли из территории {_data.captureName}.\nПод владением клана: {_data.nameClan}";
target.ChatMessage($"{Text}");
_Players.Remove(target);
}
public void Init(CaptureData data, BaseEntity entity) {
_data = data;
_entity = entity;
_Players = new List<BasePlayer>();
if (Facepunch.Math.Epoch.Current - _data.lastCapture < config._ZoneSettings.CaptureCooldown) AddMarker(config._MarkerInGameSettings.markerColorCantCapture);
else AddMarker(config._MarkerInGameSettings.markerColorCanCapture);
}
private void Timer() {
if (_IsCapture) {
bool HavePlayerCapture = false;
var _clanList = plugin.GetClanMembers(CaptureClan);
if (_clanList == null || _clanList == new List<string>()) {
CaptureClan = string.Empty;
_IsCapture = false;
CaptureTime = 0;
return;
}
foreach (var key in _clanList) {
var id = Convert.ToUInt64(key);
var memberClan = BasePlayer.FindByID(id);
if (memberClan == null || !memberClan.IsConnected) continue;
if (Vector3.Distance(memberClan.transform.position, transform.position) < config._ZoneSettings.RadiusCapture) {
HavePlayerCapture = true;
break;
}
}
if (!HavePlayerCapture) {
CaptureClan = string.Empty;
_IsCapture = false;
CaptureTime = 0;
foreach (var key in _clanList) {
var id = Convert.ToUInt64(key);
var memberClan = BasePlayer.FindByID(id);
if (memberClan == null || !memberClan.IsConnected) continue;
if (config.useMenuAlerts) {
plugin.MenuAlerts?.Call("RemoveAlertMenu", memberClan, $"{plugin.Name}");
}
else {
CuiHelper.DestroyUi(memberClan, "CaptureUI");
if (plugin.openUI.Contains(memberClan.userID)) plugin.openUI.Remove(memberClan.userID);
}
memberClan.ChatMessage("Ваш клан ушел слишком далеко.Ваш захват сбит, начните захват заново!");
}
AddMarker(config._MarkerInGameSettings.markerColorCanCapture);
}
CaptureTime++;
if (CaptureTime >= config._ZoneSettings.CaputureSecond) {
FinishCapture();
}
else {
if (!config.useMenuAlerts) {
foreach (var key in _clanList) {
var id = Convert.ToUInt64(key);
var memberClan = BasePlayer.FindByID(id);
if (memberClan == null || !memberClan.IsConnected) continue;
if (plugin.openUI.Contains(memberClan.userID)) plugin.CaptureZoneInfoUpdate(memberClan, this);
}
}
}
}
if (Facepunch.Math.Epoch.Current - _data.lastCapture == config._ZoneSettings.CaptureCooldown && !_IsCapture) {
plugin.Server.Broadcast($"<color=#ffde5a>ВНИМАНИЕ!</color>\n<size=12>Территорию <color=#ffde5a>{_data.captureName}</color> можно снова захватить!");
mapMarker.color1 = ConvertToColor(config._MarkerInGameSettings.markerColorCanCapture);
}
mapMarker.SendUpdate();
}
public void StartCapture(String tag, BasePlaye
// ... [Code preview truncated due to length. Full source in attached file] ...