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; }