예제 #1
0
        public override LuaValue Evaluate(LuaValue baseValue, LuaTable enviroment)
        {
            LuaValue value = null;
		try {LuaValue.GetKeyValue(baseValue, new LuaString(this.Method)); } catch (Exception) { }
            LuaFunction function = value as LuaFunction;

            if (function != null)
            {
                if (this.Args.Table != null)
                {
                    return function.Function.Invoke(new LuaValue[] { baseValue, this.Args.Table.Evaluate(enviroment) });
                }
                else if (this.Args.String != null)
                {
                    return function.Function.Invoke(new LuaValue[] { baseValue, this.Args.String.Evaluate(enviroment) });
                }
                else
                {
                    List<LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                    args.Insert(0, baseValue);
                    return function.Function.Invoke(args.ToArray());
                }
            } // method call on table would be like _G:script()
            else if ((baseValue as LuaTable) != null)
            {
                List<LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                return ((baseValue as LuaTable).MetaTable.GetValue("__call") as LuaFunction).Invoke(args.ToArray());
            }
            else if ((baseValue as LuaClass) != null)
            {
                LuaClass c = baseValue as LuaClass;
                List<LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                args.Insert(0, new LuaString(this.Method));
                if (c.Self.MetaTable == null)
                    c.GenerateMetaTable();
                return (c.Self.MetaTable.GetValue("__call") as LuaFunction).Invoke(args.ToArray());
            }
            else if ((baseValue as LuaUserdata) != null)
            {
                List<LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                LuaUserdata obj = baseValue as LuaUserdata;
                object o = obj.Value;
                if (obj.MetaTable != null)
                {
                    if (obj.MetaTable.GetValue(this.Method) != null)
                    {
                        LuaValue o2 = obj.MetaTable.GetValue(this.Method);
                        if ((o2 as LuaFunction) != null)
                            return (o2 as LuaFunction).Invoke(args.ToArray());
                        else if ((o2 as LuaTable) != null)
                            throw new NotImplementedException(); // TODO
                    }
                }
                return ObjectToLua.ToLuaValue(o.GetType().GetMethod(this.Method, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Invoke(o, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, args.ToArray(), CultureInfo.CurrentCulture));
            }
            else
            {
                throw new Exception("Invoke method call on non function value.");
            }
        }
예제 #2
0
 public static LuaValue IsClass(LuaValue[] args)
 {
     if ((args[0] as LuaClass) != null)
         return LuaBoolean.True;
     else
         return LuaBoolean.False;
 }
예제 #3
0
        public static LuaValue open(LuaValue[] values)
        {
            //[PixelCrushers]LuaString file = values[0] as LuaString;
            LuaString modeStr = values.Length > 1 ? values[1] as LuaString : null;
            string mode = modeStr == null ? "r" : modeStr.Text;

            switch (mode)
            {
                case "r":
                case "r+":
                //[PixelCrushers]StreamReader reader = File.OpenText(file.Text);
                //[PixelCrushers]return new LuaUserdata(reader, FileLib.CreateMetaTable());
                return null;
                case "w":
                case "w+":
                //[PixelCrushers]StreamWriter writer = File.CreateText(file.Text);
                //[PixelCrushers]return new LuaUserdata(writer, FileLib.CreateMetaTable());
                return null;
                case "a":
                case "a+":
                //[PixelCrushers]writer = File.AppendText(file.Text);
                //[PixelCrushers]return new LuaUserdata(writer, FileLib.CreateMetaTable());
                return null;
                default:
                    throw new ArgumentException("Invalid file open mode " + mode);
            }
        }
예제 #4
0
 public static LuaValue Yield(LuaValue[] args)
 {
     LuaCoroutine c = args[0] as LuaCoroutine;
     c.Pause();
     // TODO: set restart args
     return LuaNil.Nil;
 }
예제 #5
0
 public static LuaValue Wrap(LuaValue[] args)
 {
     LuaFunction f = args[0] as LuaFunction;
     LuaCoroutine c = new LuaCoroutine(f);
     LuaFunction f2 = new LuaFunction(new LuaFunc(delegate(LuaValue[] args2) { return LuaBoolean.From(c.Resume(args2)); }));
     return f2;
 }
예제 #6
0
파일: OSLib.cs 프로젝트: chenzuo/SharpLua
        public static LuaValue Date(LuaValue[] values)
        {
            LuaString format = null;
            if (values.Length > 0)
                format = values[0] as LuaString;
            if (format != null)
            {
                if (format.Text == "*t")
                {
                    LuaTable table = new LuaTable();
                    DateTime now = DateTime.Now;
                    table.SetNameValue("year", new LuaNumber (now.Year));
                    table.SetNameValue("month", new LuaNumber (now.Month ));
                    table.SetNameValue("day", new LuaNumber (now.Day));
                    table.SetNameValue("hour", new LuaNumber (now.Hour));
                    table.SetNameValue("min", new LuaNumber (now.Minute));
                    table.SetNameValue("sec", new LuaNumber (now.Second));
                    table.SetNameValue("wday", new LuaNumber ((int)now.DayOfWeek));
                    table.SetNameValue("yday", new LuaNumber (now.DayOfYear));
                    table.SetNameValue("isdst", LuaBoolean.From(now.IsDaylightSavingTime()));
                }
                else
                {
                    return new LuaString(DateTime.Now.ToString(format.Text));
                }
            }

            return new LuaString(DateTime.Now.ToShortDateString());
        }
예제 #7
0
        public static LuaValue Concat(LuaValue[] values)
        {
            LuaTable table = values[0] as LuaTable;
            LuaString separator = values.Length > 1 ? values[1] as LuaString : LuaString.Empty;
            LuaNumber startNumber = values.Length > 2 ? values[2] as LuaNumber : null;
            LuaNumber endNumber = values.Length > 3 ? values[3] as LuaNumber : null;

            int start = startNumber == null ? 1 : (int)startNumber.Number;
            int end = endNumber == null ? table.Count : (int)endNumber.Number;

            if (start > end)
            {
                return LuaString.Empty;
            }
            else
            {
                StringBuilder text = new StringBuilder();

                for (int index = start; index < end; index++)
                {
                    text.Append(table.GetValue(index).ToString());
                    text.Append(separator.Text);
                }
                text.Append(table.GetValue(end).ToString());

                return new LuaString(text.ToString());
            }
        }
예제 #8
0
        public override LuaValue Evaluate(LuaValue baseValue, LuaTable enviroment)
        {
            LuaValue value = LuaValue.GetKeyValue(baseValue, new LuaString(this.Method));
            LuaFunction function = value as LuaFunction;

            if (function != null)
            {
                if (this.Args.Table != null)
                {
                    return function.Function.Invoke(new LuaValue[] { baseValue, this.Args.Table.Evaluate(enviroment) });
                }
                else if (this.Args.String != null)
                {
                    return function.Function.Invoke(new LuaValue[] { baseValue, this.Args.String.Evaluate(enviroment) });
                }
                else
                {
                    //[PixelCrushers]List<LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                    List<LuaValue> args = LuaInterpreterExtensions.EvaluateAll(this.Args.ArgList, enviroment);
                    args.Insert(0, baseValue);
                    return function.Function.Invoke(args.ToArray());
                }
            }
            else
            {
                throw new Exception("Invoke method call on non function value.");
            }
        }
예제 #9
0
파일: FileLib.cs 프로젝트: Majiir/MuMechLib
        public static LuaValue Lines(LuaValue[] values)
        {
            LuaUserdata data = values[0] as LuaUserdata;
            TextReader reader = data.Value as TextReader;

            LuaFunction func = new LuaFunction((LuaValue[] args) =>
                {
                    LuaUserdata _data = values[0] as LuaUserdata;
                    TextReader _reader = data.Value as TextReader;

                    string line = _reader.ReadLine();

                    if (line != null)
                    {
                        return new LuaString(line);
                    }
                    else
                    {
                        return LuaNil.Nil;
                    }
                }
            );

            return new LuaMultiValue(new LuaValue[] { func, data, LuaNil.Nil });
        }
예제 #10
0
 public static LuaValue CreateClass(LuaValue[] args)
 {
     LuaTable from = new LuaTable();
     if (args.Length > 0)
         if (args[0].GetTypeCode() == "table" && ((IsClass(new LuaValue[] {args[0]}) as LuaBoolean).BoolValue == false))
             from = args[0] as LuaTable;
     LuaClass nClass = new LuaClass("CLASS_" + classCount++, false, false);
     List<LuaClass> Parents = new List<LuaClass>();
     for (int i = 0; i < args.Length; i++)
     {
         LuaClass c = args[i] as LuaClass;
         if (c == null)
             continue;
         if (c.Final)
             throw new Exception("Cannot inherit from a final class");
         else
         {
             Parents.Add(c);
             c.ChildClasses.Add(nClass);
         }
     }
     nClass.ParentClasses = Parents;
     TableLib.Copy(new LuaValue[] {nClass.Self, from});
     return nClass;
 }
예제 #11
0
파일: OSLib.cs 프로젝트: Majiir/MuMechLib
 public static LuaValue DiffTime(LuaValue[] args)
 {
     // FIXM
     DateTime t2 = DateTime.Parse(args[0].Value.ToString());
     DateTime t1 = DateTime.Parse(args[1].Value.ToString());
     return new LuaUserdata(t2 - t1);
 }
예제 #12
0
파일: FileLib.cs 프로젝트: Majiir/MuMechLib
 public static LuaValue Flush(LuaValue[] values)
 {
     LuaUserdata data = values[0] as LuaUserdata;
     TextWriter writer = data.Value as TextWriter;
     writer.Flush();
     return null;
 }
예제 #13
0
        private static LuaFunction GetMetaFunction(string name, LuaValue leftValue, LuaValue rightValue)
        {
            LuaTable left = leftValue as LuaTable;

            if (left != null)
            {
                LuaFunction func = left.GetValue(name) as LuaFunction;

                if (func != null)
                {
                    return func;
                }
            }
            LuaFunction f = leftValue.MetaTable.GetValue(name) as LuaFunction;
            if (f != null)
                return f;

            LuaTable right = rightValue as LuaTable;

            if (right != null)
            {
                return right.GetValue(name) as LuaFunction;
            }
            f = rightValue.MetaTable.GetValue(name) as LuaFunction;
            if (f != null)
                return f;

            return null;
        }
예제 #14
0
		public VariableUpdateEventArgs(VariableUpdateType type, LuaValue thread, VariableDetails[] vars, bool cacheFlush)
		{
			mType = type;
			mThread = thread;
			mVariables = vars;
			mCacheFlush = cacheFlush;
		}
예제 #15
0
        public static LuaValue Copy(LuaValue[] args)
        {
            LuaTable _new = (LuaTable) args[0];
            LuaTable old = (LuaTable) args[1];
            if (_new == null)
                throw new ArgumentNullException("Table to copy to cannot be nil!");
            if (old == null)
                throw new ArgumentNullException("Table to copy from cannot be nil!");
            if (old.Count == 0)
                return _new; // nothing to copy
            Dictionary<LuaValue, LuaValue> oldFields = (Dictionary<LuaValue, LuaValue>)old.KeyValuePairs;
            List<LuaValue> keys = new List<LuaValue>();
            List<LuaValue> values = new List<LuaValue>();

            foreach (LuaValue key in oldFields.Keys)
                keys.Add(key);
            foreach (LuaValue val in oldFields.Values)
                values.Add(val);

            // add to new table
            for (int i = 0; i < keys.Count; i++)
            {
                try {
                    _new.SetKeyValue(keys[i], values[i]);
                } catch (Exception ex) {
                    throw new Exception("Error copying at index " + i + ": " + ex.Message);
                }
            }
            return _new;
        }
예제 #16
0
        public static LuaValue[] UnWrapLuaValues(LuaValue[] values)
        {
            if (values == null || values.Length == 0 || ContainsMultiValue(values) == false)
                return values;

            if (values.Length == 1 && values[0] is LuaMultiValue)
                return (values[0] as LuaMultiValue).Values;

            List<LuaValue> neatValues = new List<LuaValue>(values.Length);

            for (int i = 0; i < values.Length - 1; i++)
            {
                LuaValue value = values[i];
                LuaMultiValue multiValue = value as LuaMultiValue;

                if (multiValue != null)
                    neatValues.Add(multiValue.Values[0]);
                else
                    neatValues.Add(value);
            }

            LuaValue lastValue = values[values.Length - 1];
            LuaMultiValue lastMultiValue = lastValue as LuaMultiValue;

            if (lastMultiValue != null)
                neatValues.AddRange(lastMultiValue.Values);
            else
                neatValues.Add(lastValue);

            return neatValues.ToArray();
        }
예제 #17
0
        public override LuaValue Evaluate(LuaValue baseValue, LuaTable enviroment)
        {
            LuaValue value = LuaValue.GetKeyValue(baseValue, new LuaString(this.Method));
            LuaFunction function = value as LuaFunction;

            if (function != null)
            {
                if (this.Args.Table != null)
                {
                    return function.Function.Invoke(new LuaValue[] { baseValue, this.Args.Table.Evaluate(enviroment) });
                }
                else if (this.Args.String != null)
                {
                    return function.Function.Invoke(new LuaValue[] { baseValue, this.Args.String.Evaluate(enviroment) });
                }
                else
                {
            //                    List<LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                    List<LuaValue> args = new List<LuaValue>();
                    foreach (var arg in this.Args.ArgList)
                        args.Add(arg.Evaluate(enviroment));
                    args.Insert(0, baseValue);
                    return function.Function.Invoke(args.ToArray());
                }
            }
            else
            {
                throw new Exception("Invoke method call on non function value.");
            }
        }
예제 #18
0
        /// <summary>
        /// Sets the assignment
        /// </summary>
        /// <param name="baseValue"></param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        private static void SetKeyValue(LuaValue baseValue, LuaValue key, LuaValue value)
        {
            LuaValue newIndex = LuaNil.Nil;
            LuaTable table = baseValue as LuaTable;
            if (table != null)
            {
                if (table.MetaTable != null)
                {
                    newIndex = table.MetaTable.GetValue("__newindex");
                    // to be finished at the end of this method
                }

                if (newIndex == LuaNil.Nil)
                {
                    table.SetKeyValue(key, value);
                    return;
                }
            }
            else if ((baseValue as LuaClass) != null)
            {
                LuaClass c = baseValue as LuaClass;
                // null checks (mainly for debugging)
                if (c.Self.MetaTable == null)
                    c.GenerateMetaTable();
                //throw new Exception("Class metatable is nil!");
                newIndex = c.Self.MetaTable.GetValue("__newindex");
                if (newIndex == LuaNil.Nil)
                    c.Self.SetKeyValue(key, value);
                else
                    (newIndex as LuaFunction).Invoke(new LuaValue[] { baseValue, key, value });
                return;
            }
            else
            {
                LuaUserdata userdata = baseValue as LuaUserdata;
                if (userdata != null)
                {
                    if (userdata.MetaTable != null)
                    {
                        newIndex = userdata.MetaTable.GetValue("__newindex");
                    }

                    if (newIndex == LuaNil.Nil)
                    {
                        throw new Exception("Assign field of userdata without __newindex defined.");
                    }
                }
            }

            LuaFunction func = newIndex as LuaFunction;
            if (func != null)
            {
                func.Invoke(new LuaValue[] { baseValue, key, value });
            }
            else
            {
                SetKeyValue(newIndex, key, value);
            }
        }
예제 #19
0
		public void WriteValue(LuaValue value)
		{
			Write((int)value.Type);
			if (value.Type == LuaValueType.NUMBER)
				WriteNumber(value.AsNumber());
			else
				WriteObjectID(value.Value);
		}
예제 #20
0
 public static LuaValue RunApp(LuaValue[] values)
 {
     LuaUserdata data = values[0] as LuaUserdata;
     Form form = (Form)data.Value;
     form.PerformLayout();
     Application.Run(form);
     return null;
 }
예제 #21
0
 public static LuaValue Create(LuaValue[] args)
 {
     LuaFunction func = args[0] as LuaFunction;
     if (func == null)
         throw new ArgumentException("Function expected, got '" + args[0].Value.GetType().Name + "'");
     LuaCoroutine c = new LuaCoroutine(func);
     return c;
 }
예제 #22
0
 public static LuaValue WrapLuaValues(LuaValue[] values)
 {
     if (values == null || values.Length == 0)
         return LuaNil.Nil;
     else if (values.Length == 1)
         return values[0];
     else
         return new LuaMultiValue(UnWrapLuaValues(values));
 }
예제 #23
0
 private static bool ContainsMultiValue(LuaValue[] values)
 {
     foreach (LuaValue value in values)
     {
         if (value is LuaMultiValue)
             return true;
     }
     return false;
 }
예제 #24
0
        public static LuaValue setmetatable(LuaValue[] values)
        {
            LuaTable table = values[0] as LuaTable;
            LuaTable metatable = values[1] as LuaTable;

            table.MetaTable = metatable;

            return null;
        }
예제 #25
0
파일: OSLib.cs 프로젝트: chenzuo/SharpLua
 public static LuaValue Execute(LuaValue[] values)
 {
     if (values.Length > 0)
     {
         LuaString command = values[0] as LuaString;
         System.Diagnostics.Process.Start(command.Text);
     }
     return new LuaNumber (1);
 }
예제 #26
0
        public bool Any(LuaValue[] collection, LuaFunction func)
        {
            foreach (var c in collection)
                using (var ret = func.Call(c))
                using (var result = ret.FirstOrDefault())
                    if (result != null && result.ToBoolean())
                        return true;

            return false;
        }
예제 #27
0
 public LuaValue InvokeMethod(LuaValue[] args)
 {
     if (Method == null || args == null) return LuaNil.Nil;
     object[] objectArgs = new object[args.Length];
     for (int i = 0; i < args.Length; i++) {
         objectArgs[i] = LuaInterpreterExtensions.LuaValueToObject(args[i]);
     }
     object result = Method.Invoke(Target, objectArgs);
     return LuaInterpreterExtensions.ObjectToLuaValue(result);
 }
예제 #28
0
 // Lua function for formatting strings
 public static LuaValue format(LuaValue[] values)
 {
     LuaString format = values[0] as LuaString;
     object[] args = new object[values.Length - 1];
     for (int i = 0; i < args.Length; i++)
     {
         args[i] = values[i + 1].Value;
     }
     return new LuaString(string.Format(format.Text, args));
 }
예제 #29
0
        public static LuaValue Find(LuaValue[] args)
        {
            LuaValue v = args[0] as LuaValue;
            LuaTable t = args[1] as LuaTable;
            foreach (LuaValue key in t.Keys)
                if (key.Value == v.Value)
                    return key;

            return LuaNil.Nil;
        }
예제 #30
0
 public static LuaValue rep(LuaValue[] values)
 {
     LuaString str = values[0] as LuaString;
     LuaNumber number = values[1] as LuaNumber;
     StringBuilder text = new StringBuilder();
     for (int i = 0; i < number.Number; i++)
     {
         text.Append(str.Text);
     }
     return new LuaString(text.ToString());
 }
예제 #31
0
 static bool ConvertToBoolean(LuaValue val) => val.Value switch
 {
     null => false,
예제 #32
0
        public static LuaValue GSub(LuaValue[] args)
        {
            int totalReplaces = 0;
            // string.gsub (s, pattern, repl [, n])
            string   s      = args[0].ToString();
            string   format = args[1].ToString();
            LuaValue r      = args[2];
            int      n      = -1;

            if (args.Length > 3)
            {
                n = int.Parse(args[3].ToString());
            }

            Regex re = new Regex(format);
            Match m  = re.Match(s);

            string result       = string.Empty;
            int    lastposition = 0;

            while (m.Success && (n < 0 || totalReplaces < n))
            {
                for (int i = 0; i < m.Groups.Count; i++)
                {
                    Group             g  = m.Groups[i];
                    CaptureCollection cc = g.Captures;
                    for (int j = 0; j < cc.Count; j++)
                    {
                        Capture c = cc[j];
                        if (r is LuaString)
                        {
                            result += s.Substring(lastposition, c.Index - lastposition) + (r as LuaString).Text;
                        }
                        else if (r is LuaFunction)
                        {
                            object o  = (r as LuaFunction).Invoke(new LuaValue[] { new LuaString(c.Value) });
                            string s2 = c.Value;
                            if (o != null && o != LuaNil.Nil)
                            {
                                s2 = o.ToString();
                            }
                            result += s.Substring(lastposition, c.Index - lastposition) + s2;
                        }
                        else if (r is LuaTable)
                        {
                            result += s.Substring(lastposition, c.Index - lastposition) + ((r as LuaTable).GetValue(c.Value) == null || (r as LuaTable).GetValue(c.Value) == LuaNil.Nil ? s.Substring(c.Index, c.Length) : (r as LuaTable).GetValue(c.Value).ToString());
                        }
                        lastposition = c.Index + c.Length;
                        totalReplaces++;

                        if (n > -1 && totalReplaces == n)
                        {
                            break;
                        }
                    }
                }
                m = m.NextMatch();
            }
            result += s.Substring(lastposition);
            return(new LuaMultiValue(new LuaValue[] { new LuaString(result), new LuaNumber(totalReplaces) }));
        }
예제 #33
0
        public LuaArgs date(LuaArgs args)
        {
            string format;

            if (!args.IsNil(0))
            {
                format = args.GetString(0);
            }
            else
            {
                format = "%c";
            }

            DateTime time;

            if (!args.IsNil(1))
            {
                var seconds = args.GetDouble(1);
                time = DateFromTime(seconds);
            }
            else
            {
                var clockDevice = FindClock();
                if (clockDevice != null)
                {
                    time = clockDevice.Time;
                }
                else
                {
                    time = DateFromTime(0.0);
                }
            }
            if (format.StartsWith("!", StringComparison.InvariantCulture))
            {
                time   = time.ToUniversalTime();
                format = format.Substring(1);
            }
            else
            {
                time = time.ToLocalTime();
            }
            if (format.Equals("*t"))
            {
                var result = new LuaTable(10);
                result["year"]  = new LuaValue(time.Year);
                result["month"] = new LuaValue(time.Month);
                result["day"]   = new LuaValue(time.Day);
                result["hour"]  = new LuaValue(time.Hour);
                result["min"]   = new LuaValue(time.Minute);
                result["sec"]   = new LuaValue(time.Second);
                result["wday"]  = new LuaValue((int)time.DayOfWeek + 1);
                result["yday"]  = new LuaValue(time.DayOfYear);
                result["isdst"] = new LuaValue(time.IsDaylightSavingTime());
                result["isutc"] = new LuaValue(time.Kind == DateTimeKind.Utc);
                return(new LuaArgs(result));
            }
            else
            {
                try
                {
                    return(new LuaArgs(StrFTime(time, format)));
                }
                catch (FormatException e)
                {
                    throw new LuaError(e.Message);
                }
            }
        }
예제 #34
0
        public LuaTable ReinforceWithTransport(Player owner, string actorType, string[] cargoTypes, CPos[] entryPath, CPos[] exitPath = null,
                                               LuaFunction actionFunc = null, LuaFunction exitFunc = null, int dropRange = 3)
        {
            var transport = CreateActor(owner, actorType, true, entryPath[0], entryPath.Length > 1 ? entryPath[1] : (CPos?)null);
            var cargo     = transport.TraitOrDefault <Cargo>();

            var passengers = new List <Actor>();

            if (cargo != null && cargoTypes != null)
            {
                foreach (var cargoType in cargoTypes)
                {
                    var passenger = CreateActor(owner, cargoType, false, entryPath[0]);
                    passengers.Add(passenger);
                    cargo.Load(transport, passenger);
                }
            }

            for (var i = 1; i < entryPath.Length; i++)
            {
                Move(transport, entryPath[i]);
            }

            if (actionFunc != null)
            {
                var af = (LuaFunction)actionFunc.CopyReference();
                transport.QueueActivity(new CallFunc(() =>
                {
                    using (af)
                        using (LuaValue t = transport.ToLuaValue(Context), p = passengers.ToArray().ToLuaValue(Context))
                            af.Call(t, p);
                }));
            }
            else
            {
                var aircraft = transport.TraitOrDefault <Aircraft>();
                if (aircraft != null)
                {
                    var destination = entryPath.Last();

                    // Try to find an alternative landing spot if we can't land at the current destination
                    if (!aircraft.CanLand(destination) && dropRange > 0)
                    {
                        var mobiles = cargo != null?cargo.Passengers.Select(a =>
                        {
                            var mobileInfo = a.Info.TraitInfoOrDefault <MobileInfo>();
                            if (mobileInfo == null)
                            {
                                return(new Pair <MobileInfo, uint>(null, 0));
                            }

                            return(new Pair <MobileInfo, uint>(mobileInfo, (uint)mobileInfo.GetMovementClass(a.World.Map.Rules.TileSet)));
                        }) : new Pair <MobileInfo, uint> [0];

                        foreach (var c in transport.World.Map.FindTilesInCircle(destination, dropRange))
                        {
                            if (!aircraft.CanLand(c))
                            {
                                continue;
                            }

                            if (!mobiles.All(m => m.First == null || domainIndex.IsPassable(destination, c, m.First, m.Second)))
                            {
                                continue;
                            }

                            destination = c;
                            break;
                        }
                    }

                    if (aircraft.Info.VTOL)
                    {
                        if (destination != entryPath.Last())
                        {
                            Move(transport, destination);
                        }

                        transport.QueueActivity(new Turn(transport, aircraft.Info.InitialFacing));
                        transport.QueueActivity(new HeliLand(transport, true));
                    }
                    else
                    {
                        transport.QueueActivity(new Land(transport, Target.FromCell(transport.World, destination)));
                    }

                    transport.QueueActivity(new Wait(15));
                }

                if (cargo != null)
                {
                    transport.QueueActivity(new UnloadCargo(transport, true));
                    transport.QueueActivity(new WaitFor(() => cargo.IsEmpty(transport)));
                }

                transport.QueueActivity(new Wait(aircraft != null ? 50 : 25));
            }

            if (exitFunc != null)
            {
                var ef = (LuaFunction)exitFunc.CopyReference();
                transport.QueueActivity(new CallFunc(() =>
                {
                    using (ef)
                        using (var t = transport.ToLuaValue(Context))
                            ef.Call(t);
                }));
            }
            else if (exitPath != null)
            {
                foreach (var wpt in exitPath)
                {
                    Move(transport, wpt);
                }

                transport.QueueActivity(new RemoveSelf());
            }

            var ret = Context.CreateTable();

            using (LuaValue
                   tKey = 1,
                   tValue = transport.ToLuaValue(Context),
                   pKey = 2,
                   pValue = passengers.ToArray().ToLuaValue(Context))
            {
                ret.Add(tKey, tValue);
                ret.Add(pKey, pValue);
            }

            return(ret);
        }
예제 #35
0
    /// <summary>
    /// 解析脚本按钮点击
    /// </summary>
    public void evalScriptButtonClickedHandler()
    {
        LuaValue retValue = LuaContext.currentContext.evalScript("print(10);return 'Hello World';");

        Debug.Log(string.Format("{0}", retValue.toString()));
    }
예제 #36
0
        public static Vector3d valueToVector3d(LuaValue val)
        {
            Vector3d ret = Vector3d.zero;

            LuaTable  t = val as LuaTable;
            LuaString s = val as LuaString;

            if (t != null)
            {
                try
                {
                    ret.x = (t.GetValue(1) as LuaNumber).Number;
                }
                catch (Exception)
                {
                    throw new ArgumentException("Invalid vector x value");
                }
                try
                {
                    ret.y = (t.GetValue(2) as LuaNumber).Number;
                }
                catch (Exception)
                {
                    throw new ArgumentException("Invalid vector y value");
                }
                try
                {
                    ret.z = (t.GetValue(3) as LuaNumber).Number;
                }
                catch (Exception)
                {
                    throw new ArgumentException("Invalid vector z value");
                }
            }
            else if (s != null)
            {
                switch (s.Text)
                {
                case "forward":
                case "f":
                    ret = Vector3d.forward;
                    break;

                case "back":
                case "b":
                    ret = Vector3d.back;
                    break;

                case "left":
                case "l":
                    ret = Vector3d.left;
                    break;

                case "right":
                case "r":
                    ret = Vector3d.right;
                    break;

                case "up":
                case "u":
                    ret = Vector3d.up;
                    break;

                case "down":
                case "d":
                    ret = Vector3d.down;
                    break;

                default:
                    throw new ArgumentException("Invalid vector string");
                }
            }
            else
            {
                throw new ArgumentException("Invalid vector");
            }

            return(ret);
        }
예제 #37
0
 public void Add(string key, LuaValue value)
 {
     _table.Add(key, value);
 }
예제 #38
0
        public static bool TryGetClrValue(this LuaValue value, Type t, out object clrObject)
        {
            // Is t a nullable?
            // If yes, get the underlying type
            var nullable = Nullable.GetUnderlyingType(t);

            if (nullable != null)
            {
                t = nullable;
            }

            // Value wraps a CLR object
            if (value.TryGetClrObject(out var temp))
            {
                if (temp.GetType() == t)
                {
                    clrObject = temp;
                    return(true);
                }
            }

            if (value is LuaNil && !t.IsValueType)
            {
                clrObject = null;
                return(true);
            }

            if (value is LuaBoolean && t.IsAssignableFrom(typeof(bool)))
            {
                clrObject = value.ToBoolean();
                return(true);
            }

            if (value is LuaNumber && t.IsAssignableFrom(typeof(double)))
            {
                clrObject = value.ToNumber().Value;
                return(true);
            }

            // Need an explicit test for double -> int
            // TODO: Lua 5.3 will introduce an integer type, so this will be able to go away
            if (value is LuaNumber && t.IsAssignableFrom(typeof(int)))
            {
                clrObject = (int)value.ToNumber().Value;
                return(true);
            }

            if (value is LuaNumber && t.IsAssignableFrom(typeof(short)))
            {
                clrObject = (short)value.ToNumber().Value;
                return(true);
            }

            if (value is LuaNumber && t.IsAssignableFrom(typeof(byte)))
            {
                clrObject = (byte)value.ToNumber().Value;
                return(true);
            }

            if (value is LuaString && t.IsAssignableFrom(typeof(string)))
            {
                clrObject = value.ToString();
                return(true);
            }

            if (value is LuaFunction && t.IsAssignableFrom(typeof(LuaFunction)))
            {
                clrObject = value;
                return(true);
            }

            if (value is LuaTable && t.IsAssignableFrom(typeof(LuaTable)))
            {
                clrObject = value;
                return(true);
            }

            // Translate LuaTable<int, object> -> object[]
            if (value is LuaTable && t.IsArray)
            {
                var innerType = t.GetElementType();
                var table     = (LuaTable)value;
                var array     = Array.CreateInstance(innerType, table.Count);
                var i         = 0;

                foreach (var kv in table)
                {
                    using (kv.Key)
                    {
                        object element;
                        if (innerType == typeof(LuaValue))
                        {
                            element = kv.Value;
                        }
                        else
                        {
                            var elementHasClrValue = kv.Value.TryGetClrValue(innerType, out element);
                            if (!elementHasClrValue || !(element is LuaValue))
                            {
                                kv.Value.Dispose();
                            }
                            if (!elementHasClrValue)
                            {
                                throw new LuaException($"Unable to convert table value of type {kv.Value.WrappedClrType()} to type {innerType}");
                            }
                        }

                        array.SetValue(element, i++);
                    }
                }

                clrObject = array;
                return(true);
            }

            // Value isn't of the requested type.
            // Set a default output value and return false
            // Value types are assumed to specify a default constructor
            clrObject = t.IsValueType ? Activator.CreateInstance(t) : null;
            return(false);
        }
예제 #39
0
파일: Player.cs 프로젝트: lujiawen/OpenRA
 public LuaValue this[LuaRuntime runtime, LuaValue keyValue]
 {
     get => luaInterface.Value[runtime, keyValue];
예제 #40
0
 public ElementData(string key, LuaValue value, DataSyncType syncType)
 {
     this.Key      = key;
     this.Value    = value;
     this.SyncType = syncType;
 }
예제 #41
0
        public static LuaValue ToLuaValue(this object obj, ScriptContext context)
        {
            if (obj is LuaValue)
            {
                return((LuaValue)obj);
            }

            if (obj == null)
            {
                return(LuaNil.Instance);
            }

            if (obj is double)
            {
                return((LuaValue)(double)obj);
            }

            if (obj is int)
            {
                return((LuaValue)(int)obj);
            }

            if (obj is bool)
            {
                return((LuaValue)(bool)obj);
            }

            if (obj is string)
            {
                return((LuaValue)(string)obj);
            }

            if (obj is IScriptBindable)
            {
                // Object needs additional notification / context
                var notify = obj as IScriptNotifyBind;
                if (notify != null)
                {
                    notify.OnScriptBind(context);
                }

                return(new LuaCustomClrObject(obj));
            }

            if (obj is Array)
            {
                var array = (Array)obj;
                var i     = 1;
                var table = context.CreateTable();

                foreach (var x in array)
                {
                    using (LuaValue key = i++, value = x.ToLuaValue(context))
                        table.Add(key, value);
                }

                return(table);
            }

            throw new InvalidOperationException("Cannot convert type '{0}' to Lua. Class must implement IScriptBindable.".F(obj.GetType()));
        }
예제 #42
0
    System.Collections.IEnumerator LoadCoroutine()
    {
        // Verify that the directory exists and grab its files.
        string        directoryPath = FAGameComponent.Instance.MakeAbsolutePath("/units/" + _unitID);
        DirectoryInfo directory     = new DirectoryInfo(directoryPath);

        if (!directory.Exists)
        {
            Debug.LogError(directoryPath + " does not exist.");
            yield break;
        }
        IEnumerable <FileInfo> directoryFiles = directory.GetFiles();

        // Load the BP, so we know what mesh, animations, and textures to load and what shaders to load.
        FileInfo blueprintFile = directoryFiles.FirstOrDefault(x => x.Name.EndsWith("_unit.bp", StringComparison.CurrentCultureIgnoreCase));

        if (blueprintFile == null || !blueprintFile.Exists)
        {
            Debug.LogError(directoryPath + " does not contain a unit blueprint.");
            yield break;
        }
        BPImporter.Load(gameObject, blueprintFile);
        _blueprint = GetComponent <BPComponent>();
        yield return(null);

        // Save the BP to test the BP exporter.
        FileInfo blueprintFileExport = new FileInfo(directoryPath + "/exportTest.bp");

        BPExporter.Save(_blueprint, blueprintFileExport);
        yield return(null);

        // Get the LOD0 files.
        LODFiles lod0 = GetLODFiles(0, directoryFiles);

        if (lod0.mesh == null)
        {
            Debug.LogError(directoryPath + " does not contain an LOD0.scm file.");
            yield break;
        }

        // Load the mesh.
        SCMImporter.Load(gameObject, lod0.mesh);

        // Apply the blueprint's scale.
        LuaValue scaleVal = _blueprint.Get("Display.UniformScale");
        float    scale    = (scaleVal == null || scaleVal.LVT != LuaValueType.LVT_Float) ? 1.0f : scaleVal.FloatValue;

        transform.root.localScale = new Vector3(scale, scale, scale);
        yield return(null);

        // Iteratively load the DDS files.
        for (DDSImporter.LoadStages i = DDSImporter.LoadStages.Init; i < DDSImporter.LoadStages.Count; ++i)
        {
            bool success = DDSImporter.LoadStage(i, gameObject, lod0);
            yield return(null);

            if (!success)
            {
                break;
            }
        }

        // Load the SCAs referenced in the blueprint.
        List <FileInfo> scaFiles = GetSCAFiles();

        foreach (FileInfo scaFile in scaFiles)
        {
            SCAImporter.Load(gameObject, scaFile);
            yield return(null);
        }
        Animation animComponent = gameObject.GetComponentInParent <Animation>();

        /*if (animComponent.GetClipCount() > 0)
         * {
         *      Debug.Log("Playing animation " + scaFiles[0].Name);
         *      animComponent.clip = animComponent.GetClip(scaFiles[0].Name);
         *      animComponent.Play(scaFiles[0].Name);
         * }*/
    }
예제 #43
0
 public void Add(LuaValue Val)
 {
     Items.Add(Val.ToStringAsValue() + ",");
 }
예제 #44
0
 public LuaKV(String Key, LuaValue Value) : this(new LuaString(Key, LuaStringStyle.Identifier), Value)
 {
 }
예제 #45
0
 public Triggerable(LuaFunction function, ScriptContext context, Actor self)
 {
     Function = (LuaFunction)function.CopyReference();
     Context  = context;
     Self     = self.ToLuaValue(Context);
 }
예제 #46
0
 public bool TryGetValue(string key, out LuaValue value)
 {
     return(_table.TryGetValue(key, out value));
 }
예제 #47
0
 public partial void Parse(LuaValue luaValue);
예제 #48
0
    public static void Load(GameObject gameObject, FileInfo bpFile)
    {
        BPComponent bpComponent = gameObject.GetComponent <BPComponent>();

        using (StreamReader reader = new StreamReader(bpFile.OpenRead(), Encoding.UTF8))
        {
            Stack <TableBuilder> tableStack = new Stack <TableBuilder>();

            StringBuilder input = new StringBuilder();
            while (reader.Peek() >= 0)
            {
                char c = (char)reader.Read();
                input.Append(c);

                // Skip over whitespace.
                if (char.IsWhiteSpace(c))
                {
                    while (reader.Peek() >= 0)
                    {
                        char next = (char)reader.Peek();
                        if (char.IsWhiteSpace(next))
                        {
                            reader.Read();
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                c = input[input.Length - 1];
                // Equals denotes the end of an identifier.
                if (c == '=')
                {
                    input.Remove(input.Length - 1, 1);
                    string id = input.ToString();
                    id = id.Trim();
                    input.Remove(0, input.Length);
                    if (id.Length > 0)
                    {
                        tableStack.Peek().PushID(id);
                    }
                }
                // Number signs and -- indicate a comment.
                else if (c == '#')
                {
                    input.Remove(input.Length - 1, 1);
                    reader.ReadLine();
                }
                else if (c == '-')
                {
                    if (reader.Peek() == '-')
                    {
                        input.Remove(input.Length - 1, 1);
                        reader.ReadLine();
                    }
                }
                // Quotes indicate the beginning of a string.
                else if (c == '\"')
                {
                    input.Remove(input.Length - 1, 1);
                    string val = ReadString(reader, '\"');
                    if (val == null)
                    {
                        Debug.LogError("String parse error.");
                        return;
                    }
                    TableBuilder builder = tableStack.Peek();
                    EncounteredString(builder.table, builder.PopID(), val);
                }
                else if (c == '\'')
                {
                    input.Remove(input.Length - 1, 1);
                    string val = ReadString(reader, '\'');
                    if (val == null)
                    {
                        Debug.LogError("String parse error.");
                        return;
                    }
                    TableBuilder builder = tableStack.Peek();
                    EncounteredString(builder.table, builder.PopID(), val);
                }
                // Curly brace indicates a table.
                else if (c == '{')
                {
                    input.Remove(input.Length - 1, 1);
                    string tableName = input.ToString();
                    tableName = tableName.Trim();
                    input.Remove(0, input.Length);
                    if (tableName.Length == 0)
                    {
                        tableName = null;
                    }

                    StartTable(tableStack, tableName);
                }
                else if (c == '}')
                {
                    input.Remove(input.Length - 1, 1);
                    LuaValue root = EndTable(tableStack);
                    if (root != null)
                    {
                        bpComponent.SetRoot(root);
                        break;
                    }
                }
                // Whitespace or comma denotes the end of a token.
                else if (char.IsWhiteSpace(c) || c == ',')
                {
                    input.Remove(input.Length - 1, 1);
                    string val = input.ToString();
                    val = val.Trim();
                    input.Remove(0, input.Length);

                    if (val.Length > 0)
                    {
                        if (val == "true")
                        {
                            TableBuilder builder = tableStack.Peek();
                            EncounteredBool(builder.table, builder.PopID(), true);
                        }
                        else if (val == "false")
                        {
                            TableBuilder builder = tableStack.Peek();
                            EncounteredBool(builder.table, builder.PopID(), false);
                        }
                        else if (val == "nil")
                        {
                            TableBuilder builder = tableStack.Peek();
                            EncounteredNil(builder.table, builder.PopID());
                        }
                        else
                        {
                            float f = 0.0f;
                            if (float.TryParse(val, out f))
                            {
                                TableBuilder builder = tableStack.Peek();
                                EncounteredFloat(builder.table, builder.PopID(), f);
                            }
                            else if (c != ',')
                            {
                                input.Append(val);
                            }
                            else
                            {
                                Debug.LogError("Token parse error: " + val + " " + c);
                                //input.Append(val);
                            }
                        }
                    }
                }
            }
        }
    }
예제 #49
0
        public override LuaValue Evaluate(LuaValue baseValue, LuaTable enviroment)
        {
            LuaValue key = this.Key.Evaluate(enviroment);

            return(LuaValue.GetKeyValue(baseValue, key));
        }
예제 #50
0
 public abstract LuaValue Evaluate(LuaValue baseValue, LuaTable enviroment);
예제 #51
0
        public LuaValue Compare(LuaState luaState, int index1, int index2, TokenType opType)
        {
            LuaValue luaValue1 = luaState.Get(index1);
            LuaValue luaValue2 = luaState.Get(index2);

            try
            {
                return(operatorDic[opType](luaValue1, luaValue2));
            }
            catch (Exception e)
            {
                switch (opType)
                {
                case TokenType.Equal:
                {
                    if ((bool)(luaValue1 != luaValue2).OValue)
                    {
                        LuaValue result = null;
                        try
                        {
                            if (luaState.CallMetaFunc(luaValue1, luaValue2, GetMetaFuncName(opType), out result))
                            {
                                return(result);
                            }
                            else
                            {
                                throw new Exception("没有找到对应的元方法进行比较!");
                            }
                        }
                        catch (Exception ee)
                        {
                            throw e;
                        }
                    }
                    else
                    {
                        return(luaValue1 == luaValue2);
                    }
                }

                default:
                {
                    LuaValue result = null;
                    try
                    {
                        if (luaState.CallMetaFunc(luaValue1, luaValue2, GetMetaFuncName(opType), out result))
                        {
                            return(result);
                        }
                        else
                        {
                            throw new Exception("没有找到对应的元方法进行比较!");
                        }
                    }
                    catch (Exception ee)
                    {
                        throw e;
                    }
                }
                }
            }
        }
예제 #52
0
 public LuaValue this[LuaRuntime runtime, LuaValue keyValue]
 {
     get { return(luaInterface.Value[runtime, keyValue]); }
     set { luaInterface.Value[runtime, keyValue] = value; }
 }
예제 #53
0
 public LuaValue this[LuaValue key]
 {
     get => Get(key);
예제 #54
0
        ActorInit CreateInit(string initName, LuaValue value)
        {
            // Find the requested type
            var initInstance = initName.Split(ActorInfo.TraitInstanceSeparator);
            var initType     = Game.ModData.ObjectCreator.FindType(initInstance[0] + "Init");

            if (initType == null)
            {
                throw new LuaException("Unknown initializer type '{0}'".F(initInstance[0]));
            }

            // Construct the ActorInit.
            var init = (ActorInit)FormatterServices.GetUninitializedObject(initType);

            if (initInstance.Length > 1)
            {
                initType.GetField("InstanceName").SetValue(init, initInstance[1]);
            }

            var compositeInit = init as CompositeActorInit;
            var tableValue    = value as LuaTable;

            if (tableValue != null && compositeInit != null)
            {
                var args       = compositeInit.InitializeArgs();
                var initValues = new Dictionary <string, object>();
                foreach (var kv in tableValue)
                {
                    using (kv.Key)
                        using (kv.Value)
                        {
                            var  key = kv.Key.ToString();
                            Type type;
                            if (!args.TryGetValue(key, out type))
                            {
                                throw new LuaException("Unknown initializer type '{0}.{1}'".F(initInstance[0], key));
                            }

                            object clrValue;
                            var    isActorReference = type == typeof(ActorInitActorReference);
                            if (isActorReference)
                            {
                                type = kv.Value is LuaString ? typeof(string) : typeof(Actor);
                            }

                            if (!kv.Value.TryGetClrValue(type, out clrValue))
                            {
                                throw new LuaException("Invalid data type for '{0}.{1}' (expected {2}, got {3})".F(initInstance[0], key, type.Name, kv.Value.WrappedClrType()));
                            }

                            if (isActorReference)
                            {
                                clrValue = type == typeof(string) ? new ActorInitActorReference((string)clrValue) : new ActorInitActorReference((Actor)clrValue);
                            }

                            initValues[key] = clrValue;
                        }
                }

                compositeInit.Initialize(initValues);
                return(init);
            }

            // HACK: Forward compatibility for future WAngle facings
            var facingInit = init as FacingInit;

            if (facingInit != null)
            {
                WAngle angle;
                if (value.TryGetClrValue(out angle))
                {
                    facingInit.Initialize(angle.Facing);
                    return(facingInit);
                }

                Game.Debug("Initializing Facing with integers is deprecated. Use Angle instead.");
            }

            var initializers = initType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                               .Where(m => m.Name == "Initialize" && m.GetParameters().Length == 1);

            foreach (var initializer in initializers)
            {
                var parameterType = initializer.GetParameters().First().ParameterType;
                var valueType     = parameterType.IsEnum ? Enum.GetUnderlyingType(parameterType) : parameterType;

                // Try and coerce the table value to the required type
                object clrValue;
                if (!value.TryGetClrValue(valueType, out clrValue))
                {
                    continue;
                }

                initializer.Invoke(init, new[] { clrValue });

                return(init);
            }

            var types = initializers.Select(y => y.GetParameters()[0].ParameterType.Name).JoinWith(", ");

            throw new LuaException("Invalid data type for '{0}' (expected one of {1})".F(initInstance[0], types));
        }
예제 #55
0
    private static void SaveLuaValue(LuaValue luaValue, StreamWriter writer, string tableIndent)
    {
        switch (luaValue.LVT)
        {
        case LuaValueType.LVT_Nil:
        {
            writer.Write("Nil");
            break;
        }

        case LuaValueType.LVT_String:
        {
            writer.Write('\'');

            string sanitizedString = luaValue.StringValue;
            sanitizedString.Replace("'", "\\'");
            sanitizedString.Replace("\"", "\\\"");

            writer.Write(sanitizedString);
            writer.Write('\'');
            break;
        }

        case LuaValueType.LVT_Float:
        {
            writer.Write(luaValue.FloatValue);
            break;
        }

        case LuaValueType.LVT_Bool:
        {
            writer.Write(luaValue.BoolValue ? "true" : "false");
            break;
        }

        case LuaValueType.LVT_Table:
        {
            LuaTable table = luaValue.TableValue;

            if (table.Name != null)
            {
                writer.Write(table.Name);
                writer.Write(' ');
            }
            writer.Write("{\n");

            ICollection <string> tableKeys = table.Keys;
            foreach (string tableKey in tableKeys)
            {
                writer.Write(tableIndent);

                writer.Write(tableKey);
                writer.Write(" = ");

                LuaValue tableValue = null;
                if (table.TryGetValue(tableKey, out tableValue))
                {
                    SaveLuaValue(tableValue, writer, tableIndent + "	");
                }
                else
                {
                    writer.Write("TABLE SAVE FAILURE");
                }

                writer.Write(",\n");
            }

            writer.Write(tableIndent.Substring(1));
            writer.Write("}");

            break;
        }

        default:
            Debug.LogError("Invalid LVT.");
            break;
        }
    }
예제 #56
0
        public override LuaValue Evaluate(LuaValue baseValue, LuaTable enviroment)
        {
            LuaValue value = null;

            try { LuaValue.GetKeyValue(baseValue, new LuaString(this.Method)); } catch (Exception) { }
            LuaFunction function = value as LuaFunction;

            if (function != null)
            {
                if (this.Args.Table != null)
                {
                    return(function.Function.Invoke(new LuaValue[] { baseValue, this.Args.Table.Evaluate(enviroment) }));
                }
                else if (this.Args.String != null)
                {
                    return(function.Function.Invoke(new LuaValue[] { baseValue, this.Args.String.Evaluate(enviroment) }));
                }
                else
                {
                    List <LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                    args.Insert(0, baseValue);
                    return(function.Function.Invoke(args.ToArray()));
                }
            } // method call on table would be like _G:script()
            else if ((baseValue as LuaTable) != null)
            {
                List <LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                return(((baseValue as LuaTable).MetaTable.GetValue("__call") as LuaFunction).Invoke(args.ToArray()));
            }
            else if ((baseValue as LuaClass) != null)
            {
                LuaClass        c    = baseValue as LuaClass;
                List <LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                args.Insert(0, new LuaString(this.Method));
                if (c.Self.MetaTable == null)
                {
                    c.GenerateMetaTable();
                }
                return((c.Self.MetaTable.GetValue("__call") as LuaFunction).Invoke(args.ToArray()));
            }
            else if ((baseValue as LuaUserdata) != null)
            {
                List <LuaValue> args = this.Args.ArgList.ConvertAll(arg => arg.Evaluate(enviroment));
                LuaUserdata     obj  = baseValue as LuaUserdata;
                object          o    = obj.Value;
                if (obj.MetaTable != null)
                {
                    if (obj.MetaTable.GetValue(this.Method) != null)
                    {
                        LuaValue o2 = obj.MetaTable.GetValue(this.Method);
                        if ((o2 as LuaFunction) != null)
                        {
                            return((o2 as LuaFunction).Invoke(args.ToArray()));
                        }
                        else if ((o2 as LuaTable) != null)
                        {
                            throw new NotImplementedException(); // TODO
                        }
                    }
                }
                return(ObjectToLua.ToLuaValue(o.GetType().GetMethod(this.Method, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Invoke(o, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, args.ToArray(), CultureInfo.CurrentCulture)));
            }
            else
            {
                throw new Exception("Invoke method call on non function value.");
            }
        }
예제 #57
0
 public static LuaValue Add(LuaValue a, LuaValue b)
 {
     return(LuaValue.Nil);
 }
예제 #58
0
        public LuaTable ReinforceWithTransport(Player owner, string actorType, string[] cargoTypes, CPos[] entryPath, CPos[] exitPath = null,
                                               LuaFunction actionFunc = null, LuaFunction exitFunc = null, int dropRange = 3)
        {
            var transport = CreateActor(owner, actorType, true, entryPath[0], entryPath.Length > 1 ? entryPath[1] : (CPos?)null);
            var cargo     = transport.TraitOrDefault <Cargo>();

            var passengers = new List <Actor>();

            if (cargo != null && cargoTypes != null)
            {
                foreach (var cargoType in cargoTypes)
                {
                    var passenger = CreateActor(owner, cargoType, false, entryPath[0]);
                    passengers.Add(passenger);
                    cargo.Load(transport, passenger);
                }
            }

            for (var i = 1; i < entryPath.Length; i++)
            {
                Move(transport, entryPath[i]);
            }

            if (actionFunc != null)
            {
                var af = (LuaFunction)actionFunc.CopyReference();
                transport.QueueActivity(new CallFunc(() =>
                {
                    using (af)
                        using (LuaValue t = transport.ToLuaValue(Context), p = passengers.ToArray().ToLuaValue(Context))
                            af.Call(t, p);
                }));
            }
            else
            {
                var aircraft = transport.TraitOrDefault <Aircraft>();

                // Scripted cargo aircraft must turn to default position before unloading.
                // TODO: pass facing through UnloadCargo instead.
                if (aircraft != null)
                {
                    transport.QueueActivity(new Land(transport, Target.FromCell(transport.World, entryPath.Last()), WDist.FromCells(dropRange), aircraft.Info.InitialFacing));
                }

                if (cargo != null)
                {
                    transport.QueueActivity(new UnloadCargo(transport, WDist.FromCells(dropRange)));
                }
            }

            if (exitFunc != null)
            {
                var ef = (LuaFunction)exitFunc.CopyReference();
                transport.QueueActivity(new CallFunc(() =>
                {
                    using (ef)
                        using (var t = transport.ToLuaValue(Context))
                            ef.Call(t);
                }));
            }
            else if (exitPath != null)
            {
                foreach (var wpt in exitPath)
                {
                    Move(transport, wpt);
                }

                transport.QueueActivity(new RemoveSelf());
            }

            var ret = Context.CreateTable();

            using (LuaValue
                   tKey = 1,
                   tValue = transport.ToLuaValue(Context),
                   pKey = 2,
                   pValue = passengers.ToArray().ToLuaValue(Context))
            {
                ret.Add(tKey, tValue);
                ret.Add(pKey, pValue);
            }

            return(ret);
        }
예제 #59
0
 public static void retainHandler(LuaFunction handler)
 {
     _func = new LuaValue(handler);
     LuaContext.currentContext.retainValue(_func);
 }
예제 #60
0
 public LuaKV(LuaValue Key, LuaValue Value)
 {
     _Key = Key; _Value = Value;
 }