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

FREE DroneEvent : 1.1.4 1.1.4

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using UnityEngine;
using System.Numerics;
using Oxide.Core.Libraries.Covalence;
using Oxide.Game.Rust.Libraries;
using Newtonsoft.Json;
using System.Collections.Generic;
using Oxide.Core.Plugins;
namespace Oxide.Plugins {
    [Info("DroneEvent", "Fruster", "1.1.4")]
    [Description("DroneEvent")]
    class DroneEvent : CovalencePlugin {
        [PluginReference]
        Plugin SimpleLootTable;
        const int layerS = ~(1 << 2 | 1 << 3 | 1 << 4 | 1 << 10 | 1 << 18 | 1 << 28 | 1 << 29);
        private float altitude = 10f;
        private Timer dronesMainTimer;
        private class DroneAI : FacepunchBehaviour {
            public Vector3 homePosition;
            public Vector3 targetPosition;
            public BaseEntity parent;
            public AutoTurret turret;
            public int health;
            public int radius;
            public float altitude;
            public float upVelocity;
            public float speed;
            public SpawnSettings settings;
        }
        private class SpawnSettings : FacepunchBehaviour {
            public Drone drone;
            public int timer;
            public int radius;
        }
        private class MonumentSettings {
            public string name {
                get;
                set;
            }
            public int flightRadius {
                get;
                set;
            }
            public Vector3 offset {
                get;
                set;
            }
            public bool use {
                get;
                set;
            }
        }
        private class CustomSpawnPoints {
            public string name {
                get;
                set;
            }
            public int flightRadius {
                get;
                set;
            }
            public Vector3 position {
                get;
                set;
            }
            public bool use {
                get;
                set;
            }
        }
        private class ItemsList {
            public string name {
                get;
                set;
            }
            public int dropChance {
                get;
                set;
            }
            public float minAmount {
                get;
                set;
            }
            public int maxAmount {
                get;
                set;
            }
            public ulong skinID {
                get;
                set;
            }
        }
        float sense;
        Drone drone;
        DroneAI droneAI;
        Rigidbody rigidbody;
        RaycastHit check;
        Vector3 offset;
        Vector3 lTargetDir;
        BaseEntity body;
        private ConfigData Configuration;
        class ConfigData {
            [JsonProperty("Minimum respawn time(in minutes)")]
            public int minRaspawnTime = 15;
            [JsonProperty("Maximum respawn time(in minutes)")]
            public int maxRaspawnTime = 30;
            [JsonProperty("Drone health (hits amount)")]
            public int droneHealth = 2;
            [JsonProperty("Damage dealt to a drone when a player hits it with a rocket")]
            public int rocketDamage = 5;
            [JsonProperty("Drone speed(0.5 - 1 recommended)")]
            public float droneSpeed = 0.7f;
            [JsonProperty("Grenade damage scale")]
            public float dmgScale = 1f;
            [JsonProperty("Attack range")]
            public int attackRange = 40;
            [JsonProperty("Drone aggressiveness, from 0 to 100 (the more, the more often the drone attacks)")]
            public int droneAggressiveness = 10;
            [JsonProperty("Adds a searchlight for drones")]
            public bool searchLight = false;
            [JsonProperty("Adds a turret for drones")]
            public bool turret = false;
            [JsonProperty("Turret damage scale")]
            public float turretDmgScale = 1f;
            [JsonProperty("Turret weapon short name")]
            public string turretWeaponName = "pistol.revolver";
            [JsonProperty("The drone will throw grenades at players")]
            public bool throwGrenades = true;
            [JsonProperty("Do not calculate collisions while the drone is just flying (set to true if you have problems with your server performance)")]
            public bool noCollision = false;
            [JsonProperty("Blow up a drone immediately after it runs out of health (will reduce the load on your server a little more)")]
            public bool immediatelyExp = false;
            [JsonProperty("Simple loot table name(plugin SimpleLootTable is required)")]
            public string lootTableName = "";
            [JsonProperty("Minimum number of items for a simple LootTable(plugin SimpleLootTable is required)")]
            public int tableMinItems = 1;
            [JsonProperty("Maximum number of items for a simple LootTable(plugin SimpleLootTable is required)")]
            public int tableMaxItems = 3;
            [JsonProperty("Monument settings")]
            public List<MonumentSettings> monumentSettings = new List<MonumentSettings> {
                new MonumentSettings {
                    name = "gas_station", flightRadius = 15, offset = new Vector3(17, 30, 0), use = true
                }
                , new MonumentSettings {
                    name = "supermarket", flightRadius = 15, offset = new Vector3(0, 15, 0), use = true
                }
                , new MonumentSettings {
                    name = "warehouse", flightRadius = 15, offset = new Vector3(-5, 15, 0), use = true
                }
                , new MonumentSettings {
                    name = "water_treatment", flightRadius = 15, offset = new Vector3(-60, 20, 0), use = true
                }
                , new MonumentSettings {
                    name = "junkyard", flightRadius = 15, offset = new Vector3(0, 15, 0), use = true
                }
                , new MonumentSettings {
                    name = "lighthouse", flightRadius = 15, offset = new Vector3(0, 35, 40), use = true
                }
                , new MonumentSettings {
                    name = "sphere_tank", flightRadius = 15, offset = new Vector3(60, 35, 40), use = true
                }
                , new MonumentSettings {
                    name = "harbor_1", flightRadius = 15, offset = new Vector3(-40, 25, 20), use = true
                }
                , new MonumentSettings {
                    name = "harbor_2", flightRadius = 15, offset = new Vector3(-100, 20, -20), use = true
                }
                , new MonumentSettings {
                    name = "desert_military_base", flightRadius = 15, offset = new Vector3(-15, 20, -5), use = true
                }
                , new MonumentSettings {
                    name = "excavator", flightRadius = 15, offset = new Vector3(65, 20, -10), use = true
                }
                , new MonumentSettings {
                    name = "swamp", flightRadius = 15, offset = new Vector3(-10, 30, -15), use = false
                }
                , new MonumentSettings {
                    name = "radtown_small", flightRadius = 15, offset = new Vector3(-5, 30, -5), use = true
                }
                , new MonumentSettings {
                    name = "water_well", flightRadius = 15, offset = new Vector3(0, 30, 0), use = true
                }
                , new MonumentSettings {
                    name = "mining_quarry", flightRadius = 15, offset = new Vector3(0, 25, 0), use = false
                }
                , new MonumentSettings {
                    name = "satellite_dish", flightRadius = 15, offset = new Vector3(-40, 25, -20), use = false
                }
                , new MonumentSettings {
                    name = "cave_small", flightRadius = 15, offset = new Vector3(0, 30, 0), use = false
                }
                , new MonumentSettings {
                    name = "cave_medium", flightRadius = 15, offset = new Vector3(0, 30, 0), use = false
                }
                , new MonumentSettings {
                    name = "cave_large", flightRadius = 30, offset = new Vector3(0, 35, 0), use = false
                }
                , new MonumentSettings {
                    name = "airfield", flightRadius = 25, offset = new Vector3(-75, 20, 0), use = false
                }
                , new MonumentSettings {
                    name = "launch_site", flightRadius = 15, offset = new Vector3(0, 20, 130), use = false
                }
                , new MonumentSettings {
                    name = "powerplant", flightRadius = 25, offset = new Vector3(-75, 20, -40), use = false
                }
                , new MonumentSettings {
                    name = "trainyard", flightRadius = 15, offset = new Vector3(-70, 20, 0), use = false
                }
                , new MonumentSettings {
                    name = "arctic_research_base", flightRadius = 25, offset = new Vector3(10, 15, -25), use = true
                }
                , new MonumentSettings {
                    name = "ice_lake", flightRadius = 15, offset = new Vector3(0, 20, 0), use = false
                }
                , new MonumentSettings {
                    name = "military_tunnel", flightRadius = 15, offset = new Vector3(20, 30, -15), use = false
                }
                , new MonumentSettings {
                    name = "power_sub_big", flightRadius = 10, offset = new Vector3(0, 20, 0), use = false
                }
                , new MonumentSettings {
                    name = "ferry_terminal", flightRadius = 10, offset = new Vector3(40, 25, 0), use = true
                }
                , new MonumentSettings {
                    name = "missile_sil", flightRadius = 10, offset = new Vector3(0, 20, 0), use = false
                }
            }
            ;
            [JsonProperty("Custom spawn points settings")]
            public List<CustomSpawnPoints> customSpawnPoints = new List<CustomSpawnPoints> {
                new CustomSpawnPoints {
                    name = "point1", flightRadius = 15, position = new Vector3(0, 100, 0), use = false
                }
                , new CustomSpawnPoints {
                    name = "point2", flightRadius = 15, position = new Vector3(0, 200, 0), use = false
                }
            }
            ;
            [JsonProperty("Drop items list")]
            public List<ItemsList> dropItemsList = new List<ItemsList> {
                new ItemsList {
                    name = "metal.fragments", dropChance = 100, minAmount = 50, maxAmount = 300, skinID = 0
                }
                , new ItemsList {
                    name = "metal.refined", dropChance = 100, minAmount = 5, maxAmount = 10, skinID = 0
                }
                , new ItemsList {
                    name = "scrap", dropChance = 100, minAmount = 10, maxAmount = 20, skinID = 0
                }
                , new ItemsList {
                    name = "techparts", dropChance = 50, minAmount = 1, maxAmount = 2, skinID = 0
                }
            }
            ;
        }
        private List<GameObject> spawnPositions = new List<GameObject>();
        private List<Drone> dronesList = new List<Drone>();
        private void OnServerInitialized() {
            RemoveParentMissing();
            timer.Once(5f, () => {
                RemoveParentMissing();
            }
            );
            LoadConfig();
            Configuration.droneSpeed *= 1.68f;
            sense = 1.2f * 1.68f;
            offset = new Vector3(0, -0.22f, 0);
            for (int i = 0; i < Configuration.monumentSettings.Count; i++) foreach (var monument in TerrainMeta.Path.Monuments) if (monument.name.Contains(Configuration.monumentSettings[i].name)) if (Configuration.monumentSettings[i].use) {
                Vector3 pos = monument.transform.position + Vector3.up * Configuration.monumentSettings[i].offset.y + monument.transform.forward * Configuration.monumentSettings[i].offset.x + monument.transform.right * Configuration.monumentSettings[i].offset.z;
                AddSpawn(pos, Configuration.monumentSettings[i].flightRadius);
            }
            for (int i = 0; i < Configuration.customSpawnPoints.Count; i++) if (Configuration.customSpawnPoints[i].use) AddSpawn(Configuration.customSpawnPoints[i].position, Configuration.customSpawnPoints[i].flightRadius);
            Puts(spawnPositions.Count.ToString() + " spawn points have been created on the map");
            timer.Every(1f, () => {
                for (int i = 0; i < dronesList.Count; i++) {
                    DroneAI droneAI = dronesList[i].GetComponent<DroneAI>();
                    if (Vector3.Distance(dronesList[i].transform.position, new Vector3(droneAI.homePosition.x, dronesList[i].transform.position.y, droneAI.homePosition.z)) > droneAI.radius) DroneTarget(droneAI.parent as BaseEntity, droneAI);
                    foreach (BasePlayer player in BasePlayer.activePlayerList) if (player.transform.position.y < dronesList[i].transform.position.y) if (Vector3.Distance(player.transform.position, dronesList[i].transform.position) < Configuration.attackRange) {
                        float distance = Vector3.Distance(player.transform.position, dronesList[i].transform.position);
                        Vector3 start = dronesList[i].transform.position + dronesList[i].transform.forward * 0.3f;
                        RaycastHit check;
                        Vector3 direction = new Vector3(player.transform.position.x - start.x, player.transform.position.y - start.y, player.transform.position.z - start.z);
                        if (Physics.Raycast(start, direction, out check, 999, layerS)) {
                            BaseEntity entityPlayer = player.GetEntity();
                            BaseEntity entity = check.GetEntity();
                            if (entity == entityPlayer) {
                                int chance = UnityEngine.Random.Range(0, 100);
                                if (chance < Configuration.droneAggressiveness) {
                                    if (droneAI.turret != null) droneAI.turret.target = player;
                                    if (Configuration.throwGrenades) {
                                        droneAI.targetPosition = new Vector3(player.transform.position.x, dronesList[i].transform.position.y, player.transform.position.z);
                                        droneAI.parent.transform.LookAt(droneAI.targetPosition);
                                        string prefab = "assets/prefabs/weapons/f1 grenade/grenade.f1.deployed.prefab";
                                        Vector3 offset = dronesList[i].transform.forward * 0.4f + Vector3.down * 0.4f;
                                        var gren = GameManager.server.CreateEntity(prefab, start + offset);
                                        gren.Spawn();
                                        gren.creatorEntity = dronesList[i];
                                        Rigidbody rig = gren.GetComponent<Rigidbody>();
                                        rig.velocity = Vector3.Normalize(direction) * distance / 1.8f;
                                        TimedExplosive exp = gren as TimedExplosive;
                                        exp.SetDamageScale(Configuration.dmgScale);
                                        //prefab = "assets/bundled/prefabs/fx/impacts/additive/fire.prefab";
                                        //Effect.server.Run(prefab, start + offset);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            );
            timer.Every(5f, () => {
                for (int i = 0; i < spawnPositions.Count; i++) {
                    SpawnSettings settings = spawnPositions[i].GetComponent<SpawnSettings>();
                    settings.timer--;
                    if (settings.timer == 0) DroneSpawn(spawnPositions[i].transform.position, settings);
                }
                for (int i = 0; i < dronesList.Count; i++) {
                    DroneAI droneAI = dronesList[i].GetComponent<DroneAI>();
                    DroneTarget(droneAI.parent as BaseEntity, droneAI);
                }
            }
            );
        }
        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);
        }
        private void AddSpawn(Vector3 pos, int radius) {
            GameObject obj = new GameObject();
            obj.transform.position = pos;
            SpawnSettings settings = obj.gameObject.AddComponent<SpawnSettings>();
            settings.radius = radius;
            settings.timer = GetRespawnTime();
            spawnPositions.Add(obj);
        }
        private void DroneTarget(BaseEntity drone, DroneAI droneAI) {
            droneAI.targetPosition = new Vector3(UnityEngine.Random.Range(-droneAI.radius, droneAI.radius) + droneAI.homePosition.x, droneAI.homePosition.y, UnityEngine.Random.Range(-droneAI.radius, droneAI.radius) + droneAI.homePosition.z);
            droneAI.altitude = droneAI.homePosition.y + UnityEngine.Random.Range(0, altitude);
        }
        private void DronesAI() {
            for (int i = 0; i < dronesList.Count; i++) {
                drone = dronesList[i];
                droneAI = drone.GetComponent<DroneAI>();
                rigidbody = droneAI.parent.GetComponent<Rigidbody>();
                if (droneAI.health < 1 || !Configuration.noCollision) {
                    if (Physics.Raycast(drone.transform.position + offset, drone.transform.forward, out check, sense, layerS)) if (drone) CheckCollider(check, drone);
                    if (Physics.Raycast(drone.transform.position + offset, Vector3.down, out check, sense, layerS)) if (drone) CheckCollider(check, drone);
                }
                lTargetDir = new Vector3(droneAI.targetPosition.x, drone.transform.position.y + UnityEngine.Random.Range(-0.5f, 0.5f), droneAI.targetPosition.z) - drone.transform.position;
                body = droneAI.parent as BaseEntity;
                body.transform.rotation = Quaternion.RotateTowards(body.transform.rotation, Quaternion.LookRotation(lTargetDir), 20f);
                rigidbody.velocity += Vector3.up * (droneAI.altitude - drone.transform.position.y) / 3f * droneAI.upVelocity + Vector3.up * droneAI.upVelocity;
                rigidbody.velocity += drone.transform.forward * droneAI.speed;
            }
        }
        private void CheckCollider(RaycastHit check, Drone drone) {
            if (check.GetEntity()) if (check.GetEntity().name == "assets/prefabs/weapons/f1 grenade/grenade.f1.deployed.prefab" || check.GetEntity().name == "tdDroneCollider") return;
            DroneDead(drone);
            dronesList.Remove(drone);
            drone.Kill();
        }
        private int GetRespawnTime() {
            int respawnTime = (int)UnityEngine.Random.Range(Configuration.minRaspawnTime * 12, Configuration.maxRaspawnTime * 12 + 0.1f);
            return respawnTime;
        }
        private void DroneSpawn(Vector3 position, SpawnSettings settings) {
            string dronePrefab = "assets/prefabs/misc/marketplace/drone.delivery.prefab";
            var drone = GameManager.server.CreateEntity(dronePrefab, position) as DeliveryDrone;
            drone.Spawn();
            drone.pickup.enabled = false;
            if (drone == null) return;
            drone.CancelInvoke(drone.Think);
            SetupDeliveryDrone(drone);
            drone.name = "tdDeliveryDrone";
            dronePrefab = "assets/prefabs/deployable/drone/drone.deployed.prefab";
            var colliderDrone = GameManager.server.CreateEntity(dronePrefab, position) as Drone;
            colliderDrone.Spawn();
            colliderDrone.pickup.enabled = false;
            colliderDrone.SetParent(drone);
            colliderDrone.transform.localPosition = Vector3.zero;
            DroneAI droneAI = colliderDrone.gameObject.AddComponent<DroneAI>();
            Rigidbody colRigidbody = colliderDrone.GetComponent<Rigidbody>();
            colRigidbody.isKinematic = true;
            colliderDrone.name = "tdDroneCollider";
            drone.name = "tdDroneBody";
            colliderDrone._maxHealth = 999999;
            colliderDrone.health = 999999;
            droneAI.homePosition = drone.transform.position;
            droneAI.altitude = droneAI.homePosition.y + UnityEngine.Random.Range(0, 10);
            droneAI.targetPosition = new Vector3(UnityEngine.Random.Range(-droneAI.radius, droneAI.radius) + droneAI.homePosition.x, droneAI.homePosition.y, UnityEngine.Random.Range(-droneAI.radius, droneAI.radius) + droneAI.homePosition.z);
            drone.transform.LookAt(new Vector3(droneAI.targetPosition.x, drone.transform.position.y, droneAI.targetPosition.z));
            droneAI.radius = settings.radius;
            droneAI.health = Configuration.droneHealth;
            droneAI.speed = Configuration.droneSpeed;
            droneAI.upVelocity = 1.3f;
            droneAI.parent = drone;
            droneAI.settings = settings;
            dronesList.Add(colliderDrone);
            Drone dr = colliderDrone as Drone;
            dr.InitializeControl(new CameraViewerId(0, 0));
            InputMessage message = new InputMessage() {
                buttons = 128
            }
            ;
            InputState input = new InputState() {
                current = message
            }
            ;
            dr.UserInput(input, new CameraViewerId(0, 0));
            dr.currentInput.throttle = 0;
            if (Configuration.searchLight || Configuration.turret) AddSphere(colliderDrone, droneAI);
            if (dronesList.Count == 1) dronesMainTimer = timer.Every(0.24f, () => DronesAI());
        }
        private void AddSphere(BaseEntity entity, DroneAI droneAI) {
            string searchLightPrefab = "assets/prefabs/deployable/search light/searchlight.deployed.prefab";
            string spherePrefab = "assets/prefabs/visualization/sphere.prefab";
            SphereEntity sphereEntity = GameManager.server.CreateEntity(spherePrefab, new Vector3(0, -100, 0), Quaternion.identity) as SphereEntity;
            sphereEntity.EnableSaving(true);
            sphereEntity.EnableGlobalBroadcast(false);
            sphereEntity.SetParent(entity);
            sphereEntity.Spawn();
            sphereEntity.currentRadius = 0.1f;
            sphereEntity.lerpRadius = 0.1f;
            sphereEntity.UpdateScale();
            sphereEntity.SendNetworkUpdateImmediate();
            timer.Once(3f, () => {
                if (sphereEntity != null) sphereEntity.transform.localPosition = new Vector3(0, 0.2f, 0.2f);
            }
            );
            if (Configuration.searchLight) {
                SearchLight searchLight = GameManager.server.CreateEntity(searchLightPrefab, sphereEntity.transform.position) as SearchLight;
                searchLight.pickup.enabled = false;
                foreach (var mesh in searchLight.GetComponentsInChildren<Collider>()) UnityEngine.Object.DestroyImmediate(mesh);
                UnityEngine.Object.DestroyImmediate(searchLight.GetComponent<DestroyOnGroundMissing>());
                UnityEngine.Object.DestroyImmediate(searchLight.GetComponent<GroundWatch>());
                searchLight.Spawn();
                searchLight._maxHealth = 99999999f;
                searchLight._health = 99999999f;
                searchLight.SendNetworkUpdate();
                searchLight.SetFlag(BaseEntity.Flags.Reserved5, true);
                searchLight.SetFlag(BaseEntity.Flags.Busy, true);
                searchLight.SetFlag(IOEntity.Flag_HasPower, !searchLight.IsPowered());
                searchLight.SetParent(sphereEntity);
                searchLight.transform.localPosition = Vector3.zero;
                searchLight.transform.localRotation = Quaternion.Euler(-20, 180, 180);
            }
            if (Configuration.turret) {
                var turretMain = GameManager.server.CreateEntity("assets/prefabs/npc/autoturret/autoturret_deployed.prefab", Vector3.zero, new Quaternion(180, 0, 0, 0), true);
                turretMain.SetParent(sphereEntity);
                turretMain.transform.localPosition = new Vector3(0, -1.9f, 0.3f);
                foreach (var mesh in turretMain.GetComponentsInChildren<CapsuleCollider>()) UnityEngine.Object.DestroyImmediate(mesh);
                turretMain.Spawn();
                AutoTurret turret = turretMain.GetComponent<AutoTurret>();
                turret.sightRange = Configuration.attackRange;
                var gun = ItemManager.Create(ItemManager.FindItemDefinition(Configuration.turretWeaponName));
                gun.MoveToContainer(turret.inventory, 0);
                turret.UpdateAttachedWeapon();
                turret.CancelInvoke(turret.UpdateAttachedWeapon);
                var weapon = turret.GetAttachedWeapon();
                weapon.primaryMagazine.contents = 999999;
                weapon.damageScale = Configuration.turretDmgScale;
                turret.SetFlag(BaseEntity.Flags.Reserved8, true);
                turret.InitiateStartup();
                turret.creatorEntity = entity;
                droneAI.turret = turret;
            }
        }
        private static void SetupDeliveryDrone(DeliveryDrone deliveryDrone) {
            deliveryDrone.EnableSaving(false);
            deliveryDrone.EnableGlobalBroadcast(false);
            deliveryDrone.CancelInvoke(deliveryDrone.Think);
            deliveryDrone.lifestate = BaseCombatEntity.LifeState.Dead;
            if (deliveryDrone._mapMarkerInstance != null) deliveryDrone._mapMarkerInstance.Kill();
        }
        private void OnEntityKill(Drone entity) {
            if (entity.name.Contains("tdDroneCollider")) {
                BaseEntity drone = dronesList.Find(item => item == entity);
                if (drone) {
                    DroneDead(entity);
                    dronesList.Remove(entity);
                }
            }
        }
        private void DroneDead(Drone entity) {
            Vector3 pos = entity.transform.position;
            entity.transform.position += Vector3.down * 9999;
            DroneAI droneAI = entity.GetComponent<DroneAI>();
            if (droneAI) {
                droneAI.settings.timer = GetRespawnTime();
                NextFrame(() => {
                    if (droneAI.parent) droneAI.parent.Kill();
                }
                );
            }
            string expPrefab = "assets/prefabs/weapons/f1 grenade/grenade.f1.deployed.prefab";
            BaseEntity exlode = GameManager.server.CreateEntity(expPrefab, pos);
            TimedExplosive exp = exlode as TimedExplosive;
            exlode.Spawn();
            exp.SetDamageScale(Configuration.dmgScale);
            exp.Explode();
            expPrefab = "assets/bundled/prefabs/fx/gas_explosion_small.prefab";
            Effect.server.Run(expPrefab, pos);
            string npcPrefab = "assets/prefabs/deployable/small stash/small_stash_deployed.prefab";
            BaseEntity storage = GameManager.server.CreateEntity(npcPrefab, pos + Vector3.up);
            storage.Spawn();
            StorageContainer inv1 = storage.GetComponent<StorageContainer>();
            inv1.inventory.capacity = 99;
            BaseCombatEntity ent = storage.GetComponent<BaseCombatEntity>();
            StorageContainer inv = storage.GetComponent<StorageContainer>();
            if (Configuration.lootTableName != "") SimpleLootTable?.Call("GetSetItems", inv, Configuration.lootTableName, Configuration.tableMinItems, Configuration.tableMaxItems, 1f);
            else {
                for (int i = 0; i < Configuration.dropItemsList.Count; i++) {
                    int chanсe = (int)UnityEngine.Random.Range(0, 100);
                    if (chanсe < Configuration.dropItemsList[i].dropChance) {
                        ItemDefinition item = ItemManager.FindItemDefinition(Configuration.dropItemsList[i].name);
                        ulong skinID = Configuration.dropItemsList[i].skinID;
                        if (item) {
                            int amount = (int)UnityEngine.Random.Range(Configuration.dropItemsList[i].minAmount, Configuration.dropItemsList[i].maxAmount + 1);
                            inv.inventory.AddItem(item, amount, skinID);
                        }
                        else PrintWarning("!!! In the config file of the list of drop items, there is an error in the name of the item - " + Configuration.dropItemsList[i].name + " !!!");
                    }
                }
            }
            ent.DieInstantly();
            if (dronesList.Count == 0) RemoveMainTimer();
        }
        private void OnEntityTakeDamage(Drone drone, HitInfo hitInfo) {
            if (drone.name == "tdDroneCollider") {
                int damage = 1;
                if (hitInfo.Initiator) if (hitInfo.Initiator.name == "assets/prefabs/npc/autoturret/autoturret_deployed.prefab" || hitInfo.Initiator.name == "assets/bundled/prefabs/fireball_small.prefab") return;
                if (hitInfo.WeaponPrefab && hitInfo.WeaponPrefab.ToString().Contains("rocket")) damage = Configuration.rocketDamage;
                DroneAI droneAI = drone.gameObject.GetComponentInChildren<DroneAI>();
                if (droneAI) {
                    droneAI.health = droneAI.health - damage;
                    if (hitInfo.InitiatorPlayer) {
                        var str = "assets/bundled/prefabs/fx/impacts/additive/explosion.prefab";
                        Effect.server.Run(str, drone.transform.position);
                    }
                    if (droneAI.health <= 0) {
                        if (Configuration.immediatelyExp) {
                            DroneDead(drone);
                            dronesList.Remove(drone);
                            drone.Kill();
                            return;
                        }
                        droneAI.upVelocity = 0;
                        var str = "assets/bundled/prefabs/fireball_small.prefab";
                        BaseEntity fire = GameManager.server.CreateEntity(str, drone.transform.position);
                        fire.Spawn();
                        UnityEngine.Object.Destroy(fire.gameObject.GetComponent<Rigidbody>());
                        fire.SetParent(drone);
                        fire.transform.localPosition = new Vector3(0, 0, 0);
                    }
                }
            }
        }
        private void RemoveParentMissing() {
            var foundObjects = new List<BaseNetworkable>();
            var reportLines = new List<string>();
            foreach (var networkable in BaseNetworkable.serverEntities) {
                if (!networkable.parentEntity.IsSet()) continue;
                var parentEntityId = networkable.parentEntity.uid;
                string pas = parentEntityId.ToString();
                if (pas == "0") continue;
                var parent = networkable.GetParentEntity();
                if (parent == null && networkable != null && !networkable.IsDestroyed) {
                    foundObjects.Add(networkable);
                    reportLines.Add($"{networkable.net.ID} (parent: {parentEntityId}) | {networkable.GetType()} | {networkable.PrefabName} @ {networkable.transform.position}");
                }
            }
            if (reportLines.Count == 0) return;
            var reportString = string.Join("\n", reportLines);
            foreach (var networkable in foundObjects) networkable.Kill();
        }
        public void RemoveMainTimer() {
            if (dronesMainTimer != null) dronesMainTimer.Destroy();
        }
        void Unload() {
            RemoveAllDrones();
        }
        void OnServerShutdown() {
            RemoveAllDrones();
        }
        private void RemoveAllDrones() {
            foreach (var item in dronesList) if (item) {
                item.name = "null";
                DroneAI droneAI = item.GetComponent<DroneAI>();
                if (droneAI) if (droneAI.parent) droneAI.parent.Kill();
            }
            dronesList.Clear();
            RemoveMainTimer();
        }
        [Command("dre_addpoint")]
        private void dre_addpoint(IPlayer iplayer, string command, string[] args) {
            if (!iplayer.IsServer) if (iplayer.IsAdmin) {
                var player = (BasePlayer)iplayer.Object;
                string _name = "DefaultName";
                int _flightRadius = 15;
                Vector3 _position = player.transform.position;
                bool _use = true;
                if (args.Length > 0) _name = args[0];
                if (args.Length > 1) _flightRadius = int.Parse(args[1]);
                if (args.Length > 2) _use = bool.Parse(args[2]);
                CustomSpawnPoints point = new CustomSpawnPoints {
                    name = _name, flightRadius = _flightRadius, position = _position, use = _use
                }
                ;
                Configuration.customSpawnPoints.Add(point);
                SaveConfig(Configuration);
                player.ChatMessage("Spawn point was saved successfully");
                if (point.use) AddSpawn(point.position, point.flightRadius);
                NextFrame(() => {
                    dreshowzone(player.IPlayer);
                }
                );
            }
        }
        [Command("dre_removepoint")]
        private void dre_removepoint(IPlayer iplayer, string command, string[] args) {
            if (!iplayer.IsServer) if (iplayer.IsAdmin) {
                var player = (BasePlayer)iplayer.Object;
                for (int i = 0; i < Configuration.customSpawnPoints.Count; i++) if (Vector3.Distance(Configuration.customSpawnPoints[i].position, player.transform.position) < 5) {
                    GameObject currentItem = spawnPositions.Find(item => item.transform.position == Configuration.customSpawnPoints[i].position);
                    spawnPositions.Remove(currentItem);
                    Configuration.customSpawnPoints.Remove(Configuration.customSpawnPoints[i]);
                    player.ChatMessage("Spawn point was successfully removed");
                    SaveConfig(Configuration);
                }
            }
        }
        [Command("dreshowpoints")]
        private void dreshowpoints(IPlayer iplayer) {
            if (!iplayer.IsServer) if (iplayer.IsAdmin) {
                var player = (BasePlayer)iplayer.Object;
                foreach (var item in spawnPositions) player.SendConsoleCommand("ddraw.text", 10f, Color.green, item.transform.position, "<size=30>+</size>");
            }
        }
        [Command("dreshowdrones")]
        private void dreshowdrones(IPlayer iplayer) {
            if (!iplayer.IsServer) if (iplayer.IsAdmin) {
                var player = (BasePlayer)iplayer.Object;
                foreach (var item in dronesList) player.SendConsoleCommand("ddraw.text", 10f, Color.blue, item.transform.position, "<size=30>+</size>");
            }
        }
        [Command("dreshowzone")]
        private void dreshowzone(IPlayer iplayer) {
            if (!iplayer.IsServer) if (iplayer.IsAdmin) {
                var player = (BasePlayer)iplayer.Object;
                foreach (var item in spawnPositions) if (Vector3.Distance(player.transform.position, item.transform.position) < 150) {
                    int time = 30;
                    SpawnSettings settings = item.GetComponent<SpawnSettings>();
                    player.SendConsoleCommand("ddraw.text", time, Color.red, item.transform.position, "<size=30>+</size>");
                    Vector3 pos;
                    float x = settings.radius * 1.4f;
                    for (float i = 0; i < x * 2; i += 3) {
                        pos = new Vector3(item.transform.position.x - x + i, item.transform.position.y, item.transform.position.z - x);
                        player.SendConsoleCommand("ddraw.text", time, Color.white, pos, "<size=30>x</size>");
                        pos = new Vector3(item.transform.position.x - x + i, item.transform.position.y, item.transform.position.z + x);
                        player.SendConsoleCommand("ddraw.text", time, Color.white, pos, "<size=30>x</size>");
                        pos = new Vector3(item.transform.position.x - x, item.transform.position.y, item.transform.position.z - x + i);
                        player.SendConsoleCommand("ddraw.text", time, Color.white, pos, "<size=30>x</size>");
                        pos = new Vector3(item.transform.position.x + x, item.transform.position.y, item.transform.position.z - x + i);
                        player.SendConsoleCommand("ddraw.text", time, Color.white, pos, "<size=30>x</size>");
                    }
                }
            }
        }
        [Command("drerespawndrones")]
        private void drerespawndrones(IPlayer iplayer) {
            var player = (BasePlayer)iplayer.Object;
            if (iplayer.IsAdmin) {
                RemoveAllDrones();
                foreach (var item in spawnPositions) {
                    SpawnSettings settings = item.gameObject.GetComponent<SpawnSettings>();
                    settings.timer = 1;
                }
            }
        }
        [Command("dreremovedrones")]
        private void dreremovedrones(IPlayer iplayer) {
            var player = (BasePlayer)iplayer.Object;
            if (iplayer.IsAdmin) {
                RemoveAllDrones();
                foreach (var item in spawnPositions) {
                    SpawnSettings settings = item.gameObject.GetComponent<SpawnSettings>();
                    settings.timer = GetRespawnTime();
                }
            }
        }
    }
}

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