/// <summary> /// Deals damage and returns damage actually dealt /// </summary> /// <param name="amount"></param> /// <returns></returns> public float TakeDamage(float amount) { var healthAfter = Mathf.Clamp(_health.Health - amount, 0.0f, _health.MaxHealth); var dmgDealt = _health.Health - healthAfter; if (_info.IsLocal) { if (_damageManager.NegateDamage == false) { _health.Health = healthAfter; } OnDamageTaken?.Invoke(new DamageTakenArgs(dmgDealt, _health.Health)); if (_health.Health <= 0.0f) { DeathParameters deathParameters = new DeathParameters(); deathParameters.characterInfo = _info; OnDeath?.Invoke(deathParameters); } } else { SendMessage(amount); //we use {amount} instead of {dmgDealt} because HP may not be up to date on the client } return(dmgDealt); }
private void RemoveDeadCharacter(DeathParameters deathParameters) { var facade = LivingPlayers.Find(player => player.Id == deathParameters.characterInfo.Id); if (facade != null) { facade.OnDeath -= RemoveDeadCharacter; Remove(facade); } }
private void SendRequest(DeathParameters deathParameters) { using (var writer = DarkRiftWriter.Create()) { writer.Write(_info.Id); using (var msg = Message.Create(Tags.DeathRequest, writer)) { _client.SendMessage(msg, SendMode.Reliable); } } }
/// <summary> /// Remove local enemies and /// </summary> /// <param name="deathParameters"></param> private void OnAIDeath(DeathParameters deathParameters) { CharacterFacade facade = _aliveEnemies.Find(enemy => enemy.Id == deathParameters.characterInfo.Id); //Unsubsribe event if (facade == null) { Debug.Log("Facade is null"); } facade.OnDeath -= OnAIDeath; _aliveEnemies.Remove(facade); //AllEnemiesDead?.Invoke(); CheckWaveEnded(); }