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

FREE F15AirStrike : 1.0.7 1.0.7

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using UnityEngine;
using System.Linq;
using Newtonsoft.Json;
using System.Collections.Generic;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
namespace Oxide.Plugins {
    [Info("F15AirStrike", "Fruster", "1.0.7")]
    [Description("F15AirStrike")]
    class F15AirStrike : CovalencePlugin {
        [PluginReference]
        Plugin HomingMissiles;
        private class F15Targets : FacepunchBehaviour {
            public BasePlayer initiator;
            public Timer attackTimer;
            public int startAttackDistance = 600;
            public int endAttackDistance = 70;
            public List<BaseEntity> targetsList = new List<BaseEntity>();
            public List<BaseEntity> whiteList = new List<BaseEntity>();
            public bool attack = true;
            public Vector3 endPoint = Vector3.zero;
            public Vector3 mainTarget = Vector3.zero;
        }
        private class F15Rocket : FacepunchBehaviour {
            public Timer rocketTimer;
            public Vector3 targetPosition = Vector3.zero;
        }
        private List<BasePlayer> playersList = new List<BasePlayer>();
        private const string rocketPrefab = "assets/content/vehicles/mlrs/rocket_mlrs.prefab";
        private const string supplySignalPrefab = "assets/prefabs/tools/supply signal/supplysignal.weapon.prefab";
        private const string grenadeSupplySignalPrefab = "assets/prefabs/tools/supply signal/grenade.supplysignal.deployed.prefab";
        private const string grenadeFlashBangPrefab = "assets/prefabs/weapons/flashbang/grenade.flashbang.deployed.prefab";
        private ConfigData Configuration;
        private float rateOfFire = 0.4f;
        class ConfigData {
            [JsonProperty("Rockets speed")]
            public int rocketsSpeed = 150;
            [JsonProperty("Attack radius")]
            public int attackRadius = 150;
            [JsonProperty("Damage scale (1 = 100%)")]
            public float damageScale = 1;
            [JsonProperty("Rate of fire(number of shots per second)")]
            public float rateOfFire = 2.5f;
            [JsonProperty("Time to trigger a signal grenade")]
            public float fuseTime = 3f;
            [JsonProperty("Grenade throw force scaling")]
            public float forceScale = 1f;
            [JsonProperty("Damage to buildings")]
            public bool damageBuildings = false;
            [JsonProperty("Attack the initiator")]
            public bool initiatorTargeting = true;
            [JsonProperty("Attack the players")]
            public bool playersTargeting = true;
            [JsonProperty("Attack NPCs")]
            public bool NPCsTargeting = true;
            [JsonProperty("Attack the place where the signal supply was thrown (attacks only in the area, not aiming at players and NPCs)")]
            public bool areaTargeting = false;
            [JsonProperty("Attack accuracy (used only when attacking in an area)")]
            public int attackAccuracy = 30;
            [JsonProperty("Use homing missiles(need HomingMissiles plugin)")]
            public bool useHomingMissiles = false;
        }
        void SaveConfig() => Config.WriteObject(Configuration, true);
        void LoadConfig() {
            Configuration = Config.ReadObject<ConfigData>();
            SaveConfig();
        }
        protected override void LoadDefaultConfig() {
            Configuration = new ConfigData();
            SaveConfig();
        }
        private void OnServerInitialized() {
            LoadConfig();
            if (Configuration.fuseTime < 0.1f) Configuration.fuseTime = 0.1f;
            rateOfFire = 1f / Configuration.rateOfFire;
        }
        private void OnActiveItemChanged(BasePlayer player, Item oldItem, Item newItem) {
            HeldEntity heldEntity = player.GetHeldEntity();
            if (heldEntity != null && heldEntity.name == supplySignalPrefab) {
                if (heldEntity.skinID == 2982472774) {
                    if (!playersList.Contains(player)) playersList.Add(player);
                }
                else if (playersList.Contains(player)) {
                    playersList.Remove(player);
                }
            }
        }
        private void OnExplosiveDropped(BasePlayer player, BaseEntity entity, ThrownWeapon item) {
            OnExplosiveSpawn(player, entity);
        }
        private void OnExplosiveThrown(BasePlayer player, BaseEntity entity) {
            OnExplosiveSpawn(player, entity);
        }
        private void OnExplosiveSpawn(BasePlayer player, BaseEntity entity) {
            if (playersList.Contains(player) && entity.name == grenadeSupplySignalPrefab) {
                var entity1 = GameManager.server.CreateEntity(grenadeFlashBangPrefab, entity.transform.position);
                var explosive = entity1 as Flashbang;
                explosive.timerAmountMin = Configuration.fuseTime;
                explosive.timerAmountMax = Configuration.fuseTime;
                entity1.Spawn();
                Rigidbody rig = entity.GetComponent<Rigidbody>();
                Rigidbody rig1 = entity1.GetComponent<Rigidbody>();
                rig1.velocity = rig.velocity * Configuration.forceScale;
                entity.Kill();
                timer.Once(Configuration.fuseTime - 0.01f, () => CallF15AirStrike(entity1.transform.position, player));
            }
        }
        private void CallF15AirStrike(Vector3 pos, BasePlayer player) {
            Vector3 spawnPosition = Vector3.zero;
            Vector3 destination = Vector3.zero;
            int radius = 1500;
            int randX = Random.Range(-1, 2);
            int randZ = Random.Range(-1, 2);
            if (randX + randZ == 0) randX = 1;
            spawnPosition = new Vector3(pos.x + randX * radius, 500, pos.z + randZ * radius);
            string prefab = "assets/scripts/entity/misc/f15/f15e.prefab";
            var entity = GameManager.server.CreateEntity(prefab, spawnPosition);
            entity.Spawn();
            F15 f15 = entity as F15;
            f15.turnRate = 0;
            F15Targets targets = entity.gameObject.AddComponent<F15Targets>();
            targets.mainTarget = pos;
            targets.initiator = player;
            if (Configuration.playersTargeting) {
                foreach (BasePlayer activePlayer in BasePlayer.activePlayerList) {
                    if (Vector3.Distance(activePlayer.transform.position, pos) < Configuration.attackRadius) targets.targetsList.Add(activePlayer);
                }
                if (!Configuration.initiatorTargeting && player != null) {
                    targets.targetsList.RemoveAll(item => item == player);
                }
            }
            if (Configuration.NPCsTargeting) {
                foreach (BaseEntity item in BaseNetworkable.serverEntities) {
                    if (item.PrefabName.Contains("/npcplayer/humannpc/") && Vector3.Distance(item.transform.position, pos) < Configuration.attackRadius) targets.targetsList.Add(item);
                }
            }
            targets.attackTimer = timer.Repeat(rateOfFire, (int)(24f / rateOfFire), () => {
                if (entity != null) {
                    float distance = Vector3.Distance(entity.transform.position, targets.endPoint);
                    if (distance < targets.startAttackDistance) {
                        if (distance < targets.endAttackDistance) targets.attackTimer.Destroy();
                        if (distance > targets.endAttackDistance) if (!Configuration.areaTargeting) {
                            if (targets.targetsList.Count > 0 && targets.targetsList[0] != null) {
                                Vector3 targetPos = targets.targetsList[0].transform.position + Vector3.up * 5;
                                SpawnRocket(entity, targetPos, targets.targetsList[0]);
                                targets.targetsList.RemoveAt(0);
                            }
                        }
                        else {
                            Vector3 targetPos = targets.mainTarget + new Vector3(UnityEngine.Random.Range(-Configuration.attackAccuracy, Configuration.attackAccuracy), 5, UnityEngine.Random.Range(-Configuration.attackAccuracy, Configuration.attackAccuracy));
                            SpawnRocket(entity, targetPos, null);
                        }
                    }
                }
            }
            );
            timer.Once(0.01f, () => {
                if (entity != null) {
                    entity.transform.position = new Vector3(spawnPosition.x, entity.transform.position.y, spawnPosition.z);
                    entity.transform.LookAt(new Vector3(pos.x, entity.transform.position.y, pos.z));
                    destination = entity.transform.forward * 9999f;
                    targets.endPoint = new Vector3(pos.x, entity.transform.position.y, pos.z) + entity.transform.forward * 100;
                }
            }
            );
            timer.Once(120, () => {
                if (entity != null) entity.Kill();
            }
            );
        }
        private void SpawnRocket(BaseEntity entity, Vector3 targetPos, BaseEntity target) {
            if (Configuration.useHomingMissiles) {
                Vector3 vel = new Vector3(targetPos.x - entity.transform.position.x, targetPos.y - entity.transform.position.y, targetPos.z - entity.transform.position.z);
                vel = Vector3.Normalize(vel) * 100;
                HomingMissiles?.Call("LaunchHomingMissile", entity.transform.position - entity.transform.forward * 100, targetPos, vel, target);
            }
            else {
                var rocket = GameManager.server.CreateEntity(rocketPrefab, entity.transform.position - entity.transform.forward * 100);
                rocket.Spawn();
                F15Targets tar = entity.GetComponent<F15Targets>();
                rocket.creatorEntity = tar.initiator;
                TimedExplosive explosive = rocket as TimedExplosive;
                Rust.DamageTypeEntry dam = new Rust.DamageTypeEntry();
                dam.type = Rust.DamageType.Hunger;
                dam.amount = 3f;
                explosive.damageTypes.Add(dam);
                F15Rocket rct = rocket.gameObject.AddComponent<F15Rocket>();
                rct.targetPosition = targetPos;
                Vector3 direction = Vector3.Normalize(rct.targetPosition - rocket.transform.position);
                rocket.SendMessage("InitializeVelocity", direction * Configuration.rocketsSpeed);
                rct.rocketTimer = timer.Repeat(1f, 10, () => {
                    if (rocket != null) {
                        if (Vector3.Distance(rocket.transform.position, rct.targetPosition) > Configuration.rocketsSpeed) {
                            direction = Vector3.Normalize(rct.targetPosition - rocket.transform.position);
                            rocket.SendMessage("InitializeVelocity", direction * Configuration.rocketsSpeed);
                        }
                        else {
                            rct.rocketTimer.Destroy();
                        }
                    }
                }
                );
            }
        }
        private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info) {
            if (info.WeaponPrefab != null && info.WeaponPrefab.PrefabName == rocketPrefab && info.damageTypes.Get(Rust.DamageType.Hunger) > 0) {
                info.damageTypes.ScaleAll(Configuration.damageScale);
                if (!Configuration.damageBuildings && entity is DecayEntity) info.damageTypes.ScaleAll(0);
            }
        }
        private object OnPlayerDeath(BasePlayer player, HitInfo info) {
            if (PlayerCheck(player)) playersList.Remove(player);
            return null;
        }
        private bool PlayerCheck(BasePlayer player) {
            return playersList.Contains(player);
        }
        [Command("adminCallF15")]
        private void AdminCallF15(IPlayer iplayer) {
            BasePlayer player = iplayer.Object as BasePlayer;
            if (player != null && player.IsAdmin) {
                Vector3 playerPosition = player.transform.position;
                CallF15AirStrike(playerPosition, player);
                player.ChatMessage("You just called an airstrike to a point with coordinate " + playerPosition.ToString());
            }
        }
        [Command("GiveF15AirStrikeSignal")]
        private void GiveF15AirStrikeSignal(IPlayer iplayer, string command, string[] args) {
            BasePlayer player = iplayer.Object as BasePlayer;
            if (player && !player.IsAdmin) {
                iplayer.Reply("You don't have permission to use this command.");
                return;
            }
            if (args.Length < 1) {
                player?.ChatMessage("Syntax: /GiveAirStrikeSignal <Player or steamID> <number of items>");
                Puts("Syntax: /GiveAirStrikeSignal <Player or steamID> <number of items>");
                return;
            }
            string playerName = args[0].ToLower();
            BasePlayer targetPlayer = BasePlayer.activePlayerList.FirstOrDefault(p => p._name.ToLower().Contains(playerName));
            if (targetPlayer == null) {
                player?.ChatMessage("No such player found");
                Puts("No such player found");
                return;
            }
            int amount = 1;
            if (args.Length > 1) {
                int parsedAmount;
                if (int.TryParse(args[1], out parsedAmount)) {
                    amount = parsedAmount;
                }
            }
            GiveItemToPlayer(targetPlayer, amount);
        }
        private void GiveItemToPlayer(BasePlayer player, int amount) {
            ItemDefinition itemDefinition = ItemManager.FindItemDefinition("supply.signal");
            if (itemDefinition != null) {
                for (int i = 0; i < amount; i++) {
                    Item item = ItemManager.Create(itemDefinition, 1, 2982472774);
                    item.name = "SUPPLY SIGNAL F15";
                    player.GiveItem(item, BaseEntity.GiveItemReason.PickedUp);
                }
            }
        }
    }
}

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