-
Notifications
You must be signed in to change notification settings - Fork 9
INTERACTION.md
amx allows developers to enrich their gamemodes and other scripts with Lua code, which is easier and more efficient to write than Pawn. To make this possible, a new Pawn function, lua was added to call Lua functions, and a Lua function called pawn correspondingly calls public Pawn functions.
A resource that uses the interaction functions will contain both one or more .amx files (<amx/>
in meta.xml) and serverside MTA scripts (<script/>
). Both Pawn and Lua scripts can only call other-language scripts that are in the same resource.
Before you can call a function with lua or pawn you need to define its prototype, which consists of the types of its arguments and return value. Each type corresponds to a single letter:
Letter | Type | Letter | Type | Letter | Type |
---|---|---|---|---|---|
b | boolean |
p | player |
m | menu |
i | integer |
v | vehicle |
g | gang zone |
f | floating point |
o | object |
a | 3D text label |
s | string |
u | pickup |
k | native marker |
c | color |
y | actor |
z | bot |
t | team |
x | textdraw |
Pawn functions are registered with amxRegisterPawnPrototypes, Lua functions with amxRegisterLuaPrototypes. Both functions associate a number of function names with their argument types and (optionally) return type. To specify a return type, prepend the function name with the type letter followed by a colon (:), for example: f:testfn
. If you do not specify a return type (i.e. only specify the name, testfn
), "i" will be assumed.
See the syntax sections of the two registration functions for the precise syntax to use.
Use lua to call a Lua function from Pawn, and pawn to call a Pawn function from Lua. The functions have the same syntax: a string containing the name of the function, followed by the arguments to the function. amx takes care of any necessary argument and return value conversions: for example an .amx vehicle ID passed to lua will arrive in the Lua function as an MTA vehicle element, and vice versa (provided the correct prototype was registered for the Lua function).
It is possible to pass arguments by-reference from Pawn to Lua - however this is not possible in the opposite direction.
To make an argument be passed by reference, modifications in both the Lua function's prototype and body are necessary. In the prototype, prepend the type letter with a &
. In the function's code, write _[argname]
instead of argname
for reading and writing the argument (argname
holds the memory address in the .amx of the argument).
Some limitations apply to cross-language calling.
-
Only scalar values (numbers, players, vehicles...) and strings can be passed as arguments; Pawn arrays and Lua tables are not supported.
-
Functions can only return scalar values (no strings or other arrays).
-
As stated in the previous section, by-reference arguments can only be passed from Pawn to Lua, not from Lua to Pawn.