using Sandbox;
using Sasalka;
namespace Sandbox.Weapons;
///
/// Конкретная реализация пистолета
/// Наследуется от BaseWeapon и может переопределять специфичное поведение
///
public sealed class Pistol : BaseWeapon
{
[Property] public float RecoilForce { get; set; } = 5f;
[Property] public float RecoilRecoverySpeed { get; set; } = 2f;
private Vector3 _currentRecoil;
private Vector3 _targetRecoil;
protected override void OnStart()
{
base.OnStart();
// Специфичная инициализация для пистолета
_currentRecoil = Vector3.Zero;
_targetRecoil = Vector3.Zero;
}
protected override void OnUpdate()
{
base.OnUpdate();
// Восстановление отдачи
if (!IsReloading && Equipped)
{
RecoverRecoil();
}
}
///
/// Переопределяем эффекты выстрела для пистолета
///
protected override void PlayShootEffects()
{
base.PlayShootEffects();
// Добавляем отдачу
AddRecoil();
}
///
/// Добавление отдачи
///
private void AddRecoil()
{
var weaponDef = GetWeaponDefinition();
if (weaponDef == null) return;
// Вертикальная отдача
_targetRecoil += Vector3.Up * RecoilForce;
// Горизонтальная отдача (случайная)
_targetRecoil += Vector3.Random * RecoilForce * 0.3f;
// Применяем отдачу к камере
if (Dedugan.Local?.Camera != null)
{
var camera = Dedugan.Local.Camera;
camera.LocalRotation *= Rotation.From(new Angles(_targetRecoil.x, _targetRecoil.y, _targetRecoil.z));
}
}
///
/// Восстановление отдачи
///
private void RecoverRecoil()
{
if (_targetRecoil.Length < 0.1f) return;
_targetRecoil = Vector3.Lerp(_targetRecoil, Vector3.Zero, Time.Delta * RecoilRecoverySpeed);
// Применяем восстановление к камере
if (Dedugan.Local?.Camera != null)
{
var camera = Dedugan.Local.Camera;
camera.LocalRotation *= Rotation.From(new Angles(-_targetRecoil.x * Time.Delta * RecoilRecoverySpeed, -_targetRecoil.y * Time.Delta * RecoilRecoverySpeed, -_targetRecoil.z * Time.Delta * RecoilRecoverySpeed));
}
}
///
/// Переопределяем трассировку для пистолета (можно добавить специфичную логику)
///
protected override void PerformBulletTrace(WeaponItemDefinition weaponDef)
{
base.PerformBulletTrace(weaponDef);
// Дополнительная логика для пистолета может быть добавлена здесь
}
///
/// Переопределяем эффекты перезарядки для пистолета
///
protected override void PlayReloadEffects()
{
base.PlayReloadEffects();
// Специфичные эффекты перезарядки пистолета
// Например, звук перезарядки пистолета
}
}