public Commander(CommandedUnitAI ai) { this.ai = ai; commandedAIs = new HashSet <CommandedUnitAI>(); unitNoticedFacts = new Dictionary <Unit, UnitNoticedFact>(); AddCommandedAI(ai); }
public void RemoveCommandedAI(CommandedUnitAI ai) { if (!commandedAIs.Contains(ai)) { return; } commandedAIs.Remove(ai); ai.owner.Died -= OnUnitDied; }
public void AddCommandedAI(CommandedUnitAI ai) { if (commandedAIs.Contains(ai)) { return; } commandedAIs.Add(ai); ai.owner.Died += OnUnitDied; }
private void OnUnitDied(Unit unit) { RemoveCommandedAI(unit.ai as CommandedUnitAI); if (unit.ai == this.ai) { if (commandedAIs.Count == 0) { return; } this.ai = commandedAIs.First(); } }
public static Commander FindCommanderFor(CommandedUnitAI ai) { int layerMask = 1 << ai.owner.gameObject.layer; var position = ai.owner.position; var units = Unit.GetInRadius <Unit>(position, commanderSearchRadius, layerMask); Unit closest = units.ClosestTo(position, u => u != ai.owner && u.ai is CommandedUnitAI cmd && cmd.isCommanderSelf); if (closest != null) { return(((CommandedUnitAI)closest.ai).commander); } return(new Commander(ai)); }
public void ReportSearchPointIsClear(Vector2 searchPoint, CommandedUnitAI reporter) { const float distanceTolerance = 2f; foreach (var commandedAI in commandedAIs) { if (commandedAI == reporter) { continue; } if (commandedAI.state is TargetSearchWanderingState wanderingState && !wanderingState.hasCheckedSearchPoint && (wanderingState.searchPoint - searchPoint).CompareLength(distanceTolerance) < 0) { wanderingState.ReportedThatSearchPointIsClear(); } } }