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