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

FREE RaidZone : 1.0.0 1.0.0

Нет прав для скачивания
C#:
using Oxide.Core.Plugins;
using UnityEngine;
using System.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using Oxide.Core;
using System.Globalization;
using Rust;
using System.Collections;
namespace Oxide.Plugins {
    [Info("RaidZone", "King", "1.0.0")]
    public class RaidZone : RustPlugin {
#region [Vars]
        [PluginReference]
        private Plugin ImageLibrary = null, Clans = null, MenuAlerts = null;
        private String[] _gatherHooks = {
            "OnDispenserGather", "OnDispenserBonus",
        }
        ;
        private String[] _spawnPrefab = {
            "assets/bundled/prefabs/autospawn/resource/ores/sulfur-ore.prefab", "assets/bundled/prefabs/autospawn/resource/ores/metal-ore.prefab", "assets/bundled/prefabs/autospawn/resource/ores/stone-ore.prefab", "assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-1.prefab", "assets/bundled/prefabs/autospawn/resource/loot/loot-barrel-2.prefab"
        }
        ;
        private static RaidZone plugin;
        private UInt64 ownerID = 78787878;
        private UInt64 _RaidCupboard;
        private RaidZoneComp RaidZoneComponent = null;
        private Vector3 TeleportPosition = new Vector3();
#endregion
#region [Clans]
        private String GetClanTag(ulong id) => Clans?.Call<String>("GetClanTag", id);
        private List<String> GetClanMembers(String tag) {
            if (Clans) {
                var clan = Clans?.Call("GetMembersClan", tag) as List<String>;
                return clan.ToList();
            }
            return new List<String>();
        }
#endregion
#region [Oxide-Api]
        private void OnPluginLoaded(Plugin plugin) {
            NextTick(() => {
                foreach (string hook in _gatherHooks) {
                    Unsubscribe(hook);
                    Subscribe(hook);
                }
            }
            );
        }
        private void OnServerInitialized() {
            plugin = this;
            ImageLibrary?.Call("AddImage", "https://cdn.discordapp.com/attachments/1145789797596659762/1145812553700749423/New_Project_8.png", $"{Name}.Image");
            GameObject obj = new GameObject();
            RaidZoneComponent = obj.AddComponent<RaidZoneComp>();
            var Outpost = TerrainMeta.Path.Monuments.FirstOrDefault(p => p.name.ToLower().Contains("compound"));
            if (Outpost) TeleportPosition = Outpost.transform.position;
        }
        private void Unload() {
            UnityEngine.Object.Destroy(RaidZoneComponent);
        }
#endregion
#region [Rust-Api]
        private object OnEntityGroundMissing(BaseEntity entity) {
            if (entity.OwnerID == ownerID) return false;
            return null;
        }
        private object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if (entity == null || info == null || RaidZoneComponent == null || !RaidZoneComponent.IsRaidZone) return null;
            if(entity.OwnerID == ownerID) return true;
            if (!RaidZoneComponent.IsFinish) return null;
            var player = entity as BasePlayer;
            if (player == null) return null;
            BasePlayer initiatorPlayer = info.InitiatorPlayer;
            if (initiatorPlayer == null || player == initiatorPlayer) return null;
            if (RaidZoneComponent._Players.Contains(player) || RaidZoneComponent._Players.Contains(initiatorPlayer)) return false;
            return null;
        }
        private void OnPlayerDeath(BasePlayer player, HitInfo info) {
            if (player == null || info == null || !player.userID.IsSteamId() || RaidZoneComponent == null || !RaidZoneComponent.IsRaidZone) return;
            BasePlayer attacker = info.InitiatorPlayer;
            if (attacker == null || !attacker.userID.IsSteamId()) return;
            if (RaidZoneComponent._Players.Contains(player)) RaidZoneComponent._Players.Remove(player);
            String clanName = GetClanTag(attacker.userID);
            if (string.IsNullOrEmpty(clanName)) return;
            /*String clanDeath = GetClanTag(player.userID);
            if (string.IsNullOrEmpty(clanDeath) || clanName == clanDeath) return;*/
            Clans?.CallHook("GiveClanPoints", clanName, config._ZoneSettings.KillPointBonus);
        }
        private object CanBuild(Planner planner, Construction prefab, Construction.Target target) {
            if (RaidZoneComponent == null || !RaidZoneComponent.IsRaidZone) return null;
            BasePlayer player = planner.GetOwnerPlayer();
            if (player == null) return null;
            if (RaidZoneComponent._Players.Contains(player)) {
                if (prefab.fullName.Contains("wall.external.high.wood") || prefab.fullName.Contains("wall.external.high.ice") || prefab.fullName.Contains("wall.external.high.stone")) return null;
                return false;
            }
            return null;
        }
        object OnCupboardAuthorize(BuildingPrivlidge privilege, BasePlayer player) {
            if (privilege == null || player == null || _RaidCupboard != privilege.net.ID.Value) return null;
            String clan = GetClanTag(player.userID);
            if (string.IsNullOrEmpty(clan)) {
                player.ChatMessage("У вас нет клана.");
                return false;
            }
            if (RaidZoneComponent.IsFinish) {
                player.ChatMessage("BeeZone уже была захвачена.");
                return false;
            }
            if (RaidZoneComponent.CaptureClan == clan) {
                player.ChatMessage("Ваш клан уже захватывает BeeZone!");
                return false;
            }
            RaidZoneComponent.StartCapture(clan, player);
            return false;
        }
#endregion
#region [Building]
        public class PrefabRaidZone {
            public Vector3 Position;
            public String ShortPrefabName;
            public Vector3 Rotation;
            public PrefabRaidZone(String shortname, Vector3 pos, Vector3 rot) {
                ShortPrefabName = shortname;
                Position = pos;
                Rotation = rot;
            }
        }
        public List<PrefabRaidZone> _PrefabRaidZone = new List<PrefabRaidZone> {
            // Foundation
            new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(0, 0, -3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(3, 0, -3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/foundation/foundation.prefab", new Vector3(-3, 0, -3), new Vector3(0, 0, 0)),  // CupboardPositionRoom
            new PrefabRaidZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(0, 0, 1.5f), new Vector3(0, 270, 0)), new PrefabRaidZone("assets/prefabs/building core/wall/wall.prefab", new Vector3(0, 0, -1.5f), new Vector3(0, 270, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/door.double.hinged/door.double.hinged.toptier.prefab", new Vector3(-1.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/deployable/tool cupboard/cupboard.tool.deployed.prefab", new Vector3(1.1f, 0.1f, 0), new Vector3(0, 270, 0)),  // Room
            new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(4.5f, 0, -3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(0, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.garagedoor/wall.frame.garagedoor.prefab", new Vector3(0, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-3, 0, -4.5f), new Vector3(0, 90, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(0, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.garagedoor/wall.frame.garagedoor.prefab", new Vector3(0, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabRaidZone("assets/prefabs/building core/wall.frame/wall.frame.prefab", new Vector3(-3, 0, 4.5f), new Vector3(0, 270, 0)), new PrefabRaidZone("assets/prefabs/building/wall.frame.cell/wall.frame.cell.prefab", new Vector3(-3, 0, 4.5f), new Vector3(0, 270, 0)),  //Floor
            new PrefabRaidZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(0, 3, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(3, 3, -3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, 3), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building core/floor/floor.prefab", new Vector3(-3, 3, -3), new Vector3(0, 0, 0)),  //Rest
            new PrefabRaidZone("assets/prefabs/deployable/signs/sign.pole.banner.large.prefab", new Vector3(0, 3, 0), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(-0.7f, 1.5f, 1.6f), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(0.7f, 1.5f, 1.6f), new Vector3(0, 0, 0)), new PrefabRaidZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(-0.7f, 1.5f, -1.6f), new Vector3(0, 180, 0)), new PrefabRaidZone("assets/prefabs/building/ladder.wall.wood/ladder.wooden.wall.prefab", new Vector3(0.7f, 1.5f, -1.6f), new Vector3(0, 180, 0)),
        }
        ;
#endregion
#region [Component]
        private class RaidZoneComp : MonoBehaviour {
#region [Vars]
            public List<BasePlayer> _Players = new List<BasePlayer>();
            public List<BaseEntity> _Entity = new List<BaseEntity>();
            private MapMarkerGenericRadius mapMarker;
            private VendingMachineMapMarker vendingMarker;
            private SphereCollider sphereCollider;
            private BaseEntity sphereEntity;
            public Boolean IsRaidZone;
            public Boolean IsCapture;
            public Boolean IsFinish;
            public Int32 lastRaidZone;
            public Int32 startRaidZone;
            public Int32 finishRaidZone;
            public Int32 CaptureTime;
            public String CaptureClan;
#endregion
#region [Despawn]
            public void DestroyComp() => OnDestroy();
            private void OnDestroy() {
                if (IsRaidZone) {
                    DespawnRaidZoneEntity();
                    DespawnMarker();
                    DespawnSphere();
                    DespawnStone();
                }
                Destroy(this);
            }
#endregion
#region [Init]
            private void Awake() {
                gameObject.layer = (Int32)Layer.Reserved1;
                sphereCollider = gameObject.AddComponent<SphereCollider>();
                sphereCollider.isTrigger = true;
                sphereCollider.radius = config._ZoneSettings.RadiusZone;
                IsRaidZone = false;
                lastRaidZone = Facepunch.Math.Epoch.Current;
                InvokeRepeating("Timer", 1f, 1f);
            }
#endregion
#region [Trigger]
            private void OnTriggerEnter(Collider other) {
                if (!IsRaidZone) return;
                BasePlayer target = other.GetComponentInParent<BasePlayer>();
                if (target == null || _Players.Contains(target)) return;
                if (IsFinish) {
                    String Clan = plugin.GetClanTag(target.userID);
                    if (string.IsNullOrEmpty(Clan) || Clan != CaptureClan || !target.IsAdmin) {
                        target.EnsureDismounted();
                        target.Teleport(plugin.TeleportPosition);
                        return;
                    }
                }
                _Players.Add(target);
            }
            private void OnTriggerExit(Collider other) {
                if (!IsRaidZone) return;
                BasePlayer target = other.GetComponentInParent<BasePlayer>();
                if (target == null || !_Players.Contains(target)) return;
                _Players.Remove(target);
            }
#endregion
#region [Update]
            private void Timer() {
                if (Facepunch.Math.Epoch.Current - lastRaidZone == config._ZoneSettings.DelayEvent) {
                    SpawnRaidZone();
                    return;
                }
                if (IsRaidZone) {
                    if (Facepunch.Math.Epoch.Current - startRaidZone == config._ZoneSettings.DeleteEvent && !IsCapture && !IsFinish) {
                        DespawnRaidZone();
                        return;
                    }
                    if (IsCapture) {
                        Boolean 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) {
                            UInt64 id = Convert.ToUInt64(key);
                            BasePlayer 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) {
                                UInt64 id = Convert.ToUInt64(key);
                                BasePlayer memberClan = BasePlayer.FindByID(id);
                                if (memberClan == null || !memberClan.IsConnected) continue;
                                plugin.MenuAlerts?.Call("RemoveAlertMenu", memberClan, $"{plugin.Name}");
                                memberClan.ChatMessage("Ваш клан ушел слишком далеко. Ваш захват сбит, начните захват заново!");
                            }
                            AddMarker(config._MarkerInGameSettings.markerColorCanCapture);
                        }
                        CaptureTime++;
                        if (CaptureTime >= config._ZoneSettings.CaputureSecond) {
                            FinishCapture();
                        }
                    }
                    if (IsFinish) {
                        SpawnStone();
                        if (Facepunch.Math.Epoch.Current - finishRaidZone == config._ZoneSettings.RaidZoneEventEnd) {
                            DespawnRaidZone();
                        }
                    }
                    mapMarker.SendUpdate();
                }
            }
            public void StartCapture(String tag, BasePlayer player) {
                if (tag == CaptureClan) {
                    player.ChatMessage("Ваш клан уже захватывает эту территорию!");
                    return;
                }
                if (IsCapture) {
                    var _clanList = plugin.GetClanMembers(CaptureClan);
                    if (_clanList == null || _clanList == new List<string>()) return;
                    foreach (var key in _clanList) {
                        UInt64 id = Convert.ToUInt64(key);
                        BasePlayer memberClan = BasePlayer.FindByID(id);
                        if (memberClan == null || !memberClan.IsConnected) continue;
                        memberClan.ChatMessage($"Ваш захват перехватил клан: {tag}");
                        plugin.MenuAlerts?.Call("RemoveAlertMenu", memberClan, $"{plugin.Name}");
                    }
                }
                else {
                    plugin.Server.Broadcast($"<color=#ffde5a>ВНИМАНИЕ!</color>\n<size=12>Начался захват <color=#ffde5a>BeeZone</color>.\nЗахватывается кланом <color=#ffde5a>{tag}</color>");
                    mapMarker.color1 = ConvertToColor(config._MarkerInGameSettings.markerColorCapture);
                    vendingMarker.markerShopName = $"BeeZone\nИдет захват кланом: {tag}";
                    vendingMarker.SendNetworkUpdate();
                }
                var clanList = plugin.GetClanMembers(tag);
                if (clanList == null || clanList == new List<string>()) return;
                foreach (var key in clanList) {
                    var id = Convert.ToUInt64(key);
                    var memberClan = BasePlayer.FindByID(id);
                    if (memberClan == null || !memberClan.IsConnected) continue;
                    plugin.MenuAlerts?.Call("SendAlertMenu", memberClan, Facepunch.Math.Epoch.Current - CaptureTime, config._ZoneSettings.CaputureSecond, $"<color=#ffde5a>BEE ZONE</color>", $"По окочанию времени вы захватите <color=#ffde5a>BeeZone</color>", true, $"{plugin.Name}.Image", $"{plugin.Name}");
                }
                CaptureClan = tag;
                CaptureTime = 0;
                IsCapture = true;
            }
            private void FinishCapture() {
                CaptureTime = 0;
                IsCapture = false;
                IsFinish = true;
                finishRaidZone = Facepunch.Math.Epoch.Current;
                var _clanList = plugin.GetClanMembers(CaptureClan);
                if (_clanList == null || _clanList == new List<string>()) {
                    CaptureClan = string.Empty;
                    mapMarker.color1 = ConvertToColor(config._MarkerInGameSettings.markerColorCanCapture);
                    return;
                }
                foreach (var key in _clanList) {
                    var id = Convert.ToUInt64(key);
                    var memberClan = BasePlayer.FindByID(id);
                    if (memberClan == null || !memberClan.IsConnected) continue;
                    memberClan.ChatMessage($"Ваш клан успешно захватил <color=#ffde5a>BeeZone</color>");
                    plugin.MenuAlerts?.Call("SendAlertMenu", memberClan, Facepunch.Math.Epoch.Current, config._ZoneSettings.RaidZoneEventEnd, $"<color=#ffde5a>BEE ZONE</color>", $"По окочанию времени для фарма, фарми фарми раб мой", true, $"{plugin.Name}.Image", $"{plugin.Name}");
                }
                foreach (BasePlayer player in _Players) {
                    if (player != null && player.IsConnected) {
                        String Clan = plugin.GetClanTag(player.userID);
                        if (string.IsNullOrEmpty(Clan) || Clan != CaptureClan) player.Teleport(plugin.TeleportPosition);
                    }
                }
                SpawnStone();
                vendingMarker.markerShopName = $"BeeZone Захвачен";
                vendingMarker.SendNetworkUpdate();
                mapMarker.color1 = ConvertToColor(config._MarkerInGameSettings.markerColorCantCapture);
                plugin.Server.Broadcast($"<color=#ffde5a>ВНИМАНИЕ!</color>\n<size=12>Клан <color=#ffde5a>{CaptureClan}</color> захватил <color=#ffde5a>BeeZone</color>.");
            }
#endregion
#region [Functional]
            public void SpawnRaidZone() {
                if (IsRaidZone) return;
                _Entity.Clear();
                _Players.Clear();
                transform.position = config._ZoneSettings.SpawnPosition;
                DespawnRaidZoneEntity();
                CreateBuilding();
                SpawnSphere();
                AddMarker(config._MarkerInGameSettings.markerColorCanCapture);
                startRaidZone = Facepunch.Math.Epoch.Current;
                IsRaidZone = true;
                plugin.Server.Broadcast($"<color=#ffde5a>ВНИМАНИЕ!</color>\n<size=12>На карте появилась <color=#ffde5a>BEE ZONE</color>.\nМестоположение было отмечено на вашей карте</size>");
            }
            private void DespawnRaidZone() {
                if (!IsRaidZone) return;
                IsRaidZone = false;
                IsCapture = false;
                IsFinish = false;
                lastRaidZone = Facepunch.Math.Epoch.Current;
                CaptureClan = string.Empty;
                DespawnMarker();
                DespawnRaidZoneEntity();
                DespawnStone();
                DespawnSphere();
                plugin.Server.Broadcast($"<color=#ffde5a>ВНИМАНИЕ!</color>\n<size=12>Закончился ивент <color=#ffde5a>BEE ZONE</color>.\nСледующий ивент будет через {TimeExtensions.FormatShortTime(TimeSpan.FromSeconds(config._ZoneSettings.DelayEvent))}");
            }
            private void AddMarker(string color) {
                DespawnMarker();
                mapMarker = GameManager.server.CreateEntity("assets/prefabs/tools/map/genericradiusmarker.prefab", transform.position).GetComponent<MapMarkerGenericRadius>();
                vendingMarker = GameManager.server.CreateEntity("assets/prefabs/deployable/vendingmachine/vending_mapmarker.prefab", transform.position).GetComponent<VendingMachineMapMarker>();
                mapMarker.radius = config._MarkerInGameSettings.markerRadius;
                mapMarker.color1 = ConvertToColor(color);
                mapMarker.alpha = config._MarkerInGameSettings.markerAlpha;
                mapMarker.enabled = true;
                mapMarker.OwnerID = 0;
                mapMarker.Spawn();
                mapMarker.SendUpdate();
                vendingMarker.markerShopName = $"RAID ZONE";
                vendingMarker.OwnerID = 0;
                vendingMarker.Spawn();
                vendingMarker.enabled = false;
            }
            private void CreateBuilding() {
                foreach(var key in plugin._PrefabRaidZone) {
                    BaseEntity prefab = GameManager.server.CreateEntity(key.ShortPrefabName, transform.position + key.Position, Quaternion.Euler(key.Rotation)) as BaseEntity;
                    prefab.OwnerID = plugin.ownerID;
                    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;
                        plugin._RaidCupboard = build.net.ID.Value;
                    }
                    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;
                    }
                }
            }
            private void SpawnStone() {
                Int32 SpawnStone = config._ZoneSettings.StoneZone - _Entity.Where(i => i != null && !i.IsDestroyed != null).ToList().Count;
                if (SpawnStone > 0) {
                    for (Int32 i = 0; i < SpawnStone; i++) {
                        var position = RandomCircle(transform.position);
                        position.y = GetGroundPosition(position);
                        BaseEntity Stone = GameManager.server.CreateEntity(plugin._spawnPrefab.GetRandom(), position);
                        Stone.Spawn();
                        _Entity.Add(Stone);
                    }
                }
            }
            private void DespawnStone() {
                foreach (BaseEntity entity in _Entity) {
                    if (entity != null && !entity.IsDestroyed) entity.Kill();
                }
            }
            private void SpawnSphere() {
                sphereEntity = GameManager.server.CreateEntity("assets/prefabs/visualization/sphere.prefab", transform.position, new Quaternion(), true);
                SphereEntity ball = sphereEntity.GetComponent<SphereEntity>();
                ball.currentRadius = 1f;
                ball.lerpRadius = 2.0f * config._ZoneSettings.RadiusZone + 3f;
                ball.lerpSpeed = 150f;
                sphereEntity.Spawn();
            }
            private void DespawnSphere() {
                if (sphereEntity != null && !sphereEntity.IsDestroyed) sphereEntity.Kill();
            }
            private void DespawnMarker() {
                if (mapMarker != null && !mapMarker.IsDestroyed) mapMarker.Kill();
                if (vendingMarker != null && !vendingMarker.IsDestroyed) vendingMarker.Kill();
            }
            private void DespawnRaidZoneEntity() {
                List<BaseEntity> list_entity = new List<BaseEntity>();
                Vis.Entities(transform.position, config._ZoneSettings.RadiusZone, 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();
            }
#endregion
#region [Position]
            static float GetGroundPosition(Vector3 pos) {
                float y = TerrainMeta.HeightMap.GetHeight(pos);
                RaycastHit hit;
                if (Physics.Raycast(new Vector3(pos.x, pos.y + 200f, pos.z), Vector3.down, out hit, Mathf.Infinity, LayerMask.GetMask(new[] {
                    "Terrain", "World", "Default", "Construction", "Deployed"
                }
                )) && !hit.collider.name.Contains("rock_cliff")) return Mathf.Max(hit.point.y, y);
                return y;
            }
            private bool ValidPosition(ref Vector3 randomPos) {
                RaycastHit hitInfo;
                if (Physics.Raycast(randomPos, Vector3.down, out hitInfo, 500f, Layers.Solid)) randomPos.y = hitInfo.point.y;
                else return false;
                if (WaterLevel.Test(randomPos, false, false)) return false;
                var colliders = new List<Collider>();
                Vis.Colliders(randomPos, config._ZoneSettings.RadiusZone, colliders);
                if (colliders.Where(col => col.name.ToLower().Contains("prevent") && col.name.ToLower().Contains("building")).Count() > 0) return false;
                var cupboards = new List<BuildingPrivlidge>();
                Vis.Entities(randomPos, config._ZoneSettings.RadiusZone, cupboards);
                if (cupboards.Count > 0) return false;
                return true;
            }
            private bool ValidPosition2(ref Vector3 randomPos) {
                RaycastHit hitInfo;
                if (Physics.Raycast(randomPos, Vector3.down, out hitInfo, 500f, Layers.Solid)) randomPos.y = hitInfo.point.y;
                else return false;
                if (WaterLevel.Test(randomPos, false, false)) return false;
                var colliders = new List<Collider>();
                Vis.Colliders(randomPos, 3f, colliders);
                if (colliders.Where(col => col.name.ToLower().Contains("prevent") && col.name.ToLower().Contains("building")).Count() > 0) return false;
                var entities = new List<BaseEntity>();
                Vis.Entities(randomPos, 4f, entities);
                if (entities.Where(ent => ent is TreeEntity || ent is OreResourceEntity).Count() > 0) return false;
                return true;
            }
            private Vector3 RandomCircle(Vector3 center) {
                float ang = UnityEngine.Random.value * 720;
                Vector3 pos;
                pos.x = center.x + UnityEngine.Random.Range(5, config._ZoneSettings.RadiusZone) * Mathf.Sin(ang * Mathf.Deg2Rad);
                pos.z = center.z + UnityEngine.Random.Range(5, config._ZoneSettings.RadiusZone) * Mathf.Cos(ang * Mathf.Deg2Rad);
                pos.y = center.y;
                return pos;
            }
#endregion
#region [FormatTime]
            private static class TimeExtensions {
                public static string FormatShortTime(TimeSpan time) {
                    string result = string.Empty;
                    if (time.Days != 0) result += $"{time.Days}д ";
                    if (time.Hours != 0) result += $"{time.Hours}ч ";
                    if (time.Minutes != 0) result += $"{time.Minutes}м ";
                    if (time.Seconds != 0) result += $"{time.Seconds}с ";
                    return result;
                }
                private static string Format(Int32 units, string form1, string form2, string form3) {
                    Int32 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
#region [Color]
            private Color ConvertToColor(string color) {
                if (color.StartsWith("#")) color = color.Substring(1);
                int red = int.Parse(color.Substring(0, 2), NumberStyles.AllowHexSpecifier);
                int green = int.Parse(color.Substring(2, 2), NumberStyles.AllowHexSpecifier);
                int blue = int.Parse(color.Substring(4, 2), NumberStyles.AllowHexSpecifier);
                return new Color((float)red / 255, (float)green / 255, (float)blue / 255);
            }
#endregion
        }
#endregion
#region [ChatCommand]
        [ChatCommand("rdm")]
        private void cmdAdminStart(BasePlayer player, string command, string[] args) {
            if (!player.IsAdmin) return;
            RaidZoneComponent.SpawnRaidZone();
            player.ChatMessage("Запустилась шарманнка");
        }
        [ChatCommand("rdpos")]
        private void cmdAdminPosition(BasePlayer player, string command, string[] args) {
            if (!player.IsAdmin) return;
            config._ZoneSettings.SpawnPosition = player.GetNetworkPosition();
            SaveConfig();
            player.ChatMessage("Вы успешно установили новое положения для BeeZone!");
        }
#endregion
#region [Config]
        private static PluginConfig config;
        protected override void LoadDefaultConfig() {
            config = PluginConfig.DefaultConfig();
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            config = Config.ReadObject<PluginConfig>();
            if (config.PluginVersion < Version) UpdateConfigValues();
            Config.WriteObject(config, true);
        }
        private void UpdateConfigValues() {
            PluginConfig baseConfig = PluginConfig.DefaultConfig();
            if (config.PluginVersion < Version) {
                config.PluginVersion = Version;
                if (Version == new VersionNumber(1, 0, 0)) {
                    //
                }
                PrintWarning("Config checked completed!");
            }
            config.PluginVersion = Version;
        }
        protected override void SaveConfig() {
            Config.WriteObject(config);
        }
        public class MarkerInGameSettings {
            [JsonProperty("Радиус маркера")]
            public Single markerRadius;
            [JsonProperty("Прозрачность маркера")]
            public Single markerAlpha;
            [JsonProperty("Цвет маркера когда можно захватить")]
            public String markerColorCanCapture;
            [JsonProperty("Цвет маркера когда идет захват")]
            public String markerColorCapture;
            [JsonProperty("Цвет маркера когда нельзя захватить")]
            public String markerColorCantCapture;
        }
        public class ZoneSettings {
            [JsonProperty("Каждое N количество времени в секундах будет появлятся Raid Zone")]
            public Int32 DelayEvent;
            [JsonProperty("Если никто не начал захват RaidZone то через сколько заканчивать ивент")]
            public Int32 DeleteEvent;
            [JsonProperty("После скольки секунд после захвата RaidZone будет заканчиваться")]
            public Int32 RaidZoneEventEnd;
            [JsonProperty("Количество камней в зоне")]
            public Int32 StoneZone;
            [JsonProperty("Радиус зоны")]
            public Int32 RadiusZone;
            [JsonProperty("Радиус захвата шкафа ( Дистанция захвата, если игрок дальше захват прерывается )")]
            public Int32 RadiusCapture;
            [JsonProperty("Сколько будет длится захват RaidZone")]
            public Int32 CaputureSecond;
            [JsonProperty("Сколько доп очков давать за убийство")]
            public Int32 KillPointBonus;
            [JsonProperty("Позиция спавна RaidZone")]
            public Vector3 SpawnPosition;
        }
        private class PluginConfig {
            [JsonProperty("Настройки RaidZone")]
            public ZoneSettings _ZoneSettings = new ZoneSettings();
            [JsonProperty("Настройки отметки на карте ( G )")]
            public MarkerInGameSettings _MarkerInGameSettings = new MarkerInGameSettings();
            [JsonProperty("Config version")]
            public VersionNumber PluginVersion = new VersionNumber();
            public static PluginConfig DefaultConfig() {
                return new PluginConfig() {
                    _ZoneSettings = new ZoneSettings() {
                        DelayEvent = 3600, DeleteEvent = 40, RaidZoneEventEnd = 20, StoneZone = 60, RadiusZone = 100, RadiusCapture = 10, CaputureSecond = 5, KillPointBonus = 10, SpawnPosition = new Vector3(),
                    }
                    , _MarkerInGameSettings = new MarkerInGameSettings() {
                        markerRadius = 0.5f, markerAlpha = 0.4f, markerColorCanCapture = "#10c916", markerColorCantCapture = "#ffb700", markerColorCapture = "#ed0707"
                    }
                    , PluginVersion = new VersionNumber()
                }
                ;
            }
        }
#endregion
    }
}

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