C#:
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Core.Libraries.Covalence;
using System.Collections.Generic;
namespace Oxide.Plugins {
[Info("CargoPlaneCrash", "Fruster", "1.1.9")]
[Description("CargoPlaneCrash")]
class CargoPlaneCrash : CovalencePlugin {
private List<Vector3> spawnItems = new List<Vector3>();
private float remainToEvent;
private float remain;
private string prefabstr = "assets/prefabs/npc/cargo plane/cargo_plane.prefab";
private BaseEntity entity;
private Vector3 target = new Vector3(0, 0, 0);
private float mapSize;
private float speed;
private Vector3 direction;
private float crashRadius = 10f;
private bool expMarker;
private bool signalSmoke;
private int cratesAmount;
private int airdropsAmount;
private int fireballsAmount;
private int passengersAmount;
private RaycastHit check;
private LayerMask layerS = LayerMask.GetMask("Construction", "Terrain", "Water", "World");
private string message;
private string kitName;
private string passengerName;
private Vector3 crashZoneCenter;
private Vector3 crashPosition;
[PluginReference]
Plugin Kits;
private float altitude;
private int lifeTimeExpMarker;
private int lifeTimeCrates;
private int lifeTimeAirdrops;
private bool smokeFlag = false;
private int lifeTimeSignalSmoke;
private const string botPrefab = "assets/rust.ai/agents/npcplayer/npcplayertest.prefab";
private int typeNpcs;
private string npcPrefab;
private int lifeTimeNpcs;
private int npcsAmount;
private float npcDamageMultiplier;
private int npcHealth;
private const string npcName = "cpcguardnpc";
private bool randomEventTime;
private int minimumRemainToEvent;
private int maximumRemainToEvent;
private int minOnline;
private bool buildingBlock;
private int buildingBlockTime;
private int buildingBlockTimer;
private string npcKit;
private float npcAttackRange;
private ConfigData Configuration;
private List<Vector3> wayPoints = new List<Vector3>();
private List<BaseEntity> botList = new List<BaseEntity>();
private List<BaseEntity> entityList = new List<BaseEntity>();
private int chaseRadius = 50;
private int coolDownTime = 7;
private int homeRadius = 20;
private int attackRadius = 75;
private class NpcBrain : FacepunchBehaviour {
public Vector3 homePosition;
public Vector3 targetPosition;
public BaseEntity target;
public int stateTimer;
public int moveChance;
}
class ConfigData {
[JsonProperty("Time to event start(in seconds)")]
public float remainToEvent = 3600f;
[JsonProperty("Random time to event start")]
public bool randomEventTime = false;
[JsonProperty("Minimum time to event start(in seconds)")]
public int minimumRemainToEvent = 600;
[JsonProperty("Maximum time to event start(in seconds)")]
public int maximumRemainToEvent = 10800;
[JsonProperty("CargoPlane speed(recommended 4 to 6)")]
public float speed = 5f;
[JsonProperty("Minimum amount of online players to trigger the event")]
public int minOnline = 2;
[JsonProperty("Crates amount(spawn after crash)")]
public int cratesAmount = 1;
[JsonProperty("Crates lifetime(in seconds).The crate will not be destroyed if it has been activated")]
public int lifeTimeCrates = 3600;
[JsonProperty("Crates timer(in seconds)")]
public int timerCrates = 900;
[JsonProperty("Airdrops amount(spawn after crash)")]
public int airdropsAmount = 1;
[JsonProperty("Airdrops lifetime(in seconds)")]
public int lifeTimeAirdrops = 3600;
[JsonProperty("Fireballs amount(spawn after crash)")]
public int fireballsAmount = 5;
[JsonProperty("Passengers amount(spawn after crash)")]
public int passengersAmount = 2;
[JsonProperty("Explosion marker on the map(spawn after crash)")]
public bool expMarker = true;
[JsonProperty("Explosion marker lifetime(in seconds)")]
public int lifeTimeExpMarker = 300;
[JsonProperty("Enable signal smoke(spawn after crash)")]
public bool signalSmoke = true;
[JsonProperty("Signal smoke lifetime(in seconds, max 214)")]
public int lifeTimeSignalSmoke = 214;
[JsonProperty("Map size(crash zone size), you can see the zone, use the chat command /showcrashzone")]
public float mapSize = 4500;
[JsonProperty("Starting altitude, defaults to map size, can be increased if cargo plane hits high ground(no more than 10000 recommended)")]
public float altitude = 4500;
[JsonProperty("Crash zone center.Use chat command /setcrashzonecenter to set to player position.You can check crash zone center, use the chat command /showcrashzone")]
public Vector3 crashZoneCenter = new Vector3(0, 0, 0);
[JsonProperty("Event message(if empty, no message will be displayed)")]
public string message = "CargoPlane event started";
[JsonProperty("Kit name(you can use kits for passengers if you have Kits plugin)")]
public string kitName = "";
[JsonProperty("Passenger name")]
public string passengerName = "Mister bot";
[JsonProperty("NPCs amount(spawn after crash)")]
public int npcsAmount = 2;
[JsonProperty("NPCs lifetime(in seconds)")]
public int lifeTimeNpcs = 3600;
[JsonProperty("NPCs type(NPCs prefab, experimental setting, it is not known how the NPCs will behave) 0 - tunneldweller; 1 - underwaterdweller; 2 - excavator; 3 - full_any; 4 - lr300; 5 - mp5; 6 - pistol; 7 - shotgun; 8 - heavy; 9 - junkpile_pistol; 10 - oilrig; 11 - patrol; 12 - peacekeeper; 13 - roam; 14 - roamtethered; 15 - bandit_guard; 16 - cargo; 17 - cargo_turret_any; 18 - cargo_turret_lr300; 19 - ch47_gunner")]
public int typeNpcs = 0;
[JsonProperty("NPCs health(0 - default)")]
public int npcHealth = 0;
[JsonProperty("NPCs damage multiplier")]
public float npcDamageMultiplier = 1f;
[JsonProperty("NPCs attack range")]
public float npcAttackRange = 75f;
[JsonProperty("Minimum distance to NPC damage")]
public float npcMinDistToDmg = 75f;
[JsonProperty("Kit for NPCs.The NPC will use the weapon that is in the first slot of the belt(requires Kits plugin)")]
public string npcKit = "";
[JsonProperty("Default displayName for NPC(for SimpleKillFeed/DeathNotes plugin)")]
public string displayNameNPC = "Crashsite NPC";
[JsonProperty("List of displayNames for each NPC(for SimpleKillFeed/DeathNotes plugin)")]
public List<string> displayNamesListNPC = new List<string> {
"Crashsite NPC1", "Crashsite NPC2", "Crashsite NPC3"
}
;
[JsonProperty("Prohibit building near the crash site")]
public bool buildingBlock = false;
[JsonProperty("How long construction is prohibited near the crash site(in seconds)")]
public int buildingBlockTime = 1800;
}
private void OnServerInitialized() {
LoadConfig();
remainToEvent = Configuration.remainToEvent;
remain = remainToEvent;
speed = Configuration.speed;
cratesAmount = Configuration.cratesAmount;
airdropsAmount = Configuration.airdropsAmount;
fireballsAmount = Configuration.fireballsAmount;
passengersAmount = Configuration.passengersAmount;
expMarker = Configuration.expMarker;
mapSize = Configuration.mapSize / 4f;
altitude = Configuration.altitude;
message = Configuration.message;
kitName = Configuration.kitName;
passengerName = Configuration.passengerName;
crashZoneCenter = Configuration.crashZoneCenter;
lifeTimeExpMarker = Configuration.lifeTimeExpMarker;
lifeTimeCrates = Configuration.lifeTimeCrates;
lifeTimeAirdrops = Configuration.lifeTimeAirdrops;
signalSmoke = Configuration.signalSmoke;
lifeTimeSignalSmoke = Configuration.lifeTimeSignalSmoke;
typeNpcs = Configuration.typeNpcs;
npcHealth = Configuration.npcHealth;
npcDamageMultiplier = Configuration.npcDamageMultiplier;
npcsAmount = Configuration.npcsAmount;
lifeTimeNpcs = Configuration.lifeTimeNpcs;
randomEventTime = Configuration.randomEventTime;
minimumRemainToEvent = Configuration.minimumRemainToEvent;
maximumRemainToEvent = Configuration.maximumRemainToEvent;
minOnline = Configuration.minOnline;
buildingBlock = Configuration.buildingBlock;
buildingBlockTime = Configuration.buildingBlockTime;
npcKit = Configuration.npcKit;
npcAttackRange = Configuration.npcAttackRange;
if (lifeTimeSignalSmoke > 214) lifeTimeSignalSmoke = 214;
if (npcsAmount > 15) npcsAmount = 15;
Unsubscribe("OnTick");
switch (typeNpcs) {
case 0 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/tunneldweller/npc_tunneldweller.prefab";
break;
case 1 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/underwaterdweller/npc_underwaterdweller.prefab";
break;
case 2 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_excavator.prefab";
break;
case 3 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_any.prefab";
break;
case 4 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_lr300.prefab";
break;
case 5 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_mp5.prefab";
break;
case 6 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_pistol.prefab";
break;
case 7 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_full_shotgun.prefab";
break;
case 8 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_heavy.prefab";
break;
case 9 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_junkpile_pistol.prefab";
break;
case 10 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_oilrig.prefab";
break;
case 11 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_patrol.prefab";
break;
case 12 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_peacekeeper.prefab";
break;
case 13 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_roam.prefab";
break;
case 14 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_roamtethered.prefab";
break;
case 15 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/banditguard/npc_bandit_guard.prefab";
break;
case 16 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_cargo.prefab";
break;
case 17 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_cargo_turret_any.prefab";
break;
case 18 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_cargo_turret_lr300.prefab";
break;
case 19 : npcPrefab = "assets/rust.ai/agents/npcplayer/humannpc/scientist/scientistnpc_ch47_gunner.prefab";
break;
}
if (randomEventTime) remainToEvent = Random.Range(minimumRemainToEvent, maximumRemainToEvent);
remain = remainToEvent;
Puts("Event will start in " + remainToEvent.ToString() + " seconds");
timer.Every(1f, () => {
remain--;
buildingBlockTimer--;
if (remain < 0) {
int s = 0;
if (entity) s = -9999;
foreach (BasePlayer player in BasePlayer.activePlayerList) s++;
if (s >= minOnline) startEvent();
else {
remain = remainToEvent;
if (entity) Puts("The event is already running");
else Puts("Not enough online players on the server, event will not start!");
}
}
}
);
}
void SaveConfig(object config) => Config.WriteObject(config, true);
void LoadConfig() {
base.Config.Settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
Configuration = Config.ReadObject<ConfigData>();
SaveConfig(Configuration);
}
protected override void LoadDefaultConfig() {
var config = new ConfigData();
SaveConfig(config);
}
void startEvent() {
Puts("Event started");
RemoveEvent();
findTarget();
entity = GameManager.server.CreateEntity(prefabstr, new Vector3(0, 1000, 0), new Quaternion(), false);
entity.Spawn();
var str = "assets/bundled/prefabs/oilfireballsmall.prefab";
BaseEntity fire = GameManager.server.CreateEntity(str, entity.transform.position);
fire.Spawn();
fire.SetParent(entity);
fire.transform.localPosition = new Vector3(-6.8f, 6.8f, 3f);
Subscribe("OnTick");
if (message != null) foreach (BasePlayer player in BasePlayer.activePlayerList) player.ChatMessage(message);
entity.transform.position += Vector3.up * altitude;
if (randomEventTime) remainToEvent = Random.Range(minimumRemainToEvent, maximumRemainToEvent);
remain = remainToEvent;
Puts("Next event will start in " + remainToEvent.ToString() + " seconds");
}
void OnTick() {
if (entity) {
entity.transform.LookAt(target);
direction = entity.transform.forward;
entity.transform.position += direction * speed;
if (Vector3.Distance(entity.transform.position, target) < speed) {
crashSite();
return;
}
if (Physics.Raycast(entity.transform.position + Vector3.up * 100, Vector3.down, out check, 200, layerS)) if (Vector3.Distance(check.point, entity.transform.position) < 3) crashSite();
}
}
void OnAirdrop(CargoPlane plane, Vector3 dropPosition) {
BaseEntity ent = plane as BaseEntity;
if (smokeFlag) {
ent.Kill();
smokeFlag = false;
}
}
void crashSite() {
entityList.Clear();
Vector3 pos = Vector3.zero;
crashPosition = entity.transform.position;
spawnItems.Add(Vector3.zero);
spawnItems.Clear();
spawnItem("assets/prefabs/npc/patrol helicopter/effects/heli_explosion.prefab", 1, true);
spawnItem("assets/prefabs/misc/supply drop/supply_drop.prefab", airdropsAmount, false);
spawnItem("assets/prefabs/deployable/chinooklockedcrate/codelockedhackablecrate.prefab", cratesAmount, false);
spawnItem("assets/bundled/prefabs/oilfireballsmall.prefab", fireballsAmount, false);
spawnItem(botPrefab, passengersAmount, false);
if (signalSmoke) spawnItem("assets/prefabs/tools/supply signal/grenade.supplysignal.deployed.prefab", 1, false);
if (expMarker) {
var str = "assets/prefabs/tools/map/explosionmarker.prefab";
var marker = GameManager.server.CreateEntity(str, entity.transform.position);
marker.Spawn();
entityList.Add(marker);
timer.Once(lifeTimeExpMarker, () => {
if (marker) marker.Kill();
}
);
}
Unsubscribe("OnTick");
entity.Kill();
buildingBlockTimer = buildingBlockTime;
for (int i = 0; i < npcsAmount; i++) {
int s = 0;
for (int x = 0; x < 22; x++) {
s = 0;
pos = new Vector3(crashPosition.x + Random.Range(-crashRadius, crashRadius), crashPosition.y, crashPosition.z + Random.Range(-crashRadius, crashRadius));
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(pos + Vector3.up * 100f, Vector3.down, out hit, 500f, layerS)) pos = hit.point;
for (int f = 0; f < spawnItems.Count; f++) {
if (Vector3.Distance(pos, spawnItems[f]) < 2) s++;
}
if (s == 0) {
spawnItems.Add(pos);
break;
}
}
if (s > 0) spawnItems.Add(pos);
var npc = GameManager.server.CreateEntity(npcPrefab, pos, new Quaternion(), true);
npc.Spawn();
entityList.Add(npc);
BasePlayer player = npc as BasePlayer;
player.name = npcName;
player.displayName = Configuration.displayNameNPC;
if (i < Configuration.displayNamesListNPC.Count) if (Configuration.displayNamesListNPC[i] != null) player.displayName = Configuration.displayNamesListNPC[i];
BaseNavigator navigator = npc.GetComponent<BaseNavigator>();
navigator.CanUseNavMesh = false;
ScientistBrain brain = npc.GetComponent<ScientistBrain>();
ScientistNPC npcBrain = npc.gameObject.GetComponent<ScientistNPC>();
brain.AttackRangeMultiplier = 10f;
brain.VisionCone = -1;
brain.SenseRange = npcAttackRange;
brain.ListenRange = 15f;
brain.SenseTypes = EntityType.Player;
brain.MemoryDuration = 5f;
brain.TargetLostRange = npcAttackRange;
brain.CheckVisionCone = false;
brain.CheckLOS = true;
brain.IgnoreNonVisionSneakers = true;
brain.HostileTargetsOnly = false;
brain.IgnoreSafeZonePlayers = false;
brain.RefreshKnownLOS = true;
navigator.MaxRoamDistanceFromHome = navigator.BestMovementPointMaxDistance = navigator.BestRoamPointMaxDistance = 5f;
navigator.DefaultArea = "Walkable";
navigator.topologyPreference = ((TerrainTopology.Enum)TerrainTopology.EVERYTHING);
navigator.Agent.agentTypeID = -1372625422;
if (navigator.CanUseNavMesh) navigator.Init(player, navigator.Agent);
NpcBrain brainNPC = npc.gameObject.AddComponent<NpcBrain>();
brainNPC.homePosition = pos;
brainNPC.stateTimer = 5;
brainNPC.moveChance = 22;
botList.Add(npc);
timer.Once(1f, () => {
if (npc) MoveToPosition(brain, navigator, npc.transform.position + Vector3.forward * 0.1f, 0);
}
);
timer.Every(3f, () => {
if (npc) NpcAI(npc);
}
);
if (npcKit != "") {
player.inventory.Strip();
Kits?.Call("GiveKit", player, npcKit);
}
if (npcHealth > 0) {
player.startHealth = npcHealth;
player.health = npcHealth;
}
timer.Once(lifeTimeNpcs, () => {
if (npc) npc.Kill();
}
);
}
AddWayPoints(crashPosition, crashRadius);
}
public void MoveToPosition(ScientistBrain brain, BaseNavigator navigator, Vector3 pos, int moveSpeed) {
var speed = BaseNavigator.NavigationSpeed.Slow;
if (moveSpeed == 1) speed = BaseNavigator.NavigationSpeed.Fast;
navigator.CanUseNavMesh = true;
brain.Navigator.SetDestination(pos, speed, 0f, 0f);
navigator.CanUseNavMesh = false;
}
public void NpcAI(BaseEntity npc) {
BaseNavigator navigator = npc.GetComponent<BaseNavigator>();
ScientistBrain brain = npc.GetComponent<ScientistBrain>();
NpcBrain x = npc.gameObject.GetComponent<NpcBrain>();
int speed = 0;
if (brain.Senses.Players.Count == 0) {
if (x.stateTimer == 0) {
brain.SwitchToState(AIState.Idle, 0);
x.moveChance = 22;
}
x.stateTimer--;
}
else {
x.stateTimer = coolDownTime;
speed = 1;
x.moveChance = 100;
if (brain.Senses.Players[0]) if (Vector3.Distance(brain.Senses.Players[0].transform.position, npc.transform.position) < chaseRadius) {
float xx = UnityEngine.Random.Range(-2, 2);
float zz = UnityEngine.Random.Range(-2, 2);
Vector3 offset = new Vector3(xx, 0, zz);
x.targetPosition = brain.Senses.Players[0].transform.position + offset;
MoveToPosition(brain, navigator, x.targetPosition, 1);
return;
}
}
if (Vector3.Distance(npc.transform.position, x.homePosition) < homeRadius) {
if (!navigator.Moving) {
var chanсe = UnityEngine.Random.Range(0, 100);
if (chanсe < x.moveChance) {
var y = UnityEngine.Random.Range(0, wayPoints.Count);
Vector3 point = wayPoints[y] + Vector3.up * 0.5f;
RaycastHit check;
Vector3 vec = new Vector3(point.x - npc.transform.position.x, point.y - npc.transform.position.y, point.z - npc.transform.position.z);
if (!Physics.Raycast(npc.transform.position + Vector3.up * 0.5f, vec, out check, Vector3.Distance(npc.transform.position, point), layerS)) x.targetPosition = wayPoints[y];
else x.targetPosition = check.point - Vector3.Normalize(vec) * 0.5f;
MoveToPosition(brain, navigator, x.targetPosition, speed);
}
}
}
else if (x.stateTimer < 0) MoveToPosition(brain, navigator, x.homePosition, 1);
}
public void AddWayPoints(Vector3 center, float radius) {
wayPoints.Clear();
float off = 1;
for (float i = -radius / 2 + off; i < radius / 2 + off; i += 1) for (float ii = -radius / 2 + off; ii < radius / 2 + off; ii += 1) {
RaycastHit check;
Vector3 offset = new Vector3(i, 0, ii);
if (Physics.Raycast(center + offset + Vector3.up * 100, Vector3.down, out check, 200, layerS)) {
BaseEntity entity = check.GetEntity();
if (!entity) wayPoints.Add(check.point);
}
}
}
void spawnItem(string str, int amount, bool effect) {
RaycastHit hit = new RaycastHit();
for (int i = 0; i < amount; i++) {
Vector3 pos = new Vector3(entity.transform.position.x + Random.Range(-crashRadius, crashRadius), entity.transform.position.y, entity.transform.position.z + Random.Range(-crashRadius, crashRadius));
hit = new RaycastHit();
if (Physics.Raycast(pos + Vector3.up * 50f, Vector3.down, out hit, 500f, layerS)) if (hit.point.y > pos.y) pos += Vector3.up * (hit.point.y - pos.y);
if (effect) Effect.server.Run(str, entity.transform.position);
else {
var entityCrash = GameManager.server.CreateEntity(str, pos);
entityCrash.Spawn();
entityList.Add(entityCrash);
if (str == "assets/prefabs/tools/supply signal/grenade.supplysignal.deployed.prefab") {
smokeFlag = true;
timer.Once(lifeTimeSignalSmoke, () => {
if (entityCrash) entityCrash.Kill();
}
);
}
if (str == "assets/prefabs/deployable/chinooklockedcrate/codelockedhackablecrate.prefab") {
spawnItems.Add(entityCrash.transform.position);
HackableLockedCrate ent = entityCrash.GetComponent<HackableLockedCrate>();
ent.hackSeconds = 900 - Configuration.timerCrates;
timer.Once(lifeTimeCrates, () => {
if (entityCrash) {
ent = entityCrash.GetComponent<HackableLockedCrate>();
if (ent.hackSeconds == 900 - Configuration.timerCrates) entityCrash.Kill();
}
}
);
}
if (str == botPrefab) {
BasePlayer pl = entityCrash as BasePlayer;
if (kitName != "") Kits?.Call("GiveKit", pl, kitName);
pl.displayName = passengerName;
pl.Hurt(100);
}
if (entityCrash is SupplyDrop) {
spawnItems.Add(entityCrash.transform.position);
SupplyDrop supplyDrop = entityCrash as SupplyDrop;
var drop = supplyDrop.GetComponent<Rigidbody>();
supplyDrop.RemoveParachute();
drop.drag = 1f;
timer.Once(lifeTimeAirdrops, () => {
if (entityCrash) entityCrash.Kill();
}
);
}
}
}
}
object OnConstructionPlace(BaseEntity entity, Construction component, Construction.Target constructionTarget, BasePlayer player) {
if (buildingBlock) if (buildingBlockTimer > 0) if (entity is BuildingBlock) if (Vector3.Distance(player.transform.position, crashPosition) < crashRadius * 2) {
NextFrame(() => {
if (entity) entity.AdminKill();
}
);
player.ChatMessage("You can't build near the crash site");
}
return null;
}
private void OnEntityTakeDamage(BaseEntity entity, HitInfo info) {
var killer = info.Initiator as BasePlayer;
if (killer) {
if (killer.name == npcName) info.damageTypes.ScaleAll(npcDamageMultiplier);
if (entity.name == npcName) if (Vector3.Distance(entity.transform.position, killer.transform.position) > Configuration.npcMinDistToDmg) info.damageTypes.ScaleAll(0);
}
}
void Unload() {
RemoveEvent();
}
void RemoveEvent() {
if (entity) entity.Kill();
for (int i = 0; i < entityList.Count; i++) if (entityList[i]) entityList[i].Kill();
}
void findTarget() {
target = new Vector3(crashZoneCenter.x + Random.Range(-mapSize, mapSize), 300, crashZoneCenter.z + Random.Range(-mapSize, mapSize));
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(target, Vector3.down, out hit, 500, layerS)) target = hit.point;
}
void drawDot(BasePlayer player, Vector3 targetPoint) {
RaycastHit hit = new RaycastHit();
string str = "o";
if (Physics.Raycast(targetPoint, Vector3.down, out hit, 2000, layerS)) targetPoint = hit.point;
player.SendConsoleCommand("ddraw.text", 10f, Color.green, targetPoint, "<size=30>" + str + "</size>");
}
[Command("crashcargoplane")]
private void crashcargoplane(IPlayer iplayer) {
var player = (BasePlayer)iplayer.Object;
if (!player || player.IsAdmin) if (entity) crashSite();
}
[Command("callcargoplane")]
private void callcargoplane(IPlayer iplayer) {
var player = (BasePlayer)iplayer.Object;
if (!player || player.IsAdmin) if (!entity) {
findTarget();
startEvent();
}
}
[Command("setcrashzonecenter")]
private void setcrashzonecenter(IPlayer iplayer) {
var player = (BasePlayer)iplayer.Object;
if (player && player.IsAdmin) {
crashZoneCenter = player.transform.position;
Configuration = Config.ReadObject<ConfigData>();
Configuration.crashZoneCenter = crashZoneCenter;
SaveConfig(Configuration);
player.ChatMessage("Сenter successfully saved " + crashZoneCenter);
showcrashzone(player.IPlayer);
}
}
[Command("cpdebug")]
private void cpdebug(IPlayer iplayer) {
var player = (BasePlayer)iplayer.Object;
if (player && player.IsAdmin) {
string str = "+";
if (entity) player.SendConsoleCommand("ddraw.text", 10f, Color.blue, entity.transform.position, "<size=30>" + str + "</size>");
player.SendConsoleCommand("ddraw.text", 10f, Color.red, target, "<size=30>" + str + "</size>");
showcrashzone(player.IPlayer);
}
}
[Command("changetarget")]
private void changetarget(IPlayer iplayer) {
var player = (BasePlayer)iplayer.Object;
if (player && player.IsAdmin) target = player.transform.position;
}
[Command("showcrashzone")]
private void showcrashzone(IPlayer iplayer) {
var player = (BasePlayer)iplayer.Object;
int poitsAmount = (int)mapSize / 8;
float pos = mapSize;
Vector3 tar = target;
if (player && player.IsAdmin) {
for (int i = 0; i < poitsAmount; i++) {
drawDot(player, crashZoneCenter);
tar = new Vector3(crashZoneCenter.x - pos + i * pos / poitsAmount * 2, 1000, crashZoneCenter.z - pos);
drawDot(player, tar);
tar = new Vector3(crashZoneCenter.x - pos + i * pos / poitsAmount * 2, 1000, crashZoneCenter.z + pos);
drawDot(player, tar);
tar = new Vector3(crashZoneCenter.x - pos, 1000, crashZoneCenter.z - pos + i * pos / poitsAmount * 2);
drawDot(player, tar);
tar = new Vector3(crashZoneCenter.x + pos, 1000, crashZoneCenter.z - pos + i * pos / poitsAmount * 2);
drawDot(player, tar);
}
}
}
}
}