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