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
}
}