using System; using System.Collections.Generic; using UnityEngine; [Serializable] public class TargetPriority { public List mustHaveTags = new List(); public List mayNotHaveTags = new List(); public float range; private List allTaggedObjects = new List(); private TagManager tagManager; public TaggedObject FindClosestTaggedObject(Vector3 _position) { TaggedObject taggedObject = TagManager.instance.FindClosestTaggedObjectWithTags(_position, mustHaveTags, mayNotHaveTags); if (taggedObject == null) { return null; } float num = ((!(taggedObject.colliderForBigOjectsToMeasureDistance != null)) ? (taggedObject.transform.position - _position).magnitude : (taggedObject.colliderForBigOjectsToMeasureDistance.ClosestPoint(_position) - _position).magnitude); if (num <= range) { return taggedObject; } return null; } public TaggedObject FindHighestHealthObjectInRange(Vector3 _position) { tagManager = TagManager.instance; allTaggedObjects.Clear(); tagManager.FindAllTaggedObjectsWithTags(allTaggedObjects, mustHaveTags, mayNotHaveTags); TaggedObject result = null; float num = 0f; for (int i = 0; i < allTaggedObjects.Count; i++) { if (!(tagManager.MeasureDistanceToTaggedObject(allTaggedObjects[i], _position) > range)) { Hp hp = allTaggedObjects[i].Hp; if (hp.HpValue > num) { num = hp.HpValue; result = allTaggedObjects[i]; } } } return result; } public TaggedObject FindLowestHealthObjectInRange(Vector3 _position, bool _excludeFullHealthTargets = true) { tagManager = TagManager.instance; allTaggedObjects.Clear(); tagManager.FindAllTaggedObjectsWithTags(allTaggedObjects, mustHaveTags, mayNotHaveTags); TaggedObject result = null; float num = 100f; for (int i = 0; i < allTaggedObjects.Count; i++) { if (!(tagManager.MeasureDistanceToTaggedObject(allTaggedObjects[i], _position) > range)) { Hp hp = allTaggedObjects[i].Hp; if ((!_excludeFullHealthTargets || !(hp.HpPercentage >= 1f)) && hp.HpPercentage < num) { num = hp.HpPercentage; result = allTaggedObjects[i]; } } } return result; } public TaggedObject FindTaggedObject(Vector3 _position, out Vector3 _outPosition) { _outPosition = Vector3.zero; TaggedObject taggedObject = TagManager.instance.FindClosestTaggedObjectWithTags(_position, mustHaveTags, mayNotHaveTags); if (taggedObject == null) { return null; } float magnitude; if (taggedObject.colliderForBigOjectsToMeasureDistance != null) { _outPosition = taggedObject.colliderForBigOjectsToMeasureDistance.ClosestPoint(_position); magnitude = (_outPosition - _position).magnitude; } else { _outPosition = taggedObject.transform.position; magnitude = (_outPosition - _position).magnitude; } if (magnitude <= range) { return taggedObject; } return null; } public TaggedObject FindTaggedObjectCloseToHome(Vector3 _position, Vector3 _home, float _homeRange, out Vector3 _outPosition) { _outPosition = Vector3.zero; TaggedObject taggedObject = TagManager.instance.FindClosestTaggedObjectWithTags(_position, mustHaveTags, mayNotHaveTags); if (taggedObject == null) { return null; } if (taggedObject.colliderForBigOjectsToMeasureDistance != null) { _outPosition = taggedObject.colliderForBigOjectsToMeasureDistance.ClosestPoint(_position); } else { _outPosition = taggedObject.transform.position; } float magnitude = (_outPosition - _position).magnitude; float magnitude2 = (_outPosition - _home).magnitude; if (magnitude <= range || magnitude2 <= _homeRange) { return taggedObject; } return null; } }