<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.gtaconnected.com/wiki/index.php?action=history&amp;feed=atom&amp;title=ScriptingInterface</id>
	<title>ScriptingInterface - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gtaconnected.com/wiki/index.php?action=history&amp;feed=atom&amp;title=ScriptingInterface"/>
	<link rel="alternate" type="text/html" href="https://wiki.gtaconnected.com/wiki/index.php?title=ScriptingInterface&amp;action=history"/>
	<updated>2026-04-29T02:31:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.15</generator>
	<entry>
		<id>https://wiki.gtaconnected.com/wiki/index.php?title=ScriptingInterface&amp;diff=7773&amp;oldid=prev</id>
		<title>Mex at 14:02, 10 May 2020</title>
		<link rel="alternate" type="text/html" href="https://wiki.gtaconnected.com/wiki/index.php?title=ScriptingInterface&amp;diff=7773&amp;oldid=prev"/>
		<updated>2020-05-10T14:02:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Scripting Interface}}&lt;br /&gt;
&lt;br /&gt;
= Summary =&lt;br /&gt;
&lt;br /&gt;
The GTAC scripting interface aims to be enjoyable to use.&amp;lt;br&amp;gt;&lt;br /&gt;
Goals include: clean, easy to use, minimal typing, consistent, no duplicate functionality, and wrappable.&lt;br /&gt;
&lt;br /&gt;
= Scripting Languages =&lt;br /&gt;
&lt;br /&gt;
There are currently three scripting languages used. JavaScript, Lua, and Squirrel.&amp;lt;br&amp;gt;&lt;br /&gt;
Multiple scripting languages can be used in the same server/client instance, and even in the same resource.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;meta.xml:&amp;lt;/code&amp;gt;&lt;br /&gt;
{{InformationBox|1=&amp;lt;meta&amp;gt;&lt;br /&gt;
	&amp;lt;script language=&amp;quot;lua&amp;quot; type=&amp;quot;server&amp;quot; src=&amp;quot;script1.lua&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script language=&amp;quot;lua&amp;quot; type=&amp;quot;client&amp;quot; src=&amp;quot;script1.lua&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;server&amp;quot; src=&amp;quot;script1.js&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;client&amp;quot; src=&amp;quot;script1.js&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script language=&amp;quot;squirrel&amp;quot; type=&amp;quot;server&amp;quot; src=&amp;quot;script1.nut&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;script language=&amp;quot;squirrel&amp;quot; type=&amp;quot;client&amp;quot; src=&amp;quot;script1.nut&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/meta&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Item Handles =&lt;br /&gt;
&lt;br /&gt;
Item handles are used to refer to items that are created, whether the item is created by a resource, a module, or by GTAC.&lt;br /&gt;
&lt;br /&gt;
List of data types used for item handles in different scripting languages:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align: left;&amp;quot; | Scripting Language&lt;br /&gt;
! style=&amp;quot;text-align: left;&amp;quot; | Data Type&lt;br /&gt;
|-&lt;br /&gt;
|JavaScript&lt;br /&gt;
|Object&lt;br /&gt;
|-&lt;br /&gt;
|Lua&lt;br /&gt;
|Userdata&lt;br /&gt;
|-&lt;br /&gt;
|Squirrel&lt;br /&gt;
|Object&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=local vehicle = gta.createVehicle(..) -- vehicle is an item handle}}&lt;br /&gt;
&lt;br /&gt;
= Item Existence &amp;amp; Item Properties =&lt;br /&gt;
=== Item Creation &amp;amp; Item General Functionality ===&lt;br /&gt;
&lt;br /&gt;
Global functions are used to create an item, and are also used for general functionality.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{{LuaCode|1=gta.createVehicle(..)&lt;br /&gt;
getVehicles(..)}}&lt;br /&gt;
&lt;br /&gt;
=== Item Destroying ===&lt;br /&gt;
&lt;br /&gt;
Global functions are used to destroy an item.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=local vehicle = gta.createVehicle(..)&lt;br /&gt;
destroyElement(vehicle)}}&lt;br /&gt;
&lt;br /&gt;
=== Item Setters and Getters ===&lt;br /&gt;
&lt;br /&gt;
The majority of item attributes are applied and fetched via OOP properties.  OOP methods are used too.&amp;lt;br&amp;gt;&lt;br /&gt;
Either an OOP property or an OOP method is used per functionality, not both.&lt;br /&gt;
&lt;br /&gt;
OOP properties are used when a single value can be applied or fetched for an item.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=local vehicle = gta.createVehicle(..)&lt;br /&gt;
vehicle.health = 1000&lt;br /&gt;
print(tostring(vehicle.health))}}&lt;br /&gt;
&lt;br /&gt;
OOP methods are used when it is not appropriate to use an OOP property.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=local vehicle = gta.createVehicle(..)&lt;br /&gt;
vehicle:respawn()}}&lt;br /&gt;
&lt;br /&gt;
= Signatures =&lt;br /&gt;
=== Naming Convention ===&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Camel_case Lower camel case] is used as the naming convention for all functionality provided, except event names which are case-insensitive.&amp;lt;br&amp;gt;&lt;br /&gt;
This means that variable, function, property &amp;amp; method names start with a lowercase letter, and event names can be any case.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=local Var = gta.createVehicle(..) -- function name &amp;quot;createVehicle&amp;quot; in global table &amp;quot;gta&amp;quot;.&lt;br /&gt;
Var:fix() -- method name &amp;quot;fix&amp;quot;&lt;br /&gt;
addEventHandler(&amp;#039;onElementStreamIn&amp;#039;, function() end) -- event name &amp;quot;onElementStreamIn&amp;quot;&lt;br /&gt;
addEventHandler(&amp;#039;ONelementSTREAMin&amp;#039;, function() end) -- event name &amp;quot;onElementStreamIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- In this example, &amp;quot;Var&amp;quot; is a variable name, and naming conventions for variables are managed by the scripting languages, not by GTAC.&lt;br /&gt;
-- Most scripting languages will allow you to use any text case for variable naming.&lt;br /&gt;
-- &amp;quot;Var&amp;quot; could well have been &amp;quot;var&amp;quot;, and probably should be for Lua, because some scripting languages have preferred naming rules for implementation by coders.}}&lt;br /&gt;
&lt;br /&gt;
=== Multiple Signatures ===&lt;br /&gt;
&lt;br /&gt;
A global function or a method may use more than one signature.&lt;br /&gt;
&lt;br /&gt;
= Item Type Values =&lt;br /&gt;
=== Angles ===&lt;br /&gt;
&lt;br /&gt;
Radians are used as the angle measurement unit, not degrees.&amp;lt;br&amp;gt;&lt;br /&gt;
Implicit modulo division occurs for angle input to functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=addEventHandler(&amp;#039;onPlayerSpawn&amp;#039;,function(event,ped)&lt;br /&gt;
    ped.heading = math.rad(450.0)&lt;br /&gt;
    print(tostring(ped.heading)) -- math.rad(90.0)&lt;br /&gt;
end)}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors and Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays of size 2 can be used in place of vec2 for input to functionality.&amp;lt;br&amp;gt;&lt;br /&gt;
Arrays of size 3 can be used in place of vec3 for input to functionality.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=addEventHandler(&amp;#039;onPlayerSpawn&amp;#039;,function(event,ped)&lt;br /&gt;
    ped.position = vec3(50,80,110)&lt;br /&gt;
    ped.position = {50,80,110}&lt;br /&gt;
end)}}&lt;br /&gt;
&lt;br /&gt;
= Validation =&lt;br /&gt;
=== Input Validation ===&lt;br /&gt;
&lt;br /&gt;
Global functions and methods provided have their input parameter count validated.&amp;lt;br&amp;gt;&lt;br /&gt;
All functionality provided has input data type(s) validated. Integer and float are considered different in languages that natively differentiate them.&lt;br /&gt;
&lt;br /&gt;
=== Resource Errors ===&lt;br /&gt;
&lt;br /&gt;
For scripting launch errors, the resource is not loaded.&amp;lt;br&amp;gt;&lt;br /&gt;
For scripting callback errors, the resource continues as normal, and the callback invocation instance is aborted natively.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=addEventHandler(&amp;#039;onPlayerSpawn&amp;#039;,function(event,ped)&lt;br /&gt;
    ped.heading = &amp;#039;a string&amp;#039; -- should be a number of course&lt;br /&gt;
    -- this lambda function can be invoked more than once&lt;br /&gt;
end)}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Example&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{{LuaCode|1=gta.createVehicle(void) -- fails&lt;br /&gt;
getVehicles(&amp;#039;unusedArgument&amp;#039;) -- fails&lt;br /&gt;
gta.createVehicle(false) -- fails}}&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
=== Wrappable ===&lt;br /&gt;
&lt;br /&gt;
Provided functionality has no restrictions on wrapping.&amp;lt;br&amp;gt;&lt;br /&gt;
However, events (observer pattern) should always be used instead when the applicable event is provided, to prevent resource conflictions.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wrapping Example&amp;#039;&amp;#039;&amp;#039; (Lua)&lt;br /&gt;
{{LuaCode|1=gta.createVehicle = function(...)&lt;br /&gt;
    someFunc(...)&lt;br /&gt;
    gta.createVehicle(...)&lt;br /&gt;
end}}&lt;br /&gt;
&lt;br /&gt;
=== Backward Compatibility ===&lt;br /&gt;
&lt;br /&gt;
Backward compatibility is supported for all functionality, excluding when a confliction would occur.&lt;/div&gt;</summary>
		<author><name>Mex</name></author>
	</entry>
</feed>