using System; using System.Collections; using Ability; using Ai; using Equip; using UnityEngine; namespace Player { public class ShootingManager : MonoBehaviour { [SerializeField] private GameObject[] _originalShoota; [SerializeField] private GameObject[] _additinalShoota; [SerializeField] private GameObject _sideShoota; [SerializeField] private Shooting[] _allShotas; [SerializeField] private Bullet _ricochetBullet; [SerializeField] private float _reloadTime; [SerializeField] private float _animationOffset; [SerializeField] private MainCharacter _character; [SerializeField] private GameObject _shootFx; [SerializeField] private Transform _FXrotatingTransform; [SerializeField] private Vector3 _shootFxOffset; private float _reload; private float _currentTime; private bool _shoota; private GameObject _currentShoota; private GameObject _additionalCurrentShoota; public event Action ShootEvent; private void Start() { _currentTime = _reload = _reloadTime; } private void FixedUpdate() { if (_shoota || ( _character && _character.IsDead ) || _character && _character.GetState() != CharacterState.DEFAULT || GlobalsVar.gBoard != null && GlobalsVar.gBoard.DialogsCount > 0 || AiController.Instance.TargetingEnemies.Count <= 0) return; _currentTime -= Time.fixedDeltaTime; if (_currentTime <= 0) { ShootPermamently(); } } public void ShootPermamently() { if (_shoota || ( _character && _character.IsDead ) || _character && _character.GetState() != CharacterState.DEFAULT || GlobalsVar.gBoard != null && GlobalsVar.gBoard.DialogsCount > 0 || AiController.Instance.TargetingEnemies.Count <= 0) return; StopCoroutine(ShootCoroutine()); StartCoroutine(ShootCoroutine()); } private IEnumerator ShootCoroutine() { if (ShootEvent != null) ShootEvent(); _shoota = true; yield return new WaitForSeconds(0.2f); yield return new WaitForSeconds(_animationOffset); if (_shootFx != null) { var fx = Instantiate(_shootFx); fx.transform.position = _FXrotatingTransform.transform.position + _shootFxOffset; fx.transform.rotation = Quaternion.Euler(0, _FXrotatingTransform.transform.rotation.eulerAngles.y, 0); } if ((_character && _character.IsDead) || _character && _character.GetState() != CharacterState.DEFAULT || GlobalsVar.gBoard != null && GlobalsVar.gBoard.DialogsCount > 0 || AiController.Instance.TargetingEnemies.Count <= 0) { _currentTime = _reload; _shoota = false; yield break; } foreach (var shoota in _allShotas) { if (!shoota.isActiveAndEnabled) continue; shoota.Shoot(); } _shoota = false; _currentTime = _reload; } private void OnValidate() { if (_FXrotatingTransform == null) _FXrotatingTransform = transform; } private void AddSpeed(float value) { _reload -= value; } public void AddAbility(InGameAbType type, float value) { switch (type) { case InGameAbType.ADD_BULLET_AFTER: foreach (var shoota in _allShotas) { shoota.Row++; } break; case InGameAbType.ADD_BULLET_45: _sideShoota.SetActive(true); break; case InGameAbType.ADD_BULLET_PARALLEL: _additionalCurrentShoota.SetActive(true); _currentShoota.SetActive(false); break; case InGameAbType.ADD_BULLET_RICOCHET: foreach (var shoota in _allShotas) { shoota.Bullet = _ricochetBullet; } break; case InGameAbType.ADD_MINOR_SPEED: case InGameAbType.ADD_ATTACK_SPEED: AddSpeed(value); break; case InGameAbType.ADD_MINOR_DAMAGE: case InGameAbType.ADD_DAMAGE: foreach (var shoota in _allShotas) { shoota.AddDamage(value); } break; case InGameAbType.ADD_HEADSHOT: foreach (var shoota in _allShotas) { shoota.AddCritChance(value); } break; } } public void AddMainAbility(MainAbilityType type, float value) { switch (type) { case MainAbilityType.ADD_ATTACK_SPEED: foreach (var shoota in _allShotas) { float val = value / 100f; AddSpeed(val); } break; case MainAbilityType.ADD_DAMAGE: foreach (var shoota in _allShotas) { shoota.AddDamage(value); } break; } } public void ApplyEquip(EquipItem item) { if (item.AddDamage > 0) { foreach(var shoota in _allShotas) shoota.AddDamage(item.AddDamage); } if (item.AddSpeed > 0) { _reloadTime = _reloadTime * item.AddSpeed; } if (item.AddCrit > 0) { foreach (var shoota in _allShotas) shoota.AddCritChance(item.AddCrit); } if (item.DamageMult > 0) { foreach (var shoota in _allShotas) shoota.SetMult(item.DamageMult); } } public void SetShoota(int p0) { if (_currentShoota != null) _currentShoota.SetActive(false); _currentShoota = _originalShoota[p0]; _additionalCurrentShoota = _additinalShoota[p0]; _currentShoota.SetActive(true); } } }