private void ShootAmmo() { var timeSinceLastShot = Time.time - _lastShotTime; if (timeSinceLastShot < fireRate) { return; } _lastShotTime = Time.time; OnShotFired?.Invoke(); SpendAmmo(); Ammo ammo = _ammoPoolManager.PullAmmo(_ammoPool, ammoInitialPositionReference.position, ammoInitialRotationReference.rotation); Vector3 targetVector; if (!ignoreWeaponsDirection) { targetVector = gameObject.transform.forward; } else { targetVector = GetVectorDifference(_hitVectorCalculator.GetHitVector(), ammo.AmmoPosition).normalized; } ammo.FireAmmo(targetVector, ammoActiveTime, ammoVelocityModifier); }
private void ShotFired() { if (transform.parent.TryGetComponent <Player>(out var player)) { OnShotFired?.Invoke(player.transform.position, soundDistance); } }
public void HandleTriggerHeld() { if (_activeConfig.isAutomatic) { int bulletsFired = 0; int bulletsHit = 0; if (TryShoot(out bulletsFired, out bulletsHit)) { OnShotFired?.Invoke(new ShotInfo(bulletsFired, bulletsHit)); IncreaseDispersionRate(); ShowBulletTrails(); } } }
private void AddDebugCalls() { OnShotFired.AddListener(() => { Debug.Log("Shot fired detected in " + transform.parent.parent.name); }); OnEnemyDamage.AddListener(() => { Debug.Log("Enemy damaged detected in " + transform.parent.parent.name); }); OnPlayerEnter.AddListener(() => { Debug.Log("Player entered " + GetComponentInParent <Room>().name); }); OnPlayerExit.AddListener(() => { Debug.Log("Player exited " + GetComponentInParent <Room>().name); }); }
public void HandleTriggerPull() { int bulletsFired = 0; int bulletsHit = 0; if (TryShoot(out bulletsFired, out bulletsHit)) { OnShotFired?.Invoke(new ShotInfo(bulletsFired, bulletsHit)); if (_activeConfig.isAutomatic) { IncreaseDispersionRate(); } else { StartCoroutine(SimulateRecoilDispersionRoutine(_activeWeaponState, simulateRecoil: true)); } ShowBulletTrails(); } }
private void Awake() { AddDebugCalls(); EnemyBase[] enemies = GetComponentsInChildren <EnemyBase>(true); foreach (EnemyBase enemy in enemies) { // When hyperseed is grabbed - all enemies turn aggressive GrabHyperseed.AddListener(() => { if (enemy) { enemy.TurnAggressiveHyperseed.Invoke(); } }); // Testing - all enemies turn aggressive TurnGroupAggressive.AddListener(() => { if (enemy) { enemy.TurnAggressive.Invoke(); } }); // Testing - all enemies turn passive TurnGroupPassive.AddListener(() => { if (enemy) { enemy.ForceIdle(); } }); // Aggro when enemy is damaged OnEnemyDamage.AddListener(() => { if (enemy) { enemy.TurnAggressive.Invoke(); } }); // Stop/resume aggro when player exits/enters a room OnPlayerExit.AddListener(() => { if (enemy) { enemy.ForceIdle(); } }); OnPlayerEnter.AddListener(() => { if (enemy) { enemy.ResetEnemy(); } }); } // Brawlers all aggro when an attack/ability is used in the room enemies = GetComponentsInChildren <Brawler>(true); foreach (Brawler enemy in enemies) { OnShotFired.AddListener(() => { if (enemy) { enemy.TurnAggressive.Invoke(); } }); } // Remove listeners after events are called to prevent chain-calling // Once enemies turn aggressive they stay that way for ever, so no need for re-calling anyways GrabHyperseed.AddListener(() => { OnEnemyDamage.RemoveAllListeners(); OnShotFired.RemoveAllListeners(); OnPlayerEnter.RemoveAllListeners(); OnPlayerExit.RemoveAllListeners(); }); OnEnemyDamage.AddListener(() => { OnEnemyDamage.RemoveAllListeners(); }); OnShotFired.AddListener(() => { OnShotFired.RemoveAllListeners(); }); }