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(); // Специфичные эффекты перезарядки пистолета // Например, звук перезарядки пистолета } }