public List <BotAction> GetPossibleActions(double maxXYDistance, double maxZDist) { ListAsSet <SimObject> KnownObjects = Actor.GetKnownObjects(); double myZ = Actor.GlobalPosition.Z; List <SimObject> useObjects = new List <SimObject>(); foreach (SimObject O in KnownObjects.CopyOf()) { if (!O.IsRegionAttached) { continue; } if (O.Distance(Actor) > maxXYDistance) { continue; } if (Math.Abs(O.GlobalPosition.Z - myZ) > maxZDist) { continue; } useObjects.Add(O); } // useObjects.Sort(Actor.CompareDistance); List <SimTypeUsage> KnownTypeUsages = new List <SimTypeUsage>(Actor.KnownTypeUsages); KnownTypeUsages.Sort(CompareUsage); List <BotAction> KnownBotAcions = new List <BotAction>(); lock (KnownTypeUsages) foreach (SimTypeUsage use in KnownTypeUsages) { lock (useObjects) foreach (SimObject obj in useObjects) { if (CurrentAction != null) { if (obj != CurrentAction.Target) { continue; } } if (obj.Affordances.GetTypeUsages().Contains(use)) { KnownBotAcions.Add(new BotObjectAction(Actor, new SimObjectUsage(use, obj))); } } } return(KnownBotAcions); }