示例#1
0
    /// <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);
    }
示例#2
0
    private void RemoveDeadCharacter(DeathParameters deathParameters)
    {
        var facade = LivingPlayers.Find(player => player.Id == deathParameters.characterInfo.Id);

        if (facade != null)
        {
            facade.OnDeath -= RemoveDeadCharacter;
            Remove(facade);
        }
    }
示例#3
0
 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();
    }