Пример #1
0
    public override void use(CRController source, CRAbility ability, CRController target)
    {
        _source = source;
        _target = target;

        _ability = ability;
    }
Пример #2
0
    public void cancel()
    {
        if (Network.isServer)
            networkView.RPC("NetworkCancel", RPCMode.Others);

        _ability = null;
    }
Пример #3
0
    public override void use(CRController source, CRAbility ability, CRController target)
    {
        _source = source;
        _target = target;

        _ability = ability;

        transform.parent = _source.transform;
    }
Пример #4
0
    public static void Cast(CRController source, CRAbility ability, CRController target)
    {
        GameObject go = GameObject.Instantiate(ability.action) as GameObject;

        go.transform.parent = target.transform;
        go.transform.localPosition = Vector3.zero;

        if (Network.isServer)
        {
            CRCombatAction[] actions = (CRCombatAction[])go.GetComponentsInChildren<CRCombatAction>();

            foreach (CRCombatAction action in actions)
            {
                ResloveCombatAction(source, action, target);
            }
        }
    }
Пример #5
0
 public override void use(CRController source, CRAbility ability, CRController target)
 {
     CRCombatManager.Cast(source, ability, target);
     Destroy(gameObject);
 }
Пример #6
0
 public void SetAbility(int index, CRAbility ability)
 {
     abilities[index].ability = ability;
 }
Пример #7
0
 public abstract void use(CRController source, CRAbility ability, CRController target);
Пример #8
0
    public void Update()
    {
        if (_ability)
        {
            if (_pathing)
            {
                if (Vector3.Distance(transform.position, _target.transform.position) >
                (GetComponent<NavMeshAgent>().radius +  _target.GetComponent<NavMeshAgent>().radius) + 1.0f + _ability.range)
                {
                    return;
                }
                else
                {
                    use (_ability, _target);
                    return;
                }
            }

            if (!_controller.creature.conditionManager.canCast())
            {
                _ability = null;
                _target = null;
            }
            else if (_cast.IsDone())
            {
                if (Network.isServer)
                {
                    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);

                        cancel();
                        return;
                    }

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

                            cancel();
                            return;
                        }

                        if (Vector3.Distance(transform.position, target.transform.position) > (GetComponent<NavMeshAgent>().radius +  _target.GetComponent<NavMeshAgent>().radius) + 1.0f + _ability.range * 1.1f)
                        {
                            NetworkChat.instance.send(_controller.GetComponent<CRControllerBinding>().owner, "Out of range.", 0);

                            cancel();
                            return;
                        }
                    }

                    resource.Consume(_ability.cost);

                    _ability.triggerCooldown();

                    if (_ability.type == CRAbilityType.PBAOE)
                    {
                        List<CRController> targets = GetTargetsInRadius(transform.position, _ability.range, _ability.targetType);

                        foreach (CRController target in targets)
                        {
                            CreateBridge(_controller, _ability, target);
                        }
                    }
                    else
                    {
                        CreateBridge(_controller, _ability, _target);
                    }
                }

                _ability = null;
                _target = null;
            }
        }
    }
Пример #9
0
 void NetworkInstantiateAction(int index, NetworkViewID target)
 {
     _ability = GetComponentInChildren<CRAbilityManager>().GetAbility(index);
     _ability.triggerCooldown();
     GameObject go = Instantiate (_ability.bridge, transform.position, Quaternion.identity) as GameObject;
     go.GetComponent<CRAbilityBridge>().use(_controller, _ability, NetworkView.Find(target).GetComponent<CRController>());
 }
Пример #10
0
 void NetworkCast(int index)
 {
     _ability = GetComponentInChildren<CRAbilityManager>().GetAbility(index);
     start();
 }
Пример #11
0
    void NetworkCancel()
    {
        Debug.Log ("cancel");
        _ability = null;

        //remove particles if needed
    }
Пример #12
0
    private void CreateBridge(CRController source, CRAbility ability, CRController target)
    {
        GameObject go = Instantiate (ability.bridge, transform.position, Quaternion.identity) as GameObject;
        go.GetComponent<CRAbilityBridge>().use(source, ability, target);

        networkView.RPC ("NetworkInstantiateAction", RPCMode.Others, ability.id, target.networkView.viewID);
    }
Пример #13
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;
    }
Пример #14
0
 public CRUseAbility(CRAbilityBehaviour behaviour, CRAbility ability, CRController target)
 {
     _behaviour = behaviour;
     _ability = ability;
     _target = target;
 }