Пример #1
0
    public bool use(CRAbility ability, CRController target)
    {
        if (ability.targetType == CRAbilityTargetType.SELF)
        {
            target = _controller;
        }

        _target = target;
        _ability = ability;

        if (!ability)
            return false;

        if (!_gcd.IsDone()) {
            _ability = null;
            return false;
        }

        if (ability.onCooldown()) {
            NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "Ability not ready yet.", 0);
            _ability = null;
            return false;
        }

        if (!_controller.creature.conditionManager.canCast())
        {
            NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "You are silenced.", 0);
            _ability = null;
            return false;
        }

        CRResource resource = _controller.creature.attributeManager.GetResource(ability.resourceType);

        if (!resource || resource.currentValue < _ability.cost)
        {
            NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "Not enough " + _ability.resourceType.ToString().ToLower() + ".", 0);
            _ability = null;
            return false;
        }

        if (_ability.requiresTarget() && _ability.targetType != CRAbilityTargetType.ALL)
        {
            int reputation = _controller.creature.faction.GetReputation(_target.creature.faction.type);

            if (_ability.targetType == CRAbilityTargetType.HOSTILE)
            {
                if (_controller == _target)
                {
                    NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "You must target an enemy for that.", 0);
                    _ability = null;
                    return false;
                }

                if (reputation != CRFaction.HATED)
                {
                    NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "You must target an enemy for that.", 0);
                    _ability = null;
                    return false;
                }
            }
            else
            {
                if (reputation != CRFaction.FRIENDLY)
                {
                    NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "You must target a friend for that.", 0);
                    _ability = null;
                    return false;
                }
            }
        }

        if (_ability.requiresTarget())
        {
            if (Vector3.Distance(transform.position, target.transform.position) > (GetComponent<NavMeshAgent>().radius +  _target.GetComponent<NavMeshAgent>().radius) + 2.0f + ability.range)
            {
                _pathing = true;
                //NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "Out of range.", 0);
                //_ability = null;
                return true;
            }

            if (target.creature.isDead())
            {
                NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "Target is dead.", 0);

                cancel();
                return false;
            }
        }

        CRAbilityRequirement[] requirements = (CRAbilityRequirement[])ability.GetComponentsInChildren<CRAbilityRequirement>();

        foreach (CRAbilityRequirement requirement in requirements)
        {
            if (!requirement.satisfied(_controller, _target))
            {
                if (_controller.creature.conditionManager.hasCondition(CRConditionType.STEALTHED))
                    _controller.stop();

                cancel();
                return false;
            }
        }

        start();
        return true;
    }