using System.Collections.Generic;\r
using System.Linq;\r
using System.Text;\r
+using System.Text.RegularExpressions;\r
using OpenMetaverse;\r
using OpenMetaverse.StructuredData;\r
\r
-//RestrainedLife viewer v1.20c\r
-\r
namespace Radegast\r
{\r
public class RLVManager : IDisposable\r
{\r
\r
- private RadegastInstance instance;\r
+ RadegastInstance instance;\r
+ Regex rlv_regex = new Regex(@"(?<behaviour>[^:=]+)(:(?<option>[^=]+))?=(?<param>\w+)", RegexOptions.Compiled);\r
+ List<RLVRule> rules = new List<RLVRule>();\r
\r
public bool Enabled\r
{\r
public void Dispose()\r
{\r
}\r
+\r
+ public bool TryProcessCMD(ChatEventArgs e)\r
+ {\r
+ if (!e.Message.StartsWith("@")) return false;\r
+\r
+ if (e.Message == "@clear")\r
+ {\r
+ ProcessClear(e.SourceID);\r
+ return true;\r
+ }\r
+\r
+ foreach (var cmd in e.Message.Substring(1).Split(','))\r
+ {\r
+ var m = rlv_regex.Match(cmd);\r
+ if (!m.Success) continue;\r
+ \r
+ var rule = new RLVRule();\r
+ rule.Behaviour = m.Groups["behaviour"].ToString().ToLower(); ;\r
+ rule.Option = m.Groups["option"].ToString().ToLower();\r
+ rule.Param = m.Groups["param"].ToString().ToLower();\r
+ rule.Sender = e.SourceID;\r
+ rule.SenderName = e.FromName;\r
+\r
+ Logger.DebugLog(rule.ToString());\r
+\r
+ if (rule.Param == "rem") rule.Param = "y";\r
+ if (rule.Param == "add") rule.Param = "n";\r
+\r
+ if (rule.Param == "n")\r
+ {\r
+ lock (rules) rules.Add(rule);\r
+ continue;\r
+ }\r
+\r
+ if (rule.Param == "y")\r
+ {\r
+ lock (rules)\r
+ {\r
+ if (rule.Option == "")\r
+ {\r
+ rules.RemoveAll((RLVRule r) =>\r
+ {\r
+ return r.Behaviour == rule.Behaviour && r.Sender == rule.Sender;\r
+ });\r
+ }\r
+ else\r
+ {\r
+ rules.RemoveAll((RLVRule r) =>\r
+ {\r
+ return r.Behaviour == rule.Behaviour && r.Sender == rule.Sender && r.Option == rule.Option;\r
+ });\r
+ }\r
+ }\r
+\r
+ continue;\r
+ }\r
+\r
+\r
+ switch (rule.Behaviour)\r
+ {\r
+ case "version":\r
+ int chan = 0;\r
+ if (int.TryParse(rule.Param, out chan) && chan > 0)\r
+ {\r
+ instance.Client.Self.Chat("RestrainedLife viewer v1.20c (" + Properties.Resources.RadegastTitle + "." + RadegastBuild.CurrentRev + ")", chan, ChatType.Normal);\r
+ }\r
+ break;\r
+\r
+ case "versionnum":\r
+ if (int.TryParse(rule.Param, out chan) && chan > 0)\r
+ {\r
+ instance.Client.Self.Chat("1210100", chan, ChatType.Normal);\r
+ }\r
+ break;\r
+\r
+ case "sit":\r
+ UUID sitTarget = UUID.Zero;\r
+\r
+ if (rule.Param == "force" && UUID.TryParse(rule.Option, out sitTarget) && sitTarget != UUID.Zero)\r
+ {\r
+ instance.Client.Self.RequestSit(sitTarget, Vector3.Zero);\r
+ instance.Client.Self.Sit();\r
+ }\r
+ break;\r
+\r
+ case "unsit":\r
+ if (rule.Param == "force")\r
+ {\r
+ instance.Client.Self.Stand();\r
+ }\r
+ break;\r
+\r
+ case "setrot":\r
+ double rot = 0.0;\r
+\r
+ if (rule.Param == "force" && double.TryParse(rule.Option, System.Globalization.NumberStyles.Float, Utils.EnUsCulture, out rot))\r
+ {\r
+ instance.Client.Self.Movement.UpdateFromHeading(rot, true);\r
+ }\r
+ break;\r
+\r
+ case "tpto":\r
+ var coord = rule.Option.Split('/');\r
+ \r
+ try\r
+ {\r
+ float gx = float.Parse(coord[0], Utils.EnUsCulture);\r
+ float gy = float.Parse(coord[1], Utils.EnUsCulture);\r
+ float z = float.Parse(coord[2], Utils.EnUsCulture);\r
+ float x = 0, y = 0;\r
+\r
+ instance.TabConsole.DisplayNotificationInChat("Starting teleport...");\r
+ ulong h = Helpers.GlobalPosToRegionHandle(gx, gy, out x, out y);\r
+ instance.Client.Self.RequestTeleport(h, new Vector3(x, y, z));\r
+ }\r
+ catch (Exception) { }\r
+\r
+ break;\r
+\r
+ }\r
+ }\r
+\r
+\r
+ return true;\r
+ }\r
+\r
+ void ProcessClear(UUID id)\r
+ {\r
+ rules.RemoveAll((RLVRule r) => { return r.Sender == id; });\r
+ }\r
+\r
+ public bool AllowDetach(AttachmentInfo a)\r
+ {\r
+ if (!Enabled || a == null) return true;\r
+\r
+ if (rules.FindAll((RLVRule r) => { return r.Behaviour == "detach" && r.Sender == a.Prim.ID; }).Count > 0)\r
+ {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public bool AutoAcceptTP(UUID agent)\r
+ {\r
+ if (!Enabled || agent == UUID.Zero) return false;\r
+\r
+ if (rules.FindAll((RLVRule r) => { return r.Behaviour == "accepttp" && (r.Option == "" || r.Option == agent.ToString()); }).Count > 0)\r
+ {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
}\r
}\r
\r
namespace Radegast\r
{\r
+\r
public partial class InventoryConsole : UserControl\r
{\r
- public class AttachmentInfo\r
- {\r
- public Primitive Prim;\r
- public InventoryItem Item;\r
- public UUID InventoryID;\r
- public UUID PrimID;\r
- public bool MarkedAttached = false;\r
-\r
- public AttachmentPoint Point\r
- {\r
- get\r
- {\r
- if (Prim != null)\r
- {\r
- return Prim.PrimData.AttachmentPoint;\r
- }\r
- else\r
- {\r
- return AttachmentPoint.Default;\r
- }\r
- }\r
- }\r
- }\r
-\r
RadegastInstance instance;\r
GridClient client { get { return instance.Client; } }\r
Dictionary<UUID, TreeNode> FolderNodes = new Dictionary<UUID, TreeNode>();\r
}\r
ctxInv.Items.Add(ctxItem);\r
\r
- if (IsAttached(item))\r
+ if (IsAttached(item) && instance.RLV.AllowDetach(attachments[item.UUID]))\r
{\r
ctxItem = new ToolStripMenuItem("Detach from yourself", null, OnInvContextClick);\r
ctxItem.Name = "detach";\r
}\r
}\r
}\r
- \r
+\r
#endregion\r
\r
private void UpdateWornLabels()\r
}\r
}\r
#endregion\r
+\r
+ public class AttachmentInfo\r
+ {\r
+ public Primitive Prim;\r
+ public InventoryItem Item;\r
+ public UUID InventoryID;\r
+ public UUID PrimID;\r
+ public bool MarkedAttached = false;\r
+\r
+ public AttachmentPoint Point\r
+ {\r
+ get\r
+ {\r
+ if (Prim != null)\r
+ {\r
+ return Prim.PrimData.AttachmentPoint;\r
+ }\r
+ else\r
+ {\r
+ return AttachmentPoint.Default;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+\r
}\r