예제 #1
0
        public Dictionary <string, object> GetVars()
        {
            Dictionary <string, object> vars = new Dictionary <string, object>();

            Type t = GetType();

            FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic |
                                             BindingFlags.Public |
                                             BindingFlags.Instance |
                                             BindingFlags.DeclaredOnly);

            foreach (FieldInfo field in fields)
            {
                if (field.FieldType == typeof(LSL_Types.List)) // ref type, copy
                {
                    LSL_Types.List v = (LSL_Types.List)field.GetValue(this);
                    if (((object)v) == null)
                    {
                        continue; //Broken... :/
                    }
                    object[] data = new object[v.Data.Length];
                    Array.Copy(v.Data, 0, data, 0, v.Data.Length);
                    LSL_Types.List c = new LSL_Types.List {
                        Data = data
                    };
                    vars[field.Name] = c;
                }
                else if (field.FieldType == typeof(LSL_Types.LSLInteger) ||
                         field.FieldType == typeof(LSL_Types.LSLString) ||
                         field.FieldType == typeof(LSL_Types.LSLFloat) ||
                         field.FieldType == typeof(int) ||
                         field.FieldType == typeof(double) ||
                         field.FieldType == typeof(float) ||
                         field.FieldType == typeof(string) ||
                         field.FieldType == typeof(byte) ||
                         field.FieldType == typeof(short) ||
                         field.FieldType == typeof(LSL_Types.Vector3) ||
                         field.FieldType == typeof(LSL_Types.Quaternion))
                {
                    vars[field.Name] = field.GetValue(this);
                }
            }
            fields = null;
            t      = null;

            return(vars);
        }
예제 #2
0
        /// <summary>
        ///     Note: this is just used for reset
        /// </summary>
        /// <param name="vars"></param>
        public void SetVars(Dictionary <string, object> vars)
        {
            if (!m_useStateSaves)
            {
                return;
            }
            Type t = GetType();

            FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic |
                                             BindingFlags.Public |
                                             BindingFlags.Instance |
                                             BindingFlags.DeclaredOnly);

            foreach (FieldInfo field in fields)
            {
                if (vars.ContainsKey(field.Name))
                {
                    object newVal = vars[field.Name];
                    if (field.FieldType == typeof(LSL_Types.List))
                    {
                        LSL_Types.List v    = (LSL_Types.List)field.GetValue(this);
                        object[]       data = ((LSL_Types.List)(newVal)).Data;
                        v.Data = new object[data.Length];
                        Array.Copy(data, 0, v.Data, 0, data.Length);
                        field.SetValue(this, v);
                    }
                    else if (field.FieldType == typeof(LSL_Types.LSLInteger) ||
                             field.FieldType == typeof(LSL_Types.LSLString) ||
                             field.FieldType == typeof(LSL_Types.LSLFloat) ||
                             field.FieldType == typeof(int) ||
                             field.FieldType == typeof(double) ||
                             field.FieldType == typeof(float) ||
                             field.FieldType == typeof(string) ||
                             field.FieldType == typeof(byte) ||
                             field.FieldType == typeof(short) ||
                             field.FieldType == typeof(LSL_Types.Vector3) ||
                             field.FieldType == typeof(LSL_Types.Quaternion)
                             )
                    {
                        field.SetValue(this, newVal);
                    }
                }
            }
            fields = null;
            t      = null;
        }
예제 #3
0
        public string ListToString(object o)
        {
            string tmp = "";
            string cur = "";

            LSL_Types.List v = (LSL_Types.List)o;
            foreach (object ob in v.Data)
            {
                if (ob is LSL_Types.LSLInteger)
                {
                    cur = "i" + ob;
                }
                else if (ob is LSL_Types.LSLFloat)
                {
                    cur = "f" + ob;
                }
                else if (ob is LSL_Types.Vector3)
                {
                    cur = "v" + ob;
                }
                else if (ob is LSL_Types.Quaternion)
                {
                    cur = "q" + ob;
                }
                else if (ob is LSL_Types.LSLString)
                {
                    cur = "\"" + EscapeString(ob.ToString()) + "\"";
                }
                else if (o.GetType() == typeof(LSL_Types.List))
                {
                    cur = "{" + ListToString(ob) + "}";
                }

                if (tmp == "")
                {
                    tmp = cur;
                }
                else
                {
                    tmp += ", " + cur;
                }
            }
            return(tmp);
        }
예제 #4
0
        public void SetStoreVars(Dictionary <string, object> vars)
        {
            if (!m_useStateSaves)
            {
                return;
            }
            m_lastStateSaveValues = vars;
            m_stateSaveRequired   = false;
            //If something is setting the vars, we don't need to do a state save, as this came from a state save
            Type t = GetType();

            FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic |
                                             BindingFlags.Public |
                                             BindingFlags.Instance |
                                             BindingFlags.DeclaredOnly);

            foreach (FieldInfo field in fields)
            {
                if (vars.ContainsKey(field.Name))
                {
                    object var = vars[field.Name];
                    if (field.FieldType == typeof(LSL_Types.List))
                    {
                        string         val = var.ToString();
                        int            end;
                        LSL_Types.List v = ParseValueToList(val, 0, out end);
                        field.SetValue(this, v);
                    }
                    else if (field.FieldType == typeof(LSL_Types.LSLInteger))
                    {
                        int val = int.Parse(var.ToString());
                        field.SetValue(this, new LSL_Types.LSLInteger(val));
                    }
                    else if (field.FieldType == typeof(LSL_Types.LSLString))
                    {
                        string val = var.ToString();
                        field.SetValue(this, new LSL_Types.LSLString(val));
                    }
                    else if (field.FieldType == typeof(LSL_Types.LSLFloat))
                    {
                        float val = float.Parse(var.ToString());
                        field.SetValue(this, new LSL_Types.LSLFloat(val));
                    }
                    else if (field.FieldType == typeof(int))
                    {
                        int val = int.Parse(var.ToString());
                        field.SetValue(this, val);
                    }
                    else if (field.FieldType == typeof(double))
                    {
                        double val = double.Parse(var.ToString());
                        field.SetValue(this, val);
                    }
                    else if (field.FieldType == typeof(float))
                    {
                        float val = float.Parse(var.ToString());
                        field.SetValue(this, val);
                    }
                    else if (field.FieldType == typeof(string))
                    {
                        string val = var.ToString();
                        field.SetValue(this, val);
                    }
                    else if (field.FieldType == typeof(byte))
                    {
                        byte val = byte.Parse(var.ToString());
                        field.SetValue(this, val);
                    }
                    else if (field.FieldType == typeof(short))
                    {
                        short val = short.Parse(var.ToString());
                        field.SetValue(this, val);
                    }
                    else if (field.FieldType == typeof(LSL_Types.Quaternion))
                    {
                        LSL_Types.Quaternion val = new LSL_Types.Quaternion(var.ToString());
                        field.SetValue(this, val);
                    }
                    else if (field.FieldType == typeof(LSL_Types.Vector3))
                    {
                        LSL_Types.Vector3 val = new LSL_Types.Vector3(var.ToString());
                        field.SetValue(this, val);
                    }
                }
            }
            fields = null;
            t      = null;
        }
예제 #5
0
        public LSL_Types.List ParseValueToList(string inval, int start, out int end)
        {
            LSL_Types.List v = new LSL_Types.List();
            end = -1;
            char   c;
            string tr = ",}";

            char[]   charany = tr.ToCharArray();
            string   param   = "";
            int      totlen  = inval.Length;
            int      len;
            DateTime time_limit = DateTime.Now.AddSeconds(5.0);

            while (true)
            {
                try {
                    if (inval.Length == 0)
                    {
                        v.Add(new LSL_Types.LSLString(""));
                    }
                    else
                    {
                        c = inval[start++];
                        switch (c)
                        {
                        case 'i':
                            end = inval.IndexOfAny(charany, start);
                            if (end > 0)
                            {
                                len = end - start;
                            }
                            else
                            {
                                len = totlen - start;
                            }
                            param = inval.Substring(start, len);
                            v.Add(new LSL_Types.LSLInteger(param));
                            break;

                        case 'f':
                            end = inval.IndexOfAny(charany, start);
                            if (end > 0)
                            {
                                len = end - start;
                            }
                            else
                            {
                                len = totlen - start;
                            }
                            param = inval.Substring(start, len);
                            v.Add(new LSL_Types.LSLFloat(param));
                            break;

                        case 'v':
                            end = inval.IndexOf('>', start);
                            if (end > 0)
                            {
                                len = end - start;
                            }
                            else
                            {
                                len = totlen - start;
                            }
                            param = inval.Substring(start, len);
                            v.Add(new LSL_Types.Vector3(param));
                            end++;
                            break;

                        case 'q':
                            end = inval.IndexOf('>', start);
                            if (end > 0)
                            {
                                len = end - start;
                            }
                            else
                            {
                                len = totlen - start;
                            }
                            param = inval.Substring(start, len);
                            v.Add(new LSL_Types.Quaternion(param));
                            end++;
                            break;

                        case '"':
                            end = inval.IndexOf('"', start);
                            while (inval[end - 1] == '\\')
                            {
                                int slashes = 2;
                                while (end - slashes > 0 && inval[end - slashes] == '\\')
                                {
                                    slashes++;
                                }
                                if ((slashes - 1) % 2 == 0)
                                {
                                    end = inval.IndexOf('"', end + 1);
                                }
                                else
                                {
                                    break;
                                }
                            }
                            if (end > 0)
                            {
                                len = end - start;
                            }
                            else
                            {
                                len = totlen - start;
                            }
                            param = UnEscapeString(inval.Substring(start, len));
                            v.Add(new LSL_Types.LSLString(param));
                            end++;
                            break;

                        case '{':
                            v.Add(ParseValueToList(inval, start, out end));
                            end++;
                            break;

                        default:
                            break;
                        }
                    }
                    start = end;
                    if (start == -1 || start >= totlen || (inval[start] == '}'))
                    {
                        break;
                    }
                    else
                    {
                        while ((inval[start] == ',' || inval[start] == ' ') && DateTime.Now.CompareTo(time_limit) < 0)
                        {
                            start++;
                        }
                    }
                    if (DateTime.Now.CompareTo(time_limit) > 0)
                    {
                        break;
                    }
                } catch {
                }
            }
            return(v);
        }
예제 #6
0
        public Dictionary <string, object> GetStoreVars()
        {
            Dictionary <string, object> vars = new Dictionary <string, object>();

            if (!m_useStateSaves)
            {
                return(vars);
            }

            Type t = GetType();

            FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic |
                                             BindingFlags.Public |
                                             BindingFlags.Instance |
                                             BindingFlags.DeclaredOnly);

            foreach (FieldInfo field in fields)
            {
                if (field.FieldType == typeof(LSL_Types.List)) // ref type, copy
                {
                    string         tmp = "";
                    string         cur = "";
                    LSL_Types.List v   = (LSL_Types.List)field.GetValue(this);
                    foreach (object o in v.Data)
                    {
                        if (o is LSL_Types.LSLInteger)
                        {
                            cur = "i" + o;
                        }
                        else if (o is LSL_Types.LSLFloat)
                        {
                            cur = "f" + o;
                        }
                        else if (o is LSL_Types.Vector3)
                        {
                            cur = "v" + o;
                        }
                        else if (o is LSL_Types.Quaternion)
                        {
                            cur = "q" + o;
                        }
                        else if (o is LSL_Types.LSLString)
                        {
                            cur = "\"" + EscapeString(o.ToString()) + "\"";
                        }
                        else if (o.GetType() == typeof(LSL_Types.List))
                        {
                            cur = "{" + ListToString(o) + "}";
                        }

                        if (tmp == "")
                        {
                            tmp = cur;
                        }
                        else
                        {
                            tmp += ", " + cur;
                        }
                    }
                    vars[field.Name] = tmp;
                }
                else if (field.FieldType == typeof(LSL_Types.LSLInteger) ||
                         field.FieldType == typeof(LSL_Types.LSLString) ||
                         field.FieldType == typeof(LSL_Types.LSLFloat) ||
                         field.FieldType == typeof(int) ||
                         field.FieldType == typeof(double) ||
                         field.FieldType == typeof(float) ||
                         field.FieldType == typeof(string) ||
                         field.FieldType == typeof(byte) ||
                         field.FieldType == typeof(short) ||
                         field.FieldType == typeof(LSL_Types.Vector3) ||
                         field.FieldType == typeof(LSL_Types.Quaternion))
                {
                    vars[field.Name] = field.GetValue(this).ToString();
                }
            }
            fields = null;
            t      = null;

            return(vars);
        }