Exemple #1
0
        public Task Takeover(Func <Task> movementTakeover)
        {
            if (MovementTakeover != null)
            {
                throw new ArgumentException("Movement has already been taken over");
            }
            TaskCompletionSource <bool> d = new TaskCompletionSource <bool>();

            OnTakeover.Fire(d.Task.ToLifetime());
            MovementTakeover = async() =>
            {
                await movementTakeover();

                MovementTakeover = null;
                d.SetResult(true);
            };
            return(d.Task);
        }
Exemple #2
0
    void HandleNewControlledObject()
    {
        // So many try-catches ;)
        try
        {
            lastControlled.GetComponent <IDamageable>().OnHealthChanged -= HandleHealthChange;
            lastControlled.GetComponent <CharacterMotor>().TakenOver();
        }
        catch (Exception e)
        {
            Debug.LogWarning("Could not unsubscribe OnHealthChange from last controlled object. Ignore if this is the first controller.");
        }

        try
        {
            GetControlledIDamagable().OnHealthChanged += HandleHealthChange;
            OnHealthChange?.Invoke(GetControlledIDamagable());
        }
        catch (NullReferenceException e)
        {
            Debug.LogWarning($"Could not subscribe to OnHealthChanged for currently controlled object as {controlledObject.name} does not have an IDamagable interface.");
        }

        try
        {
            currentCharacterMotor = controlledObject.GetComponent <CharacterMotor>();
            AbilityController     = controlledObject.GetComponent <AbilityController>();
            currentCharacterMotor.TakenOver();
        }
        catch (Exception e)
        {
            Debug.LogWarning("No character motor or ability controller found on controlled object.");
        }

        lastControlled = controlledObject;

        try
        {
            if (currentWeapon != null)
            {
                currentWeapon.IsPlayer = false;
            }

            currentWeapon          = controlledObject.GetComponentInChildren <Weapon>();
            currentWeapon.IsPlayer = true;
            OnWeaponChanged?.Invoke(currentWeapon);

            if (!currentCharacterMotor.previouslyControlled && PerkController.CanUse("jugg"))
            {
                var enemyComp = currentCharacterMotor.GetComponent <Enemy>();
                enemyComp.Health = enemyComp.MaxHealth;
                OnHealthChange?.Invoke(GetControlledIDamagable());
            }

            OnTakeover?.Invoke();
        }
        catch (Exception e)
        {
            Debug.LogWarning("No weapon found on controlled object.");
        }

        jumpController.SetCurrentControlledEnemy(controlledObject);
    }