0

Is it possible, to use Pawn (language) in C#? I have an application and I would like to offer others to write modifications/plugins with Pawn.

I found JavaScript interpreter, Jint, but I can't find any similar library for Pawn.

tebeix
  • 13
  • 4
  • I have no idea about Pawn. I even have not heard about it but I think if you can create a library (DLL) from Pawn and export it's functions, you can call them in C#. – Mustafa Chelik Mar 01 '14 at 19:52
  • function Pawn(Person p, Valuable v){p.Inventory.Remove(v); p.Cash+=v.Value/10;} – Jan Van Herck Mar 01 '14 at 20:14

1 Answers1

1

You need an AMX machine library. First, download the Pawn toolkit, then import the functions from the amx32.dll. Read the Pawn Implementer Guide for the documentation.

I've tried implementing it once, and I'd rather recommend Lua for additional scripts. There is much more documentation for that. But if you insist on using Pawn, here are the remains of my research:

const string amxlib = "amx32.dll";

[DllImport(amxlib)]
private static extern int amx_Init(IntPtr amx, IntPtr program);

[DllImport(amxlib)]
private static extern int amx_Exec(IntPtr amx, IntPtr retval, int index);

[DllImport(amxlib)]
private static extern int amx_Exec(IntPtr amx, out int retval, int index);

[DllImport(amxlib)]
private static extern int amx_Register(IntPtr amx, [MarshalAs(UnmanagedType.LPArray)] AMXNativeInfo[] list, int count);

[DllImport(amxlib)]
private static extern int amx_Register(IntPtr amx, IntPtr list, int count);

[DllImport(amxlib)]
private static extern int amx_NumNatives(IntPtr amx, out int number);

[DllImport(amxlib)]
private static extern int amx_GetNative(IntPtr amx, int index, System.Text.StringBuilder name);

[DllImport(amxlib)]
private static extern int amx_NameLength(IntPtr amx, out int length);

public delegate int AMXNativeCall(IntPtr amx, IntPtr args);

[StructLayout(LayoutKind.Sequential)]
public struct AMXNativeInfo
{
    [MarshalAs(UnmanagedType.LPStr)]
    public string Name;

    [MarshalAs(UnmanagedType.FunctionPtr)]
    public AMXNativeCall Function;

    public AMXNativeInfo(string name, AMXNativeCall func)
    {
        Name = name;
        Function = func;
    }
}
IS4
  • 11,945
  • 2
  • 47
  • 86