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();
}
}
}