private void RemoveSanctuaryTargets() { if (Sanctuary.ProtectedTargets == null) { return; } List <GameObject> protected_melee_actors = AvailableMeleeTargets .Where(target => target.GetComponent <Actor>() != null && Sanctuary.ProtectedTargets.ContainsKey(target.GetComponent <Actor>()) && !Me.Actions.Decider.Threat.Threats.ContainsKey(target.GetComponent <Actor>())) .ToList(); List <GameObject> protected_ranged_actors = AvailableRangedTargets .Where(target => target.GetComponent <Actor>() != null && Sanctuary.ProtectedTargets.ContainsKey(target.GetComponent <Actor>()) && !Me.Actions.Decider.Threat.Threats.ContainsKey(target.GetComponent <Actor>())) .ToList(); foreach (var target in protected_melee_actors) { if (!Me.Actions.SavingThrow(Proficiencies.Attribute.Wisdom, Sanctuary.ProtectedTargets[target.GetComponent <Actor>()].ChallengeRating)) { AvailableMeleeTargets.Remove(target); } } foreach (var target in protected_ranged_actors) { if (!Me.Actions.SavingThrow(Proficiencies.Attribute.Wisdom, Sanctuary.ProtectedTargets[target.GetComponent <Actor>()].ChallengeRating)) { AvailableMeleeTargets.Remove(target); } } }
public GameObject TargetEnemy() { IdentifyEnemies(); RemoveSanctuaryTargets(); if (AvailableMeleeTargets.Any() && AvailableMeleeTargets.Contains(Threat.PrimaryThreat()?.gameObject)) { TargetMelee(); } else if (AvailableRangedTargets.Any() && AvailableRangedTargets.Contains(Threat.PrimaryThreat()?.gameObject)) { TargetRanged(); } else { Target = null; } return(Target); }
private void SetEnemyRanges() { if (Me == null) { return; } float melee_range = Me.Actions.Combat.MeleeRange(); Weapon ranged_weapon = Me.Actions.Combat.EquippedRangedWeapon; Weapon combat_spell = Me.Actions.Combat.CombatSpells.FirstOrDefault(); // TODO: cycle through spells and choose the longest ranged. if (Enemies.Any()) { AvailableMeleeTargets.AddRange(Enemies .Where(actor => actor != null && Me.SeparationFrom(actor.transform) <= melee_range) .OrderBy(actor => actor.Health.CurrentHitPoints) .Select(actor => actor.gameObject) .Distinct() .ToList()); if (ranged_weapon != null) { AvailableRangedTargets.AddRange(Enemies .Where(actor => actor != null && Me.SeparationFrom(actor.transform) <= ranged_weapon.Range) .OrderBy(actor => actor.Health.CurrentHitPoints) .Select(actor => actor.gameObject) .Distinct() .ToList()); } if (combat_spell != null) { AvailableRangedTargets.AddRange(Enemies .Where(actor => actor != null && Me.SeparationFrom(actor.transform) <= combat_spell.GetComponent <Spell>().range) .OrderBy(actor => actor.Health.CurrentHitPoints) .Select(actor => actor.gameObject) .Distinct() .ToList()); } } if (Me.Actions.Decider.HostileStructures.Any()) { AvailableMeleeTargets.AddRange(Me.Actions.Decider.HostileStructures .Where(structure => Me.SeparationFrom(structure.transform) <= melee_range + Me.Actions.Movement.StoppingDistance()) .Select(structure => structure.gameObject) .Distinct() .ToList()); if (ranged_weapon != null) { AvailableRangedTargets.AddRange(Me.Actions.Decider.HostileStructures .Where(structure => Me.SeparationFrom(structure.transform) <= ranged_weapon.Range + Me.Actions.Movement.StoppingDistance()) .Select(structure => structure.gameObject) .Distinct() .ToList()); } if (combat_spell != null) { AvailableRangedTargets.AddRange(Me.Actions.Decider.HostileStructures .Where(structure => Me.SeparationFrom(structure.transform) <= combat_spell.GetComponent <Spell>().range + Me.Actions.Movement.StoppingDistance()) .Select(structure => structure.gameObject) .Distinct() .ToList()); } } }
private void ClearTargets() { AvailableMeleeTargets.Clear(); AvailableRangedTargets.Clear(); Target = null; }