示例#1
0
        private ICollection ResolveGroupVar(string name)
        {
            IKeyValuePair <string, object> func;

            if (ObjectGroups.TryGetValue(name.TrimStart(TrimCollectionStart), out func))
            {
                if (func == null)
                {
                    return(null);
                }
                return(SingleNameValue.AsCollection(func.Value));
            }
            return(null);
        }
示例#2
0
        public ICollection ResolveForExternal(string name)
        {
            var expandGroupVar = ResolveGroupVar(name);

            if (expandGroupVar != null)
            {
                return(expandGroupVar);
            }
            var           splitted  = Parser.ParseArguments(name);
            int           argsUsed  = 0;
            List <string> missingOk = new List <string>();
            var           prim      = GetPrimitiveFromList(splitted, out argsUsed, missingOk);

            if (prim != null || missingOk.Count == 0)
            {
                if (argsUsed > 0)
                {
                    return(SingleNameValue.AsCollection(prim));
                }
            }
            return(null);
        }
示例#3
0
        public List <SimObject> GetSingleArg(string[] splitted, out int argsUsed)
        {
            if (splitted.Length == 0)
            {
                argsUsed = 0;
                return(new List <SimObject>());
            }
            SimObject prim;
            UUID      uuid = UUID.Zero;
            string    name = splitted[0].Trim().Replace("  ", " ");

            if (name.IndexOf("-") > 2 && UUID.TryParse(name, out uuid))
            {
                prim     = GetSimObjectFromUUID(uuid);
                argsUsed = 1;
                return(PrimOrNot(prim));
            }
            var resolve = name.ToLower();

            /*
             * if (resolve.Equals("pointing") || resolve.Equals("it"))
             * {
             *  argsUsed = 1;
             *  if (!client.TheRadegastInstance.State.IsPointing)
             *  {
             *      prim = null;
             *      return false;
             *  }
             *  prim = GetPrimitive(client.TheRadegastInstance.State.TargetID, null);
             *  return prim != null;
             * }
             */
            foreach (string primid in new[] { "primid", "lid" })
            {
                if (resolve.StartsWith(primid))
                {
                    int tl = primid.Length;
                    if (name.Length > tl)
                    {
                        String s = name.Substring(tl);
                        uint   localID;
                        if (uint.TryParse(s, out localID))
                        {
                            prim     = GetSimObject(localID, null);
                            argsUsed = 1;
                            return(PrimOrNot(prim));
                        }
                    }
                }
            }
            if (name.StartsWith("@"))
            {
                int splitOffset = 0;
                name = name.Substring(1);
                if (name.Length == 0)
                {
                    splitOffset = 1;
                    splitted    = Parser.SplitOff(splitted, 1);
                }
                else
                {
                    splitted[0] = name;
                }
                int         argsUsed0;
                SimPosition position = GetVector(splitted, out argsUsed0);
                if (argsUsed0 == 0)
                {
                    argsUsed = splitOffset;
                    prim     = null;
                    return(PrimOrNot(prim));
                }
                double dist;
                prim     = GetSimObjectFromVector(position.GlobalPosition, out dist);
                argsUsed = argsUsed0 + splitOffset;
                if (dist > 2)
                {
                    prim = null;
                }
                return(PrimOrNot(prim));
            }

            if (name.StartsWith("$"))
            {
                return(ResolveCollection(name, out argsUsed));
            }
            if (name.StartsWith("["))
            {
                var fnd = GetUnion(Parser.SplitOff(splitted, 1), out argsUsed);
                argsUsed++;
                if (argsUsed < splitted.Length)
                {
                    string t = splitted[argsUsed];
                    if (t == "]")
                    {
                        argsUsed++;
                    }
                }
                return(fnd);
            }
            if (name == "+")
            {
                var fnd = GetSingleArg(Parser.SplitOff(splitted, 1), out argsUsed);
                argsUsed++;
                return(fnd);
            }
            if (name.StartsWith("("))
            {
                argsUsed = 1;
                var result = GridMaster.client.evalLispCode(name);
                var acol   = SingleNameValue.AsCollection(result);
                if (acol == null)
                {
                    argsUsed = 0;
                }
                var fnd = new List <SimObject>();
                GridMaster.AsPrimitives(fnd, acol);
                return(fnd);
            }

            int nth;

            if (int.TryParse(name, out nth))
            {
                nth--;
                splitted = Parser.SplitOff(splitted, 1);
                List <SimObject> fnd = null;
                if (splitted.Length == 0)
                {
                    argsUsed = 1;
                    fnd      = SimRootObjects.CopyOf();
                }
                else
                {
                    fnd = GetSingleArg(splitted, out argsUsed);
                }
                if (fnd == null)
                {
                    return(fnd);
                }
                if (nth >= fnd.Count)
                {
                    nth = fnd.Count - 1;
                }
                if (nth < 0)
                {
                    return(null);
                }
                if (m_TheSimAvatar != null)
                {
                    fnd.Sort(((SimObject)m_TheSimAvatar).CompareDistance);
                }
                return(new List <SimObject>()
                {
                    fnd[nth]
                });
            }

            int len = splitted.Length;

            if (len > 1)
            {
                len = 2;
            }
            string largs = name.Replace("_", " ");

            if (largs.Contains(" "))
            {
                len = 1;
            }
            argsUsed = 0;
            for (int i = len; i > 0; i--)
            {
                var fnd = new List <SimObject>();
                name = string.Join(" ", splitted, 0, i);
                foreach (var o in SimObjects)
                {
                    if (o.Matches(name))
                    {
                        fnd.Add(o);
                        argsUsed = i;
                    }
                }
                if (fnd.Count > 0)
                {
                    return(fnd);
                }
            }
            return(null);
        }
示例#4
0
        public DefaultWorldGroupProvider(WorldObjects objects)
        {
            world = objects;
            AddObjectGroup("selected", "set of currently selected objects", () =>
            {
                SimActor avatar = this.avatar;
                if (avatar == null)
                {
                    return(null);
                }
                return(avatar.GetSelectedObjects());
            });
            AddObjectGroup("none", "empty list", () => new List <SimObject>());
            AddObjectGroup("assets", "known assets", () => WorldObjects.SimRootObjects.CopyOf());
            AddObjectGroup("objects", "known sim root objects", () =>
                           WorldObjects.SimRootObjects.CopyOf());
            AddObjectGroup("caller", "current command caller", () =>
            {
                UUID callerID = BotClient.SessionToCallerId(
                    objects.client.CurrentCommand.
                    CurrentRequest.CallerAgent);
                if (callerID == UUID.Zero)
                {
                    return(null);
                }
                var o =
                    WorldObjects.GetSimObjectFromUUID(callerID);
                if (o == null)
                {
                    return(null);
                }
                return(SingleNameValue.AsCollection(o));
            });
            AddObjectGroup("prims", "all prims (attached and otherwise and avatars etc)",
                           () => WorldObjects.SimObjects.CopyOf());
            AddObjectGroup("childprims", "known childs rez in world not attachments",
                           () => WorldObjects.SimChildObjects.CopyOf());
            AddObjectGroup("attachments", "known attacments (everyones)",
                           () => WorldObjects.SimAttachmentObjects.CopyOf());
            // all known accounts
            AddObjectGroup("accounts", "known accounts", () => WorldObjects.SimAccounts.CopyOf());
            // all known avatars
            AddObjectGroup("avatars", "known avatars", () => WorldObjects.SimAvatars.CopyOf());
            // this bot's master(s)
            AddObjectGroup("master", "known masters", () =>
            {
                var v = new List <object>();
                if (objects.client.MasterKey != UUID.Zero)
                {
                    v.Add(objects.CreateSimAvatar(
                              objects.client.MasterKey, objects, null));
                }
                else
                {
                    v.Add(objects.client.MasterName);
                }
                return(v);
            });
            // the current bot
            AddObjectGroup("self", "the robot's avatar", () =>
            {
                SimActor avatar = this.avatar;
                if (avatar == null)
                {
                    return(null);
                }
                var v = new List <SimObject> {
                    avatar
                };
                return(v);
            });
            AddObjectGroup("nearest", "nearest root prim", () =>
            {
                var sortme = WorldObjects.SimRootObjects.CopyOf();
                if (sortme.Count == 0)
                {
                    return(null);
                }
                sortme.Sort(this.avatar.CompareDistance);
                var v = new List <SimObject> {
                    sortme[0]
                };
                return(v);
            });
            AddObjectGroup("regionprims",
                           "list of all av's, attachments, and objects in this region used in 'moveprim $regionprims <0,0,-1>'",
                           () =>
            {
                List <SimObject> here = new List <SimObject>();
                SimActor avatar       = this.avatar;
                if (avatar == null)
                {
                    return(null);
                }
                ulong areg = avatar.RegionHandle;
                foreach (SimObject o in WorldObjects.SimObjects.CopyOf())
                {
                    if (o.RegionHandle == areg)
                    {
                        here.Add(o);
                    }
                }
                return(here);
            });
            AddObjectGroup("allprims", "list of all av's, attachments, and objects known to system",
                           () => WorldObjects.SimObjects.CopyOf());

            AddObjectGroup("selfknownprims",
                           "list of all objects that have an affordance or makes sense for the bot to know about",
                           () =>
            {
                SimActor avatar = this.avatar;
                if (avatar == null)
                {
                    return(null);
                }
                return(avatar.GetKnownObjects());
            });
            // the 'current object' - the current object is determined in a complex way
            // but is generally the last object acted upon by the av. it's only allowed to be changed every 30 sec
            // and might be overwritten by aiml.
            // the intent is to support the notion of a pronoun 'it'
            // if the bot's head is free (not being animated) it will look at target
            AddObjectGroup("lasteventprim", "the 'current object' - the current object is determined in a complex way",
                           () =>
            {
                SimActor avatar = this.avatar;
                if (avatar == null)
                {
                    return(null);
                }
                var v = new List <SimPosition>();
                var a = avatar.CurrentAction;
                if (a != null && a.Target != null)
                {
                    v.Add(a.Target);
                    return(v);
                }
                SimPosition p = null;                    // avatar.ApproachPosition;
                if (p != null)
                {
                    v.Add(p);
                    return(v);
                }
                var r = GetTargetInEvent(v, avatar);
                if (r != null)
                {
                    return(r);
                }
                if (objects.client.MasterKey != UUID.Zero)
                {
                    var master = WorldObjects.GetSimObjectFromUUID(objects.client.MasterKey);
                    if (master != null)
                    {
                        return(GetTargetInEvent(v, master));
                    }
                }
                return(null);
            });
        }