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

FREE RocketWeapons : 1.2.0 1.2.0

Нет прав для скачивания
C#:
using System.Collections.Generic;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Rocket Weapons", "YourName", "1.2.0")]
    [Description("Позволяет стрелять ракетами. Дробовики и Еока стреляют залпом. Защищено правами.")]
    class RocketWeapons : RustPlugin
    {
        private readonly HashSet<ulong> _activePlayers = new HashSet<ulong>();
        private const string RocketPrefab = "assets/prefabs/ammo/rocket/rocket_basic.prefab";
        
        // Название права для Oxide
        private const string UsePermission = "rocketweapons.use";

        // Инициализация плагина и регистрация пермишена
        private void Init()
        {
            permission.RegisterPermission(UsePermission, this);
        }

        [ChatCommand("rfire")]
        private void CmdRocketFire(BasePlayer player, string command, string[] args)
        {
            // Проверка: либо у игрока есть пермишен, либо он авторизованный админ/модератор
            if (!player.IsAdmin && !permission.UserHasPermission(player.UserIDString, UsePermission))
            {
                SendReply(player, "<color=#ff3333>У вас нет прав для использования этой команды.</color>");
                return;
            }

            if (_activePlayers.Contains(player.userID))
            {
                _activePlayers.Remove(player.userID);
                SendReply(player, "<color=#ff3333>Ракетный режим выключен.</color>");
            }
            else
            {
                _activePlayers.Add(player.userID);
                SendReply(player, "<color=#33ff33>Ракетный режим включен!</color>");
            }
        }

        private void OnWeaponFired(BaseProjectile weapon, BasePlayer player)
        {
            if (player == null || !_activePlayers.Contains(player.userID))
                return;

            int rocketCount = 1;
            float spread = 0f;
            string shortName = weapon?.ShortPrefabName ?? "";

            if (shortName.Contains("eoka"))
            {
                rocketCount = 10;
                spread = 0.12f; 
            }
            else if (shortName.Contains("shotgun"))
            {
                rocketCount = 8;
                spread = 0.06f;
            }

            // Спавним ракеты чуть дальше от лица, чтобы они летели корректно
            Vector3 basePosition = player.eyes.position + (player.eyes.HeadForward() * 2.5f);
            Vector3 baseDirection = player.eyes.HeadForward();

            for (int i = 0; i < rocketCount; i++)
            {
                Vector3 finalDirection = baseDirection;

                if (spread > 0f)
                {
                    finalDirection.x += Random.Range(-spread, spread);
                    finalDirection.y += Random.Range(-spread, spread);
                    finalDirection.z += Random.Range(-spread, spread);
                    finalDirection.Normalize();
                }

                // Создаем ракету с правильным вращением в сторону полета
                BaseEntity rocket = GameManager.server.CreateEntity(RocketPrefab, basePosition, Quaternion.LookRotation(finalDirection));
                if (rocket == null) continue;

                rocket.OwnerID = player.userID;
                rocket.Spawn();

                // Фикс полета: работаем напрямую с компонентом ServerProjectile
                ServerProjectile projectile = rocket.GetComponent<ServerProjectile>();
                if (projectile != null)
                {
                    projectile.InitializeVelocity(finalDirection * 35f);
                }
                else
                {
                    // Резервный метод, если ServerProjectile не подтянулся — пинаем Rigidbody жестким импульсом
                    Rigidbody rb = rocket.GetComponent<Rigidbody>();
                    if (rb != null)
                    {
                        rb.isKinematic = false;
                        rb.useGravity = true; // Ракета должна иметь гравитацию, но лететь вперед за счет скорости
                        rb.velocity = finalDirection * 35f;
                        rb.AddForce(finalDirection * 35f, ForceMode.VelocityChange);
                    }
                }
            }
        }

        private void Unload()
        {
            _activePlayers.Clear();
        }
    }
}

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