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

FREE RocketBarrage : 1.1.0 1.1.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using Oxide.Core;
using Oxide.Core.Plugins;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("RocketBarrage", "Avalon#3216", "1.1.0")]
    [Description("Allows players to shoot rockets with a chat command.")]
    public class RocketBarrage : RustPlugin
    {
        private const string RocketPrefabPath = "assets/prefabs/ammo/rocket/rocket_basic.prefab";
        private const string IncendiaryRocketPrefabPath = "assets/prefabs/ammo/rocket/rocket_fire.prefab";
        private const string HighVelocityRocketPrefabPath = "assets/prefabs/ammo/rocket/rocket_hv.prefab";
        private const float RocketDelay = 0.5f; // Delay in seconds between each rocket shot

        private HashSet<ulong> rocketCounters = new HashSet<ulong>();
        private Dictionary<ulong, float> rocketDelays = new Dictionary<ulong, float>();
        private Dictionary<ulong, string> rocketTypes = new Dictionary<ulong, string>();

        private const string PermissionRocketBarrage = "rocketbarrage.use";
        private const string CommandBarrage = "Barrage";
        private const string CommandSetRocketDelay = "rbt";
        private const string CommandSelectRocket = "rocket";
        private const string CommandCancelBarrage = "rbc";

        private void Init()
        {
            permission.RegisterPermission(PermissionRocketBarrage, this);
        }

        [ChatCommand(CommandBarrage)]
        private void ChatCommandShootRockets(BasePlayer player, string command, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, PermissionRocketBarrage))
            {
                SendReply(player, "You don't have permission to use this command.");
                return;
            }

            if (args.Length == 0)
            {
                SendReply(player, "Usage: /Barrage <quantity>");
                return;
            }

            int quantity;
            if (!int.TryParse(args[0], out quantity) || quantity <= 0)
            {
                SendReply(player, "Invalid quantity.Please enter a positive number.");
                return;
            }

            if (rocketCounters.Contains(player.userID))
            {
                SendReply(player, "You are already shooting rockets.Wait for the current rockets to finish or use /rbc to cancel.");
                return;
            }

            rocketCounters.Add(player.userID);
            NextRocket(player, quantity);

            SendReply(player, "<color=red>Rocket Barrage <color=white>Initiated...</color>");
        }

        [ChatCommand(CommandSetRocketDelay)]
        private void ChatCommandSetRocketDelay(BasePlayer player, string command, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, PermissionRocketBarrage))
            {
                SendReply(player, "You don't have permission to use this command.");
                return;
            }

            if (args.Length == 0)
            {
                SendReply(player, "Usage: /rbt <level>");
                return;
            }

            float delayLevel;
            if (!float.TryParse(args[0], out delayLevel) || delayLevel < 1f || delayLevel > 5f)
            {
                SendReply(player, "Invalid delay level.Please enter a number between 1 and 5.");
                return;
            }

            float delay = delayLevel * 0.1f;
            rocketDelays[player.userID] = delay;

            SendReply(player, $"<color=white>Rocket delay set to <color=red>{delayLevel}</color> seconds...</color>");
        }

        [ChatCommand(CommandSelectRocket)]
        private void ChatCommandSelectRocket(BasePlayer player, string command, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, PermissionRocketBarrage))
            {
                SendReply(player, "You don't have permission to use this command.");
                return;
            }

            if (args.Length == 0)
            {
                SendReply(player, "Usage: /rocket <type>");
                return;
            }

            string rocketType = args[0].ToLower();
            string prefabPath = GetRocketPrefabPath(rocketType);
            if (prefabPath == null)
            {
                SendReply(player, "Invalid rocket type.Available types: rocket, incin, hv");
                return;
            }

            rocketTypes[player.userID] = rocketType;

            SendReply(player, $"<color=white>Rocket type set to <color=red>{rocketType}</color>.</color>");
        }

        [ChatCommand(CommandCancelBarrage)]
        private void ChatCommandCancelBarrage(BasePlayer player, string command, string[] args)
        {
            if (!permission.UserHasPermission(player.UserIDString, PermissionRocketBarrage))
            {
                SendReply(player, "You don't have permission to use this command.");
                return;
            }

            if (!rocketCounters.Contains(player.userID))
            {
                SendReply(player, "There is no active rocket barrage to cancel.");
                return;
            }

            rocketCounters.Remove(player.userID);
            rocketDelays.Remove(player.userID);
            rocketTypes.Remove(player.userID);

            SendReply(player, "<color=red>Rocket Barrage <color=white>Cancelled.</color>");
        }

        private string GetRocketPrefabPath(string rocketType)
        {
            switch (rocketType)
            {
                case "rocket":
                    return RocketPrefabPath;
                case "incin":
                    return IncendiaryRocketPrefabPath;
                case "hv":
                    return HighVelocityRocketPrefabPath;
                default:
                    return null;
            }
        }

        private void NextRocket(BasePlayer player, int remainingRockets)
        {
            if (!rocketCounters.Contains(player.userID))
                return;

            ShootRocket(player);
            remainingRockets--;

            if (remainingRockets <= 0)
            {
                rocketCounters.Remove(player.userID);
                rocketDelays.Remove(player.userID);
                rocketTypes.Remove(player.userID);
                return;
            }

            rocketCounters.Add(player.userID);
            float delay = GetRocketDelay(player);
            timer.Once(delay, () => NextRocket(player, remainingRockets));
        }

        private void ShootRocket(BasePlayer player)
        {
            string rocketType = GetPlayerRocketType(player);
            string prefabPath = GetRocketPrefabPath(rocketType);

            var rocket = GameManager.server.CreateEntity(prefabPath, player.eyes.position, Quaternion.LookRotation(player.eyes.HeadForward()));
            if (rocket != null)
            {
                rocket.Spawn();
                var projectile = rocket.GetComponent<ServerProjectile>();
                if (projectile != null)
                {
                    projectile.InitializeVelocity(player.eyes.HeadForward() * projectile.speed);
                }
            }
        }

        private float GetRocketDelay(BasePlayer player)
        {
            float delay;
            if (rocketDelays.TryGetValue(player.userID, out delay))
                return delay;
            else
                return RocketDelay;
        }

        private string GetPlayerRocketType(BasePlayer player)
        {
            string rocketType;
            if (rocketTypes.TryGetValue(player.userID, out rocketType))
                return rocketType;
            else
                return "rocket"; // Default rocket type if not found
        }
    }
}

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