Exemple #1
0
        public static void resume(LuaInterop lua)
        {
            LuaThread co = lua.Argument <LuaThread>(0);

            co.BeginResume(lua.ArgumentCount - 1);
            for (int argument = 0; argument < lua.ArgumentCount - 1; ++argument)
            {
                co.ResumeArgument(argument, lua.Argument(argument));
            }

            int resultCount;

            try
            {
                resultCount = co.Resume(LuaThread.VarResult);
            }
            catch (Exception e)
            {
                lua.BeginReturn(2);
                lua.ReturnResult(0, false);
                lua.ReturnResult(1, e.Message);
                lua.EndReturn();
                return;
            }

            lua.BeginReturn(resultCount + 1);
            lua.ReturnResult(0, true);
            for (int result = 0; result < resultCount; ++result)
            {
                lua.ReturnResult(result + 1, co.ResumeResult(result));
            }
            co.EndResume();
            lua.EndReturn();
        }
Exemple #2
0
 public static void print(LuaInterop lua)
 {
     for (int argument = 0; argument < lua.ArgumentCount; ++argument)
     {
         if (argument > 0)
         {
             Console.Out.Write("\t");
         }
         Console.Out.Write(tostring(lua.Argument(argument)));
     }
     Console.Out.Write("\n");
 }
Exemple #3
0
            public void write(LuaInterop lua)
            {
                EnsureWriter();

                for (int argument = 0; argument < lua.ArgumentCount; ++argument)
                {
                    string type = lua.ArgumentType(argument);
                    if (type == "string")
                    {
                        writer.Write(lua.Argument <string>(argument));
                    }
                    else if (type == "number")
                    {
                        writer.Write(lua.Argument <double>(argument).ToString("G14"));
                    }
                    else
                    {
                        throw new ArgumentException("write() only accepts strings or numbers as arguments.");
                    }
                }

                lua.Return();
            }
Exemple #4
0
 internal static int LuaGetStack(IntPtr luaState, int level, IntPtr n)
 {
     return(LuaInterop.LuaGetStack(luaState, level, n));
 }
Exemple #5
0
 public static void read(LuaInterop lua)
 {
     defaultInput.read(lua);
 }
Exemple #6
0
 internal static void LuaRemove(IntPtr luaState, int index)
 {
     LuaInterop.LuaRemove(luaState, index);
 }
Exemple #7
0
 internal static void LuaRawSet(IntPtr luaState, int index)
 {
     LuaInterop.LuaRawSet(luaState, index);
 }
Exemple #8
0
 internal static void LuaClose(IntPtr luaState)
 {
     LuaInterop.LuaClose(luaState);
 }
Exemple #9
0
 internal static int LuaNetCheckUData(IntPtr luaState, int ud, string tname)
 {
     return(LuaInterop.LuaNetCheckUData(luaState, ud, tname));
 }
Exemple #10
0
 internal static void LuaNetNewUData(IntPtr luaState, int val)
 {
     LuaInterop.LuaNetNewUData(luaState, val);
 }
Exemple #11
0
 internal static int LuaNetRawNetObj(IntPtr luaState, int obj)
 {
     return(LuaInterop.LuaNetRawNetObj(luaState, obj));
 }
Exemple #12
0
 internal static int LuaNetToNetObject(IntPtr luaState, int index)
 {
     return(LuaInterop.LuaNetToNetObject(luaState, index));
 }
Exemple #13
0
 internal static IntPtr LuaSetUpValue(IntPtr luaState, int funcindex, int n)
 {
     return(LuaInterop.LuaSetUpValue(luaState, funcindex, n));
 }
Exemple #14
0
 internal static IntPtr LuaSetLocal(IntPtr luaState, IntPtr ar, int n)
 {
     return(LuaInterop.LuaSetLocal(luaState, ar, n));
 }
Exemple #15
0
 internal static void LuaCreateTable(IntPtr luaState, int narr, int nrec)
 {
     LuaInterop.LuaCreateTable(luaState, narr, nrec);
 }
Exemple #16
0
 internal static IntPtr LuaNetGetTag()
 {
     return(LuaInterop.LuaNetGetTag());
 }
Exemple #17
0
 internal static void LuaInsert(IntPtr luaState, int newTop)
 {
     LuaInterop.LuaInsert(luaState, newTop);
 }
Exemple #18
0
 internal static void LuaNetPopGlobalTable(IntPtr luaState)
 {
     LuaInterop.LuaNetPopGlobalTable(luaState);
 }
Exemple #19
0
 internal static void LuaSetTable(IntPtr luaState, int index)
 {
     LuaInterop.LuaSetTable(luaState, index);
 }
Exemple #20
0
 internal static void LuaNetSetGlobal(IntPtr luaState, string name)
 {
     LuaInterop.LuaNetSetGlobal(luaState, name);
 }
Exemple #21
0
 internal static void LuaSetMetatable(IntPtr luaState, int objIndex)
 {
     LuaInterop.LuaSetMetatable(luaState, objIndex);
 }
Exemple #22
0
 internal static int LuaNetRegistryIndex()
 {
     return(LuaInterop.LuaNetRegistryIndex());
 }
Exemple #23
0
        public static void format(LuaInterop lua)
        {
            string format = lua.Argument <string>(0);

            StringBuilder s = new StringBuilder();

            // Iterate through conversion specifications in format.
            int argument = 1;
            int start    = 0;

            while (true)
            {
                // Find next format specification.
                int p = format.IndexOf('%', start);
                if (p == -1)
                {
                    s.Append(format.Substring(start));
                    break;
                }

                // Add chunk of format string.
                s.Append(format.Substring(start, p - start));

                // Parse conversion specification.
                char c = format[p++];

                // Flags.
                bool bLeftJustify   = false;
                bool bSignPlus      = false;
                bool bSignSpace     = false;
                bool bAlternateForm = false;
                bool bPadWithZeroes = false;

                while (true)
                {
                    c = format[p++];
                    switch (c)
                    {
                    case '-':       bLeftJustify = true; continue;

                    case '+':       bSignPlus = true; continue;

                    case ' ':       bSignSpace = true; continue;

                    case '#':       bAlternateForm = true; continue;

                    case '0':       bPadWithZeroes = true; continue;
                    }

                    break;
                }

                if (bSignSpace && bSignPlus)
                {
                    bSignSpace = false;
                }
                if (bPadWithZeroes && bLeftJustify)
                {
                    bPadWithZeroes = false;
                }


                // Field width.
                int fieldWidth = 0;

                while (c >= '0' && c <= '9')
                {
                    int digit = c - '0';
                    fieldWidth = fieldWidth * 10 + digit;

                    c = format[p++];
                }


                // Precision.
                int precision = -1;

                if (c == '.')
                {
                    precision = 0;
                    c         = format[p++];

                    bool bNegativePrecision = false;
                    if (c == '-')
                    {
                        bNegativePrecision = true;
                        c = format[p++];
                    }

                    while (c >= '0' && c <= '9')
                    {
                        int digit = c - '0';
                        precision = precision * 10 + digit;

                        c = format[p++];
                    }

                    if (bNegativePrecision)
                    {
                        precision = -1;
                    }
                }


                // Conversion specifier cheracter.
                switch (c)
                {
                // Integer conversions.

                case 'd':
                case 'i':
                {
                    string value = IntegerFormat(lua.Argument <int>(argument++), "D", precision, ref bPadWithZeroes);
                    value = AddSign(value, bSignPlus, bSignSpace);
                    if (bPadWithZeroes)
                    {
                        AppendPadded(s, value, fieldWidth);
                    }
                    else
                    {
                        AppendJustified(s, value, fieldWidth, bLeftJustify);
                    }
                    break;
                }

                case 'o':
                {
                    StringBuilder o      = new StringBuilder();
                    uint          number = lua.Argument <uint>(argument++);
                    for (uint remainder = number; remainder > 0; remainder >>= 3)
                    {
                        o.Insert(0, (char)('0' + (remainder & 7)));
                    }
                    if (bAlternateForm)
                    {
                        precision = o.Length + 1;
                    }
                    if (precision >= 0)
                    {
                        bPadWithZeroes = false;
                        for (int zero = 0; zero < precision; ++zero)
                        {
                            o.Insert(0, '0');
                        }
                    }
                    else
                    {
                        if (number == 0)
                        {
                            o.Append('0');
                        }
                    }
                    string value = AddSign(o.ToString(), bSignPlus, bSignSpace);
                    if (bPadWithZeroes)
                    {
                        AppendPadded(s, value, fieldWidth);
                    }
                    else
                    {
                        AppendJustified(s, value, fieldWidth, bLeftJustify);
                    }
                    break;
                }

                case 'u':
                {
                    string value = IntegerFormat(lua.Argument <uint>(argument++), "D", precision, ref bPadWithZeroes);
                    if (bPadWithZeroes)
                    {
                        AppendPadded(s, value, fieldWidth);
                    }
                    else
                    {
                        AppendJustified(s, value, fieldWidth, bLeftJustify);
                    }
                    break;
                }

                case 'x':
                case 'X':
                {
                    string f     = c.ToString();
                    string value = IntegerFormat(lua.Argument <int>(argument++), f, precision, ref bPadWithZeroes);
                    if (bAlternateForm)
                    {
                        value = "0" + f + value;
                    }
                    if (bPadWithZeroes)
                    {
                        AppendPadded(s, value, fieldWidth);
                    }
                    else
                    {
                        AppendJustified(s, value, fieldWidth, bLeftJustify);
                    }
                    break;
                }


                // Floating-point conversions.

                case 'f':
                case 'F':
                {
                    double v = lua.Argument <double>(argument++);

                    if (precision == -1)
                    {
                        precision = 6;
                    }
                    string value = v.ToString("F" + precision.ToString());

                    if (!Double.IsInfinity(v) && !!Double.IsNaN(v))
                    {
                        // Add decimal point if forced.
                        if (bAlternateForm && precision == 0)
                        {
                            value += ".";
                        }

                        // Print.
                        value = AddSign(value, bSignPlus, bSignSpace);
                        if (bPadWithZeroes)
                        {
                            AppendPadded(s, value, fieldWidth);
                            break;
                        }
                    }

                    AppendJustified(s, value, fieldWidth, bLeftJustify);
                    break;
                }


                case 'e':
                case 'E':
                {
                    string f = c.ToString();
                    double v = lua.Argument <double>(argument++);

                    if (precision == -1)
                    {
                        precision = 6;
                    }
                    string value = v.ToString(f + precision.ToString());

                    if (!Double.IsInfinity(v) && !Double.IsNaN(v))
                    {
                        // Add decimal point if forced.
                        if (bAlternateForm)
                        {
                            int e = value.IndexOf(Char.IsUpper(c) ? 'E' : 'e');
                            if (e == -1)
                            {
                                e = value.Length;
                            }
                            if (value.IndexOf(NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) == -1)
                            {
                                value = value.Insert(e, NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
                            }
                        }

                        // Print.
                        value = AddSign(value, bSignPlus, bSignSpace);
                        if (bPadWithZeroes)
                        {
                            AppendPadded(s, value, fieldWidth);
                            break;
                        }
                    }

                    AppendJustified(s, value, fieldWidth, bLeftJustify);
                    break;
                }


                case 'g':
                case 'G':
                {
                    string f = c.ToString();
                    double v = lua.Argument <double>(argument++);

                    if (precision == -1)
                    {
                        precision = 6;
                    }
                    if (precision == 0)
                    {
                        precision = 1;
                    }
                    string value = v.ToString(f + precision.ToString());

                    if (!Double.IsInfinity(v) && !Double.IsNaN(v))
                    {
                        // Add in decimal point and trailing zeroes if alternate form.
                        if (bAlternateForm)
                        {
                            int e = value.IndexOf(Char.IsUpper(c) ? 'E' : 'e');
                            if (e == -1)
                            {
                                e = value.Length;
                            }
                            if (value.IndexOf(NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) == -1)
                            {
                                value = value.Insert(e, NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
                                e    += 1;
                            }
                            int length = precision + 1;
                            if (value.StartsWith(NumberFormatInfo.CurrentInfo.NegativeSign))
                            {
                                length += NumberFormatInfo.CurrentInfo.NegativeSign.Length;
                            }
                            while (e < length)
                            {
                                value = value.Insert(e, "0");
                                e    += 1;
                            }
                        }

                        // Print.
                        value = AddSign(value, bSignPlus, bSignSpace);
                        if (bPadWithZeroes)
                        {
                            AppendPadded(s, value, fieldWidth);
                            break;
                        }
                    }

                    AppendJustified(s, value, fieldWidth, bLeftJustify);
                    break;
                }


                // String conversions.

                case 'c':
                {
                    int value = lua.Argument <int>(argument++);
                    AppendJustified(s, Char.ConvertFromUtf32(value), fieldWidth, bLeftJustify);
                    break;
                }

                case 's':
                {
                    string value = lua.Argument <string>(argument++);
                    if (precision != -1 && value.Length > precision)
                    {
                        value = value.Remove(precision);
                    }
                    AppendJustified(s, value, fieldWidth, bLeftJustify);
                    break;
                }

                case 'q':
                {
                    string value = lua.Argument <string>(argument++);

                    StringBuilder q = new StringBuilder();
                    q.Append('"');
                    start = 0;
                    for (int i = 0; i < value.Length; ++i)
                    {
                        string escape = null;

                        switch (value[i])
                        {
                        case '"':       escape = "\\\"";        break;

                        case '\n':      escape = "\\n";         break;

                        case '\0':      escape = "\\0";         break;

                        case '\\':      escape = "\\\\";        break;
                        }

                        if (escape != null)
                        {
                            q.Append(value, start, i - start);
                            q.Append(escape);
                            start = i + 1;
                        }
                    }
                    q.Append(value, start, value.Length - start);
                    q.Append('"');

                    value = q.ToString();

                    if (precision != -1 && value.Length > precision)
                    {
                        value = value.Remove(precision);
                    }
                    AppendJustified(s, value, fieldWidth, bLeftJustify);
                    break;
                }

                case '%':
                {
                    s.Append('%');
                    break;
                }


                // Invalid conversion.

                default:
                    throw new FormatException("Invalid format conversion specifier '%" + c.ToString() + "'.");
                }


                start = p;
            }


            lua.Return(s.ToString());
        }
Exemple #24
0
 internal static IntPtr LuaNetGetMainState(IntPtr luaState)
 {
     return(LuaInterop.LuaNetGetMainState(luaState));
 }
Exemple #25
0
        internal static bool ExecuteEvent(string name, string json)
        {
            try
            {
                if (name == "finish-wrapper")
                {
                    Server.Start();
                    Server.Logger.Success("Finish-Trigger received! Wrapper has been finished and is now completely functional!");
                    return(false);
                }

                if (name == "trigger-event")
                {
                    return(Server.ExecuteServerEvent(new ReturnData(json)));
                }

                if (name == "interop-luaexp")
                {
                    LuaInterop.CallInterop(json);
                }

                if (name == "trigger-remote-event")
                {
                    ReturnData data      = new ReturnData(json);
                    string[]   args      = data.ValuesAsStrings("args");
                    IPlayer    player    = Server.PlayerPool.GetEntity(data.Value <int>("player"));
                    string     eventName = data.Value <string>("eventName");
                    Registry <RemoteEvent> .Item remoteItem = Server.RemoteEventRegistry.GetItem(item => item.Data.Key == eventName);
                    if (remoteItem == null)
                    {
                        return(false);
                    }
                    remoteItem.Invoke(Converts.Convert(args, remoteItem.Invoker.GetParameters(), player, false, remoteItem.Invoker.Name + " -> " + remoteItem.Data.Key));
                }

                if (name == "trigger-command")
                {
                    ReturnData data   = new ReturnData(json);
                    string[]   args   = data.ValuesAsStrings("args");
                    IPlayer    player = Server.PlayerPool.GetEntity(data.Value <int>("player"));
                    Registry <Command> .Item commandItem =
                        Server.CommandRegistry.GetItem(item => item.Data.Name == data.Value <string>("commandName"));
                    if (commandItem == null)
                    {
                        Server.ExecuteInternalServerEvent(EventType.PlayerCommandFailed, player,
                                                          data.Value <string>("commandName"), args, CommandError.NotExisting);
                        return(false);
                    }

                    if (Server.ExecuteInternalServerEvent(EventType.PlayerPreCommand, player, data.Value <string>("commandName"), args))
                    {
                        int requiredParams = commandItem.Invoker.GetParameters().Count(info => !info.IsOptional) - 1;
                        if (requiredParams > args.Length)
                        {
                            Server.ExecuteInternalServerEvent(EventType.PlayerCommandFailed, player,
                                                              data.Value <string>("commandName"), args, CommandError.TooFewArguments);
                            return(false);
                        }

                        object[] arr = Converts.Convert(args, commandItem.Invoker.GetParameters(), player, true,
                                                        "Command");
                        if (arr == null)
                        {
                            return(false);
                        }
                        commandItem.Invoke(arr);
                    }
                }
            }
            catch (Exception e)
            {
                Server.Logger.Error("An unhandled exception occurred!", e);
            }
            return(false);
        }
Exemple #26
0
 internal static void LuaLOpenLibs(IntPtr luaState)
 {
     LuaInterop.LuaLOpenLibs(luaState);
 }
Exemple #27
0
            public void read(LuaInterop lua)
            {
                EnsureReader();

                if (lua.ArgumentCount > 0)
                {
                    List <LuaValue> results = new List <LuaValue>();

                    for (int argument = 0; argument < lua.ArgumentCount; ++argument)
                    {
                        string type = lua.ArgumentType(argument);
                        if (type == "number")
                        {
                            int number = lua.Argument <int>(argument);
                            if (number > 0)
                            {
                                // Read actual number of characters.
                                char[] s     = new char[number];
                                int    count = reader.ReadBlock(s, 0, number);
                                if (count > 0)
                                {
                                    results.Add(new String(s, 0, count));
                                }
                                else
                                {
                                    results.Add(null);
                                }
                            }
                            else
                            {
                                // Check for EOF.
                                if (reader.Peek() != -1)
                                {
                                    results.Add("");
                                }
                                else
                                {
                                    results.Add(null);
                                }
                            }
                        }
                        else
                        {
                            string format = lua.Argument <string>(argument);
                            if (format == "*n")
                            {
                                StringBuilder s = new StringBuilder();

                                // Read a number token from the file.
                                while (Char.IsWhiteSpace(GetChar()))
                                {
                                    Shift();
                                }
                                if (GetChar() == '+' || GetChar() == '-')
                                {
                                    s.Append(Shift());
                                }
                                while (Char.IsDigit(GetChar()) || GetChar() == '.')
                                {
                                    s.Append(Shift());
                                }
                                if (GetChar() == 'e' || GetChar() == 'E')
                                {
                                    s.Append(Shift());
                                    if (GetChar() == '+' || GetChar() == '-')
                                    {
                                        s.Append(Shift());
                                    }
                                }
                                while (Char.IsLetter(GetChar()) || Char.IsNumber(GetChar()) || GetChar() == '_')
                                {
                                    s.Append(Shift());
                                }

                                // Parse the number.
                                int    integerValue;
                                double doubleValue;
                                string v = s.ToString();
                                if (v.StartsWith("0x") && Int32.TryParse(v.Substring(2), NumberStyles.HexNumber, NumberFormatInfo.InvariantInfo, out integerValue))
                                {
                                    results.Add(integerValue);
                                }
                                else if (Int32.TryParse(v, NumberStyles.Number, NumberFormatInfo.InvariantInfo, out integerValue))
                                {
                                    results.Add(integerValue);
                                }
                                else if (Double.TryParse(v, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out doubleValue))
                                {
                                    results.Add(doubleValue);
                                }
                                else
                                {
                                    results.Add(null);
                                }
                            }
                            else if (format == "*a")
                            {
                                results.Add(reader.ReadToEnd() ?? "");
                            }
                            else if (format == "*l")
                            {
                                results.Add(reader.ReadLine());
                            }
                        }
                    }

                    lua.BeginReturn(results.Count);
                    for (int result = 0; result < results.Count; ++result)
                    {
                        lua.ReturnResult(result, results[result]);
                    }
                    lua.EndReturn();
                }
                else
                {
                    lua.Return(reader.ReadLine());
                }
            }
Exemple #28
0
 internal static int LuaLLoadString(IntPtr luaState, byte [] chunk)
 {
     return(LuaInterop.LuaLLoadString(luaState, chunk));
 }
Exemple #29
0
 public static void write(LuaInterop lua)
 {
     defaultOutput.write(lua);
 }
Exemple #30
0
 internal static int LuaGetInfo(IntPtr luaState, string what, IntPtr ar)
 {
     return(LuaInterop.LuaGetInfo(luaState, what, ar));
 }