108 lines
3.1 KiB
C#
108 lines
3.1 KiB
C#
using Sandbox;
|
|
using Sasalka;
|
|
|
|
namespace Sandbox.Weapons;
|
|
|
|
/// <summary>
|
|
/// Конкретная реализация пистолета
|
|
/// Наследуется от BaseWeapon и может переопределять специфичное поведение
|
|
/// </summary>
|
|
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();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Переопределяем эффекты выстрела для пистолета
|
|
/// </summary>
|
|
protected override void PlayShootEffects()
|
|
{
|
|
base.PlayShootEffects();
|
|
|
|
// Добавляем отдачу
|
|
AddRecoil();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Добавление отдачи
|
|
/// </summary>
|
|
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));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Восстановление отдачи
|
|
/// </summary>
|
|
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));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Переопределяем трассировку для пистолета (можно добавить специфичную логику)
|
|
/// </summary>
|
|
protected override void PerformBulletTrace(WeaponItemDefinition weaponDef)
|
|
{
|
|
base.PerformBulletTrace(weaponDef);
|
|
|
|
// Дополнительная логика для пистолета может быть добавлена здесь
|
|
}
|
|
|
|
/// <summary>
|
|
/// Переопределяем эффекты перезарядки для пистолета
|
|
/// </summary>
|
|
protected override void PlayReloadEffects()
|
|
{
|
|
base.PlayReloadEffects();
|
|
|
|
// Специфичные эффекты перезарядки пистолета
|
|
// Например, звук перезарядки пистолета
|
|
}
|
|
} |