<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Master-athmos</id>
	<title>Spring - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Master-athmos"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Master-athmos"/>
	<updated>2026-11-08T20:38:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20982</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20982"/>
		<updated>2021-04-21T20:51:35Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: Replaced content with &amp;quot;Development &amp;lt; Lua Scripting &amp;lt; {{FULLPAGENAME}}  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;These functions are ONLY available if the graphic board supp...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;These functions are ONLY available if the graphic board supports GLSL.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Please test in your scripts if one of them exists before you use them!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateShader&#039;&#039;&#039;&lt;br /&gt;
  ({[ vertex   = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tcs      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tes      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ geometry = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ fragment = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ uniform       = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformInt    = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformFloat  = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformMatrix = { uniformName = number value, ...} ,]&lt;br /&gt;
    [ geoInputType = number inType,]&lt;br /&gt;
    [ geoOutputType = number outType,]&lt;br /&gt;
    [ geoOutputVerts = number maxVerts,]&lt;br /&gt;
    [ definitions = &amp;quot;string of shader #defines&amp;quot;, ]&lt;br /&gt;
  }) -&amp;gt; number shaderID&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Vertex&amp;quot; or vertex-shader is your GLSL-Code as string, its written in a C-Dialect. This shader is busy deforming the geometry of a unit but it can not create new polygons. Use it for waves, wobbling surfaces etc.&lt;br /&gt;
 &lt;br /&gt;
* The &amp;quot;Geometry&amp;quot; or Geometry-shader can create new vertices and vertice-stripes from points. &lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TCS&amp;quot; or Tesselation Control Shader controls how much tessellation a particular patch gets; it also defines the size of a patch, thus allowing it to augment data. It can also filter vertex data taken from the vertex shader. The main purpose of the TCS is to feed the tessellation levels to the Tessellation primitive generator stage, as well as to feed patch data (as its output values) to the Tessellation Evaluation Shader stage. TCS shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TES&amp;quot; or Tesselation Evaluation Shader takes the abstract patch generated by the tessellation primitive generation stage, as well as the actual vertex data for the entire patch, and generates a particular vertex from it. Each TES invocation generates a single vertex. It can also take per-patch data provided by the Tessellation Control Shader. TES shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Fragment&amp;quot; or Fragment-shader (sometimes called pixel-Shader) is post processing the allready rendered picture (for example drawing stars on the sky)- remember textures are not always 2 dimensional pictures. They can contain information about the depth, or the third value marks areas and the strength at which these are processed.&lt;br /&gt;
&lt;br /&gt;
* The Uniforms are the values, you send along with the shader-program. To use them in the shader-program declare them like this: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform float frame;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* From 101.0 onwards, the engine will automatically fill in an appropriately named uniform for team colour if it is declared;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform vec4 teamColor;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteShader&#039;&#039;&#039;&lt;br /&gt;
  ( number shaderID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveShader&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;can be used in NON-drawing events (to update uniforms etc.)!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number shaderID, function [, arg1 [, arg2, ..]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UseShader&#039;&#039;&#039;&lt;br /&gt;
  ( number shaderID ) -&amp;gt; boolean linked&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShaderLog&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string &amp;quot;infoLog&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SetShaderParameter&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#ff0000&amp;quot;&amp;gt;Renamed to SetGeometryShaderParameter in spring version &amp;gt;= 104.0.1-596 (maintenance).&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;needed by geometry shader programs (check the opengl GL_ARB_geometry_shader4 extension for glProgramParameteri)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number shaderID, number param, number value ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SetTesselationShaderParameter&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000ee&amp;quot;&amp;gt;Available for spring versions &amp;gt;= 104.0.1-596 (maintenance).&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;needed by tesselation shader programs (check the opengl GL_ARB_tessellation_shader extension for glProgramParameteri)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number param, number value ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetActiveUniforms&#039;&#039;&#039;&lt;br /&gt;
  ( number shaderID ) -&amp;gt; { &lt;br /&gt;
      [1] = { name = &amp;quot;name&amp;quot;, type = &amp;quot;type&amp;quot;, length = number length, size = number size },&lt;br /&gt;
      ...&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetUniformLocation&#039;&#039;&#039;&lt;br /&gt;
  ( number shaderID, name uniformName ) -&amp;gt; number locationID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Uniform&#039;&#039;&#039;&lt;br /&gt;
  ( number locationID, number f1 [,number f2 [,number f3 [,number f4]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UniformInt&#039;&#039;&#039;&lt;br /&gt;
  ( number locationID, number int1 [,number int2 [,number int3 [,number int4]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UniformArray&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number locationID, number type, table uniforms ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;type can be one of {1 = int, 2 = float, 3 = float matrix}. In 104.0 the maximum length of the uniforms table increased from 32 entries to 1024.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UniformMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number locationID, &lt;br /&gt;
    &amp;quot;shadow&amp;quot; |&lt;br /&gt;
    &amp;quot;camera&amp;quot; |&lt;br /&gt;
    &amp;quot;caminv&amp;quot; |&lt;br /&gt;
    &amp;quot;camprj&amp;quot; |&lt;br /&gt;
    number m1, number m2, number m3, number m4 |&lt;br /&gt;
    number m1, ... , number m9 |&lt;br /&gt;
    number m1, ... , number m16&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_OpenGL_Api&amp;diff=11524</id>
		<title>Lua OpenGL Api</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_OpenGL_Api&amp;diff=11524"/>
		<updated>2021-04-21T20:48:24Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: Updated page with new anchorable templates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadowDensity&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} shadowDensity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;diffuse&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;ambient&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;specular&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetAtmosphere&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetWaterRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMapRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigScreen&lt;br /&gt;
|arg1 = {{type|number}} screenWidth&lt;br /&gt;
|arg2 = {{type|number}} screenDistance&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Used for Unit LODs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} transform = true&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SlaveMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigMiniMap&lt;br /&gt;
|arg1 = {{type|number}} intPX&lt;br /&gt;
|arg2 = {{type|number}} intPY&lt;br /&gt;
|arg3 = {{type|number}} intSX&lt;br /&gt;
|arg4 = {{type|number}} intSY&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetViewSizes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Viewport&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Translate&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} angle&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Billboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MatrixMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadIdentity&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadMatrix&lt;br /&gt;
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Ortho&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Frustum&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushPopMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ClipPlane&lt;br /&gt;
|arg1 = {{type|number}} intPlane&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: intPlane can only be 1 or 2.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.DEPTH_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cleardepth {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.STENCIL_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intClearStencil {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.COLOR_BUFFER_BIT}} {{pipe}} {{type|GL.ACCUM_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = {{type|number}} a {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SwapBuffers&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetMatrices&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginEnd&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLType]]&lt;br /&gt;
|arg2 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg3 = arg1&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Color&lt;br /&gt;
|arg1 = {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} {{pipe}} {{type|table}} colors = { {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|table}} vertex = { {{type|number}} x,  {{type|number}} y,  {{bracket}},  {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z, {{type|number}} w&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Normal&lt;br /&gt;
|arg1 = {{type|table}} normal = { {{type|number}} x,  {{type|number}} y,  {{type|number}} z } {{pipe}} {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Rect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexRect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} flip_s, {{type|bool}} flip_t {{pipe}} {{type|number}} s1, {{type|number}} t1, {{type|number}} s2, {{type|number}} t2 {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Texture rect.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Shape&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLtype]]&lt;br /&gt;
|arg2 = {{type|table}} elements&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Elements contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SecondaryColor&lt;br /&gt;
|arg1 = {{type|table}} color = { {{type|number}} r, {{type|number}} g, {{type|number}} b } {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FogCoord&lt;br /&gt;
|arg1 = {{type|number}} value &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateList&lt;br /&gt;
|arg1 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} listID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CallList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} numElements&lt;br /&gt;
|arg2 = {{type|number}} numIndices {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} persistentBuffer = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} bufferID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ &lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UpdateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} elementPos&lt;br /&gt;
|arg3 = {{type|number}} indexPos&lt;br /&gt;
|arg4 = {{type|table}} tbl {{pipe}} {{type|function}} func &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&lt;br /&gt;
4 elements table example:&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&lt;br /&gt;
Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} primType {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} firstIndex = 0&lt;br /&gt;
|arg4 = {{type|number}} count = numElements {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Releases previously allocated VAO&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Text&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;options&amp;quot; {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextWidth&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} width  &lt;br /&gt;
|info = Width in pixels, with a font size of 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextHeight&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height, {{type|number}} descender, {{type|number}} numlines&lt;br /&gt;
|info = Height in pixels, with a font size of 1.0. Further descriptions here: [[GetTextHeight]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EndText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Unit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws a unit - on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitRaw&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShape&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} rawState&lt;br /&gt;
|arg4 = {{type|bool}} toScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = world space -&amp;gt; unit space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = unit space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws the unit piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use gl.UnitPieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Feature&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureRaw&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShape&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} custom&lt;br /&gt;
|arg4 = {{type|bool}} drawScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque  &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;world space -&amp;gt; feature space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;feature space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePiece&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Draws the Feature piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Use gl.FeaturePieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawListAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} listID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} midPos&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} degrees&lt;br /&gt;
|arg6 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawFuncAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} midPos&lt;br /&gt;
|arg3 = {{type|function}} {{bracket}}, arg1, ... {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|string}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Mode can be set to:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;add&amp;quot;&lt;br /&gt;
 = GL.ONE, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;reset&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;color&amp;quot;&lt;br /&gt;
 = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;modulate&amp;quot;&lt;br /&gt;
 = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;disable&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquation&lt;br /&gt;
|arg1 = {{type|number}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFunc&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquationSeparate&lt;br /&gt;
|arg1 = {{type|number}} modeRGB&lt;br /&gt;
|arg2 = {{type|number}} modeAlpha &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcRGB]]&lt;br /&gt;
|arg2 = {{type|number}} [Lua_ConstGL#BlendingFactorDest|dstRGB]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstAlpha]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = AlphaTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = {{type|number}} threshold &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Culling&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthClamp&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Not always available, needs GL.NV_depth_clamp!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthMask&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} masked &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} r, {{type|bool}} g, {{type|bool}} b, {{type|bool}} a&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LogicOp&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#LogicOp|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Fog&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Smoothing&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} point&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} line&lt;br /&gt;
|arg3 = {{type|bool}} enable {{pipe}} {{type|number}} polygon&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|number}} intX, {{type|number}} intY, {{type|number}} intW, {{type|number}} intH&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|string}} any&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use springs default line stipple.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|number}} intFactor&lt;br /&gt;
|arg2 = {{type|number}} pattern&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#PolygonMode|mode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonOffset&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} factor&lt;br /&gt;
|arg2 = {{type|number}} units &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushAttrib&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopAttrib&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilTest&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMask&lt;br /&gt;
|arg1 = {{type|number}} mask &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFunc&lt;br /&gt;
|arg1 = {{type|number}} func&lt;br /&gt;
|arg2 = {{type|number}} ref&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOp&lt;br /&gt;
|arg1 = {{type|number}} fail&lt;br /&gt;
|arg2 = {{type|number}} zfail&lt;br /&gt;
|arg3 = {{type|number}} zpass &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMaskSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} mask &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} func&lt;br /&gt;
|arg3 = {{type|number}} ref&lt;br /&gt;
|arg4 = {{type|number}} mask &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOpSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} fail&lt;br /&gt;
|arg3 = {{type|number}} zfail&lt;br /&gt;
|arg4 = {{type|number}} zpass &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineWidth&lt;br /&gt;
|arg1 = {{type|number}} width &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSize&lt;br /&gt;
|arg1 = {{type|number}} size &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSprite&lt;br /&gt;
|arg1 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} coord_replace&lt;br /&gt;
|arg3 = {{type|bool}} coord_origin_upper {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointParameter&lt;br /&gt;
|arg1 = {{type|number}} v1, {{type|number}} v2, {{type|number}} v3 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} sizeMin&lt;br /&gt;
|arg3 = {{type|number}} sizeMax&lt;br /&gt;
|arg4 = {{type|number}} sizeFade {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Texture&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} texNum, {{rbracket}} {{type|bool}} enable {{pipe}} {{type|string}} name&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} loaded&lt;br /&gt;
|info = This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span&amp;gt;name may be:&lt;br /&gt;
&lt;br /&gt;
#12&lt;br /&gt;
= unitDef 12 buildpic&lt;br /&gt;
&lt;br /&gt;
%34:1&lt;br /&gt;
= unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
&lt;br /&gt;
%-102:0&lt;br /&gt;
= featureDef 102 s3o tex1&lt;br /&gt;
&lt;br /&gt;
!56&lt;br /&gt;
= lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
&lt;br /&gt;
$units&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units1&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units2&lt;br /&gt;
= 3do textureatlas tex2&lt;br /&gt;
&lt;br /&gt;
$shadow&lt;br /&gt;
= shadowmap&lt;br /&gt;
&lt;br /&gt;
$specular&lt;br /&gt;
= specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$reflection &lt;br /&gt;
= reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$shading&lt;br /&gt;
= ground shading texture&lt;br /&gt;
&lt;br /&gt;
$grass&lt;br /&gt;
= grass shading texture&lt;br /&gt;
&lt;br /&gt;
$heightmap&lt;br /&gt;
= heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
&lt;br /&gt;
$minimap&lt;br /&gt;
= minimap texture&lt;br /&gt;
&lt;br /&gt;
$map_reflection&lt;br /&gt;
= same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$sky_reflection&lt;br /&gt;
= defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$detail&lt;br /&gt;
= detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$normals&lt;br /&gt;
= auto generated normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_normals&lt;br /&gt;
= SSMF normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_specular&lt;br /&gt;
= SSMF specular texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_distr&lt;br /&gt;
= SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_detail&lt;br /&gt;
= SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_normals&lt;br /&gt;
= SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
&lt;br /&gt;
$ssmf_emission&lt;br /&gt;
= SSMF emission texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_parallax&lt;br /&gt;
= SSMF parallax texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$info&lt;br /&gt;
= currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
&lt;br /&gt;
$info_losmap&lt;br /&gt;
= los texture (L-view)&lt;br /&gt;
&lt;br /&gt;
$info_mtlmap&lt;br /&gt;
= metal map texture (F4-view)&lt;br /&gt;
&lt;br /&gt;
$info_hgtmap&lt;br /&gt;
= height map texture (F1-view)&lt;br /&gt;
&lt;br /&gt;
$info_blkmap&lt;br /&gt;
= blocking map texture (F2-view)&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
${opt}:/LuaUI/images/image.png &lt;br /&gt;
= load a texture from the VFS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateTexture&lt;br /&gt;
|arg1 = {{type|number}} intXSize&lt;br /&gt;
|arg2 = {{type|number}} intYSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|table}} texProps {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} texture&lt;br /&gt;
|info = texProps contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;texProps = {&lt;br /&gt;
    [target     = number,](like GL.TEXTURE_1D,GL.TEXTURE_2D,...)(Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] (needs GLEW_EXT_framebuffer_object!)&lt;br /&gt;
    [fboDepth   = boolean,] (needs GLEW_EXT_framebuffer_object!)&lt;br /&gt;
    [samples    = number,] specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteTexture&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} deleted&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteTextureFBO&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} deleted&lt;br /&gt;
|info = Needs GLEW_EXT_framebuffer_object!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TextureInfo&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} texInfo&lt;br /&gt;
|info = texInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; texInfo = {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
The format of the texture string is the same as in gl.Texture().&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexCoord&lt;br /&gt;
|arg1 = {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} {{pipe}} {{type|table}} texCoords = { {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexEnv&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexEnv&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} var1&lt;br /&gt;
|arg4 = {{type|number}} var2&lt;br /&gt;
|arg5 = {{type|number}} var3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexEnv&lt;br /&gt;
|arg1 = {{type|number}} texNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexEnv&lt;br /&gt;
|arg1 = {{type|number}} texNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} var1&lt;br /&gt;
|arg5 = {{type|number}} var2&lt;br /&gt;
|arg6 = {{type|number}} var3&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|bool}} state &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|bool}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} var1&lt;br /&gt;
|arg4 = {{type|number}} var2&lt;br /&gt;
|arg5 = {{type|number}} var3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|bool}} state&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} var1&lt;br /&gt;
|arg5 = {{type|number}} var2&lt;br /&gt;
|arg6 = {{type|number}} var3&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CopyToTexture&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = {{type|number}} intXOff&lt;br /&gt;
|arg3 = {{type|number}} intYOff&lt;br /&gt;
|arg4 = {{type|number}} intX&lt;br /&gt;
|arg5 = {{type|number}} intY&lt;br /&gt;
|arg6 = {{type|number}} intW&lt;br /&gt;
|arg7 = {{type|number}} intH {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} target&lt;br /&gt;
|arg9 = {{type|number}} level {{rbracket}}&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderToTexture&lt;br /&gt;
|arg1 = {{type|string}} fbotexture&lt;br /&gt;
|arg2 = {{type|function}} lua_func &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs GLEW_EXT_framebuffer_object!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GenerateMipmap&lt;br /&gt;
|arg1 = {{type|string}} texture &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} created&lt;br /&gt;
|info = Needs glGenerateMipmapEXT!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitTextures&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShapeTextures&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureTextures&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShapeTextures&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SaveImage&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 = {{type|string}} filename {{bracket}}&lt;br /&gt;
|arg6 = {{type|table}} imgProps = { alpha={{type|bool}}, yflip={{type|bool}}, grayscale16bit={{type|bool}}, readbuffer={{type|number}} } {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ReadPixels&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} format = GL.RGBA {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r {{bracket}}, g {{bracket}}, b {{bracket}}, a {rbracket}}{rbracket}}{rbracket}} {{pipe}} {{type|table}} readPixels = { { { 1 = {{type|number}} r, 2 = {{type|number}} g, 3 = {{type|number}} b, 4 = {{type|number}} a}, ... }, ... }&lt;br /&gt;
|info = This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Lighting&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ShadeModel&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#ShadeModel|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Light&lt;br /&gt;
|arg1 = {{type|number}} intLight&lt;br /&gt;
|arg2 = {{type|bool}} enable &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Light&lt;br /&gt;
|arg1 = {{type|number}} intLight&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Light_Specification|pname]]&lt;br /&gt;
|arg3 = {{type|number}} param &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Light&lt;br /&gt;
|arg1 = {{type|number}} intLight&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Light_Specification|pname]]&lt;br /&gt;
|arg3 = {{type|number}} param1&lt;br /&gt;
|arg4 = {{type|number}} param2&lt;br /&gt;
|arg5 = {{type|number}} param3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Material&lt;br /&gt;
|arg1 = {{type|table}} material&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = material contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;material = {&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = HasExtension&lt;br /&gt;
|arg1 = {{type|string}} extname &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} hasExtension&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetNumber&lt;br /&gt;
|arg1 = {{type|number}} ext&lt;br /&gt;
|arg2 = {{type|number}} intCount&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} number1 {{bracket}}, {{type|number}} number2, {{type|number}} number3, ... #count {{rbracket}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetString&lt;br /&gt;
|arg1 = {{type|number}} ext&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|string}} extString&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawGroundCircle&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = {{type|number}} divs {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} slope {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Number divs is the number of sides the circle will have. The higher the smoother the circle (and more GPU intensive).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawGroundQuad&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} useNorm {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tu1, {{type|number}} tv1&lt;br /&gt;
|arg7 = {{type|number}} tu2, {{type|number}} tv2 {{rbracket}} {{pipe}} {{bracket}} {{type|bool}} useTextureCoord {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: x1, z1, x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z correspond to the coordinates displayed by the tooltip.&amp;lt;br&amp;gt;Also note: useNorm does nothing!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateQuery&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|userdata}} query&lt;br /&gt;
|info = Needs &amp;gt;=OpengGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteQuery&lt;br /&gt;
|arg1 = {{type|userdata}} query&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs &amp;gt;=OpengGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RunQuery&lt;br /&gt;
|arg1 = {{type|userdata}} query&lt;br /&gt;
|arg2 = {{type|function}} func&lt;br /&gt;
|arg3 = {{type|arg1}}&lt;br /&gt;
|arg4 = {{type|arg2}}&lt;br /&gt;
|arg5 = ...&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs &amp;gt;=OpengGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetQuery&lt;br /&gt;
|arg1 = {{type|userdata}} query&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} renderedFragments&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ActiveTexture&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|function}} func {{bracket}}&lt;br /&gt;
|arg3 = {{type|arg1}}&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetGlobalTexNames&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|table}} texNames = { {{bracket|1}} = {{type|string}} texture, etc ...  }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetGlobalTexCoords&lt;br /&gt;
|arg1 = {{type|string}} 3doTextureName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} xstart, {{type|number}} ystart, {{type|number}} xend, {{type|number}} yend&lt;br /&gt;
|info = Gets the texcoord of a 3do texture in the 3do texture atlas.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnsafeState&lt;br /&gt;
|arg1 = {{type|number}} state  {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} disable_state {{rbracket}}&lt;br /&gt;
|arg3 = {{type|bool}} func&lt;br /&gt;
|arg4 = {{type|arg1}}&lt;br /&gt;
|arg5 = {{type|arg2}}&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetShadowMapParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} xmid, {{type|number}} ymid, {{type|number}} p17, {{type|number}} p18&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = GL.PROJECTION {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intI&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = GL.MODELVIEW {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intI&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = GL.TEXTURE {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intI&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadow&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;camera&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;caminv&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;camprj&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;billboard&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Flush&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Finish&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20981</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20981"/>
		<updated>2021-04-21T20:47:47Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadowDensity&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} shadowDensity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;diffuse&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;ambient&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;specular&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetAtmosphere&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetWaterRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMapRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigScreen&lt;br /&gt;
|arg1 = {{type|number}} screenWidth&lt;br /&gt;
|arg2 = {{type|number}} screenDistance&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Used for Unit LODs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} transform = true&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SlaveMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigMiniMap&lt;br /&gt;
|arg1 = {{type|number}} intPX&lt;br /&gt;
|arg2 = {{type|number}} intPY&lt;br /&gt;
|arg3 = {{type|number}} intSX&lt;br /&gt;
|arg4 = {{type|number}} intSY&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetViewSizes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Viewport&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Translate&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} angle&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Billboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MatrixMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadIdentity&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadMatrix&lt;br /&gt;
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Ortho&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Frustum&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushPopMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ClipPlane&lt;br /&gt;
|arg1 = {{type|number}} intPlane&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: intPlane can only be 1 or 2.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.DEPTH_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cleardepth {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.STENCIL_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intClearStencil {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.COLOR_BUFFER_BIT}} {{pipe}} {{type|GL.ACCUM_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = {{type|number}} a {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SwapBuffers&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetMatrices&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginEnd&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLType]]&lt;br /&gt;
|arg2 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg3 = arg1&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Color&lt;br /&gt;
|arg1 = {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} {{pipe}} {{type|table}} colors = { {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|table}} vertex = { {{type|number}} x,  {{type|number}} y,  {{bracket}},  {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z, {{type|number}} w&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Normal&lt;br /&gt;
|arg1 = {{type|table}} normal = { {{type|number}} x,  {{type|number}} y,  {{type|number}} z } {{pipe}} {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Rect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexRect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} flip_s, {{type|bool}} flip_t {{pipe}} {{type|number}} s1, {{type|number}} t1, {{type|number}} s2, {{type|number}} t2 {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Texture rect.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Shape&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLtype]]&lt;br /&gt;
|arg2 = {{type|table}} elements&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Elements contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SecondaryColor&lt;br /&gt;
|arg1 = {{type|table}} color = { {{type|number}} r, {{type|number}} g, {{type|number}} b } {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FogCoord&lt;br /&gt;
|arg1 = {{type|number}} value &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateList&lt;br /&gt;
|arg1 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} listID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CallList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} numElements&lt;br /&gt;
|arg2 = {{type|number}} numIndices {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} persistentBuffer = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} bufferID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ &lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UpdateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} elementPos&lt;br /&gt;
|arg3 = {{type|number}} indexPos&lt;br /&gt;
|arg4 = {{type|table}} tbl {{pipe}} {{type|function}} func &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&lt;br /&gt;
4 elements table example:&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&lt;br /&gt;
Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} primType {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} firstIndex = 0&lt;br /&gt;
|arg4 = {{type|number}} count = numElements {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Releases previously allocated VAO&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Text&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;options&amp;quot; {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextWidth&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} width  &lt;br /&gt;
|info = Width in pixels, with a font size of 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextHeight&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height, {{type|number}} descender, {{type|number}} numlines&lt;br /&gt;
|info = Height in pixels, with a font size of 1.0. Further descriptions here: [[GetTextHeight]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EndText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Unit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws a unit - on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitRaw&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShape&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} rawState&lt;br /&gt;
|arg4 = {{type|bool}} toScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = world space -&amp;gt; unit space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = unit space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws the unit piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use gl.UnitPieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Feature&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureRaw&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShape&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} custom&lt;br /&gt;
|arg4 = {{type|bool}} drawScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque  &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;world space -&amp;gt; feature space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;feature space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePiece&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Draws the Feature piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Use gl.FeaturePieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawListAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} listID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} midPos&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} degrees&lt;br /&gt;
|arg6 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawFuncAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} midPos&lt;br /&gt;
|arg3 = {{type|function}} {{bracket}}, arg1, ... {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|string}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Mode can be set to:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;add&amp;quot;&lt;br /&gt;
 = GL.ONE, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;reset&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;color&amp;quot;&lt;br /&gt;
 = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;modulate&amp;quot;&lt;br /&gt;
 = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;disable&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquation&lt;br /&gt;
|arg1 = {{type|number}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFunc&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquationSeparate&lt;br /&gt;
|arg1 = {{type|number}} modeRGB&lt;br /&gt;
|arg2 = {{type|number}} modeAlpha &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcRGB]]&lt;br /&gt;
|arg2 = {{type|number}} [Lua_ConstGL#BlendingFactorDest|dstRGB]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstAlpha]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = AlphaTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = {{type|number}} threshold &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Culling&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthClamp&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Not always available, needs GL.NV_depth_clamp!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthMask&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} masked &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} r, {{type|bool}} g, {{type|bool}} b, {{type|bool}} a&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LogicOp&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#LogicOp|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Fog&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Smoothing&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} point&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} line&lt;br /&gt;
|arg3 = {{type|bool}} enable {{pipe}} {{type|number}} polygon&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|number}} intX, {{type|number}} intY, {{type|number}} intW, {{type|number}} intH&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|string}} any&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use springs default line stipple.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|number}} intFactor&lt;br /&gt;
|arg2 = {{type|number}} pattern&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#PolygonMode|mode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonOffset&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} factor&lt;br /&gt;
|arg2 = {{type|number}} units &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushAttrib&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopAttrib&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilTest&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMask&lt;br /&gt;
|arg1 = {{type|number}} mask &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFunc&lt;br /&gt;
|arg1 = {{type|number}} func&lt;br /&gt;
|arg2 = {{type|number}} ref&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOp&lt;br /&gt;
|arg1 = {{type|number}} fail&lt;br /&gt;
|arg2 = {{type|number}} zfail&lt;br /&gt;
|arg3 = {{type|number}} zpass &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMaskSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} mask &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} func&lt;br /&gt;
|arg3 = {{type|number}} ref&lt;br /&gt;
|arg4 = {{type|number}} mask &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOpSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} fail&lt;br /&gt;
|arg3 = {{type|number}} zfail&lt;br /&gt;
|arg4 = {{type|number}} zpass &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineWidth&lt;br /&gt;
|arg1 = {{type|number}} width &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSize&lt;br /&gt;
|arg1 = {{type|number}} size &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSprite&lt;br /&gt;
|arg1 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} coord_replace&lt;br /&gt;
|arg3 = {{type|bool}} coord_origin_upper {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointParameter&lt;br /&gt;
|arg1 = {{type|number}} v1, {{type|number}} v2, {{type|number}} v3 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} sizeMin&lt;br /&gt;
|arg3 = {{type|number}} sizeMax&lt;br /&gt;
|arg4 = {{type|number}} sizeFade {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Texture&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} texNum, {{rbracket}} {{type|bool}} enable {{pipe}} {{type|string}} name&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} loaded&lt;br /&gt;
|info = This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span&amp;gt;name may be:&lt;br /&gt;
&lt;br /&gt;
#12&lt;br /&gt;
= unitDef 12 buildpic&lt;br /&gt;
&lt;br /&gt;
%34:1&lt;br /&gt;
= unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
&lt;br /&gt;
%-102:0&lt;br /&gt;
= featureDef 102 s3o tex1&lt;br /&gt;
&lt;br /&gt;
!56&lt;br /&gt;
= lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
&lt;br /&gt;
$units&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units1&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units2&lt;br /&gt;
= 3do textureatlas tex2&lt;br /&gt;
&lt;br /&gt;
$shadow&lt;br /&gt;
= shadowmap&lt;br /&gt;
&lt;br /&gt;
$specular&lt;br /&gt;
= specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$reflection &lt;br /&gt;
= reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$shading&lt;br /&gt;
= ground shading texture&lt;br /&gt;
&lt;br /&gt;
$grass&lt;br /&gt;
= grass shading texture&lt;br /&gt;
&lt;br /&gt;
$heightmap&lt;br /&gt;
= heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
&lt;br /&gt;
$minimap&lt;br /&gt;
= minimap texture&lt;br /&gt;
&lt;br /&gt;
$map_reflection&lt;br /&gt;
= same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$sky_reflection&lt;br /&gt;
= defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$detail&lt;br /&gt;
= detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$normals&lt;br /&gt;
= auto generated normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_normals&lt;br /&gt;
= SSMF normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_specular&lt;br /&gt;
= SSMF specular texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_distr&lt;br /&gt;
= SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_detail&lt;br /&gt;
= SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_normals&lt;br /&gt;
= SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
&lt;br /&gt;
$ssmf_emission&lt;br /&gt;
= SSMF emission texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_parallax&lt;br /&gt;
= SSMF parallax texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$info&lt;br /&gt;
= currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
&lt;br /&gt;
$info_losmap&lt;br /&gt;
= los texture (L-view)&lt;br /&gt;
&lt;br /&gt;
$info_mtlmap&lt;br /&gt;
= metal map texture (F4-view)&lt;br /&gt;
&lt;br /&gt;
$info_hgtmap&lt;br /&gt;
= height map texture (F1-view)&lt;br /&gt;
&lt;br /&gt;
$info_blkmap&lt;br /&gt;
= blocking map texture (F2-view)&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
${opt}:/LuaUI/images/image.png &lt;br /&gt;
= load a texture from the VFS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateTexture&lt;br /&gt;
|arg1 = {{type|number}} intXSize&lt;br /&gt;
|arg2 = {{type|number}} intYSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|table}} texProps {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} texture&lt;br /&gt;
|info = texProps contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;texProps = {&lt;br /&gt;
    [target     = number,](like GL.TEXTURE_1D,GL.TEXTURE_2D,...)(Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] (needs GLEW_EXT_framebuffer_object!)&lt;br /&gt;
    [fboDepth   = boolean,] (needs GLEW_EXT_framebuffer_object!)&lt;br /&gt;
    [samples    = number,] specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteTexture&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} deleted&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteTextureFBO&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} deleted&lt;br /&gt;
|info = Needs GLEW_EXT_framebuffer_object!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TextureInfo&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} texInfo&lt;br /&gt;
|info = texInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; texInfo = {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
The format of the texture string is the same as in gl.Texture().&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexCoord&lt;br /&gt;
|arg1 = {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} {{pipe}} {{type|table}} texCoords = { {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexEnv&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexEnv&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} var1&lt;br /&gt;
|arg4 = {{type|number}} var2&lt;br /&gt;
|arg5 = {{type|number}} var3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexEnv&lt;br /&gt;
|arg1 = {{type|number}} texNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexEnv&lt;br /&gt;
|arg1 = {{type|number}} texNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} var1&lt;br /&gt;
|arg5 = {{type|number}} var2&lt;br /&gt;
|arg6 = {{type|number}} var3&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|bool}} state &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|bool}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} var1&lt;br /&gt;
|arg4 = {{type|number}} var2&lt;br /&gt;
|arg5 = {{type|number}} var3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|bool}} state&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} var1&lt;br /&gt;
|arg5 = {{type|number}} var2&lt;br /&gt;
|arg6 = {{type|number}} var3&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CopyToTexture&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = {{type|number}} intXOff&lt;br /&gt;
|arg3 = {{type|number}} intYOff&lt;br /&gt;
|arg4 = {{type|number}} intX&lt;br /&gt;
|arg5 = {{type|number}} intY&lt;br /&gt;
|arg6 = {{type|number}} intW&lt;br /&gt;
|arg7 = {{type|number}} intH {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} target&lt;br /&gt;
|arg9 = {{type|number}} level {{rbracket}}&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderToTexture&lt;br /&gt;
|arg1 = {{type|string}} fbotexture&lt;br /&gt;
|arg2 = {{type|function}} lua_func &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs GLEW_EXT_framebuffer_object!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GenerateMipmap&lt;br /&gt;
|arg1 = {{type|string}} texture &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} created&lt;br /&gt;
|info = Needs glGenerateMipmapEXT!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitTextures&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShapeTextures&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureTextures&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShapeTextures&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SaveImage&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 = {{type|string}} filename {{bracket}}&lt;br /&gt;
|arg6 = {{type|table}} imgProps = { alpha={{type|bool}}, yflip={{type|bool}}, grayscale16bit={{type|bool}}, readbuffer={{type|number}} } {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ReadPixels&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} format = GL.RGBA {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r {{bracket}}, g {{bracket}}, b {{bracket}}, a {rbracket}}{rbracket}}{rbracket}} {{pipe}} {{type|table}} readPixels = { { { 1 = {{type|number}} r, 2 = {{type|number}} g, 3 = {{type|number}} b, 4 = {{type|number}} a}, ... }, ... }&lt;br /&gt;
|info = This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Lighting&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ShadeModel&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#ShadeModel|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Light&lt;br /&gt;
|arg1 = {{type|number}} intLight&lt;br /&gt;
|arg2 = {{type|bool}} enable &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Light&lt;br /&gt;
|arg1 = {{type|number}} intLight&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Light_Specification|pname]]&lt;br /&gt;
|arg3 = {{type|number}} param &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Light&lt;br /&gt;
|arg1 = {{type|number}} intLight&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Light_Specification|pname]]&lt;br /&gt;
|arg3 = {{type|number}} param1&lt;br /&gt;
|arg4 = {{type|number}} param2&lt;br /&gt;
|arg5 = {{type|number}} param3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Material&lt;br /&gt;
|arg1 = {{type|table}} material&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = material contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;material = {&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = HasExtension&lt;br /&gt;
|arg1 = {{type|string}} extname &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} hasExtension&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetNumber&lt;br /&gt;
|arg1 = {{type|number}} ext&lt;br /&gt;
|arg2 = {{type|number}} intCount&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} number1 {{bracket}}, {{type|number}} number2, {{type|number}} number3, ... #count {{rbracket}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetString&lt;br /&gt;
|arg1 = {{type|number}} ext&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|string}} extString&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawGroundCircle&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = {{type|number}} divs {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} slope {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Number divs is the number of sides the circle will have. The higher the smoother the circle (and more GPU intensive).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawGroundQuad&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} useNorm {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tu1, {{type|number}} tv1&lt;br /&gt;
|arg7 = {{type|number}} tu2, {{type|number}} tv2 {{rbracket}} {{pipe}} {{bracket}} {{type|bool}} useTextureCoord {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: x1, z1, x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z correspond to the coordinates displayed by the tooltip.&amp;lt;br&amp;gt;Also note: useNorm does nothing!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateQuery&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|userdata}} query&lt;br /&gt;
|info = Needs &amp;gt;=OpengGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteQuery&lt;br /&gt;
|arg1 = {{type|userdata}} query&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs &amp;gt;=OpengGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RunQuery&lt;br /&gt;
|arg1 = {{type|userdata}} query&lt;br /&gt;
|arg2 = {{type|function}} func&lt;br /&gt;
|arg3 = {{type|arg1}}&lt;br /&gt;
|arg4 = {{type|arg2}}&lt;br /&gt;
|arg5 = ...&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs &amp;gt;=OpengGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetQuery&lt;br /&gt;
|arg1 = {{type|userdata}} query&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} renderedFragments&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ActiveTexture&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|function}} func {{bracket}}&lt;br /&gt;
|arg3 = {{type|arg1}}&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetGlobalTexNames&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|table}} texNames = { {{bracket|1}} = {{type|string}} texture, etc ...  }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetGlobalTexCoords&lt;br /&gt;
|arg1 = {{type|string}} 3doTextureName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} xstart, {{type|number}} ystart, {{type|number}} xend, {{type|number}} yend&lt;br /&gt;
|info = Gets the texcoord of a 3do texture in the 3do texture atlas.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnsafeState&lt;br /&gt;
|arg1 = {{type|number}} state  {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} disable_state {{rbracket}}&lt;br /&gt;
|arg3 = {{type|bool}} func&lt;br /&gt;
|arg4 = {{type|arg1}}&lt;br /&gt;
|arg5 = {{type|arg2}}&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetShadowMapParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} xmid, {{type|number}} ymid, {{type|number}} p17, {{type|number}} p18&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = GL.PROJECTION {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intI&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = GL.MODELVIEW {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intI&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = GL.TEXTURE {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intI&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadow&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;camera&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;caminv&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;camprj&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMatrixData&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;billboard&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Flush&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Finish&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20980</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20980"/>
		<updated>2021-04-21T18:15:37Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadowDensity&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} shadowDensity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;diffuse&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;ambient&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;specular&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetAtmosphere&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetWaterRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMapRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigScreen&lt;br /&gt;
|arg1 = {{type|number}} screenWidth&lt;br /&gt;
|arg2 = {{type|number}} screenDistance&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Used for Unit LODs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} transform = true&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SlaveMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigMiniMap&lt;br /&gt;
|arg1 = {{type|number}} intPX&lt;br /&gt;
|arg2 = {{type|number}} intPY&lt;br /&gt;
|arg3 = {{type|number}} intSX&lt;br /&gt;
|arg4 = {{type|number}} intSY&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetViewSizes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Viewport&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Translate&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} angle&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Billboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MatrixMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadIdentity&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadMatrix&lt;br /&gt;
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Ortho&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Frustum&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushPopMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ClipPlane&lt;br /&gt;
|arg1 = {{type|number}} intPlane&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: intPlane can only be 1 or 2.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.DEPTH_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cleardepth {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.STENCIL_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intClearStencil {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.COLOR_BUFFER_BIT}} {{pipe}} {{type|GL.ACCUM_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = {{type|number}} a {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SwapBuffers&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetMatrices&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginEnd&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLType]]&lt;br /&gt;
|arg2 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg3 = arg1&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Color&lt;br /&gt;
|arg1 = {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} {{pipe}} {{type|table}} colors = { {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|table}} vertex = { {{type|number}} x,  {{type|number}} y,  {{bracket}},  {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z, {{type|number}} w&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Normal&lt;br /&gt;
|arg1 = {{type|table}} normal = { {{type|number}} x,  {{type|number}} y,  {{type|number}} z } {{pipe}} {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Rect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexRect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} flip_s, {{type|bool}} flip_t {{pipe}} {{type|number}} s1, {{type|number}} t1, {{type|number}} s2, {{type|number}} t2 {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Texture rect.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Shape&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLtype]]&lt;br /&gt;
|arg2 = {{type|table}} elements&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Elements contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SecondaryColor&lt;br /&gt;
|arg1 = {{type|table}} color = { {{type|number}} r, {{type|number}} g, {{type|number}} b } {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FogCoord&lt;br /&gt;
|arg1 = {{type|number}} value &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateList&lt;br /&gt;
|arg1 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} listID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CallList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} numElements&lt;br /&gt;
|arg2 = {{type|number}} numIndices {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} persistentBuffer = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} bufferID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ &lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UpdateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} elementPos&lt;br /&gt;
|arg3 = {{type|number}} indexPos&lt;br /&gt;
|arg4 = {{type|table}} tbl {{pipe}} {{type|function}} func &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&lt;br /&gt;
4 elements table example:&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&lt;br /&gt;
Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} primType {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} firstIndex = 0&lt;br /&gt;
|arg4 = {{type|number}} count = numElements {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Releases previously allocated VAO&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Text&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;options&amp;quot; {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextWidth&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} width  &lt;br /&gt;
|info = Width in pixels, with a font size of 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextHeight&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height, {{type|number}} descender, {{type|number}} numlines&lt;br /&gt;
|info = Height in pixels, with a font size of 1.0. Further descriptions here: [[GetTextHeight]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EndText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Unit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws a unit - on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitRaw&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShape&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} rawState&lt;br /&gt;
|arg4 = {{type|bool}} toScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = world space -&amp;gt; unit space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = unit space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws the unit piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use gl.UnitPieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Feature&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureRaw&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShape&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} custom&lt;br /&gt;
|arg4 = {{type|bool}} drawScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque  &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;world space -&amp;gt; feature space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;feature space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePiece&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Draws the Feature piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Use gl.FeaturePieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawListAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} listID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} midPos&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} degrees&lt;br /&gt;
|arg6 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawFuncAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} midPos&lt;br /&gt;
|arg3 = {{type|function}} {{bracket}}, arg1, ... {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|string}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Mode can be set to:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;add&amp;quot;&lt;br /&gt;
 = GL.ONE, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;reset&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;color&amp;quot;&lt;br /&gt;
 = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;modulate&amp;quot;&lt;br /&gt;
 = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;disable&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquation&lt;br /&gt;
|arg1 = {{type|number}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFunc&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquationSeparate&lt;br /&gt;
|arg1 = {{type|number}} modeRGB&lt;br /&gt;
|arg2 = {{type|number}} modeAlpha &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcRGB]]&lt;br /&gt;
|arg2 = {{type|number}} [Lua_ConstGL#BlendingFactorDest|dstRGB]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstAlpha]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = AlphaTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = {{type|number}} threshold &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Culling&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthClamp&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Not always available, needs GL.NV_depth_clamp!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthMask&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} masked &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} r, {{type|bool}} g, {{type|bool}} b, {{type|bool}} a&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LogicOp&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#LogicOp|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Fog&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Smoothing&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} point&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} line&lt;br /&gt;
|arg3 = {{type|bool}} enable {{pipe}} {{type|number}} polygon&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|number}} intX, {{type|number}} intY, {{type|number}} intW, {{type|number}} intH&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|string}} any&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use springs default line stipple.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|number}} intFactor&lt;br /&gt;
|arg2 = {{type|number}} pattern&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#PolygonMode|mode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonOffset&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} factor&lt;br /&gt;
|arg2 = {{type|number}} units &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushAttrib&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopAttrib&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilTest&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMask&lt;br /&gt;
|arg1 = {{type|number}} mask &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFunc&lt;br /&gt;
|arg1 = {{type|number}} func&lt;br /&gt;
|arg2 = {{type|number}} ref&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOp&lt;br /&gt;
|arg1 = {{type|number}} fail&lt;br /&gt;
|arg2 = {{type|number}} zfail&lt;br /&gt;
|arg3 = {{type|number}} zpass &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMaskSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} mask &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} func&lt;br /&gt;
|arg3 = {{type|number}} ref&lt;br /&gt;
|arg4 = {{type|number}} mask &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOpSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} fail&lt;br /&gt;
|arg3 = {{type|number}} zfail&lt;br /&gt;
|arg4 = {{type|number}} zpass &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineWidth&lt;br /&gt;
|arg1 = {{type|number}} width &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSize&lt;br /&gt;
|arg1 = {{type|number}} size &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSprite&lt;br /&gt;
|arg1 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} coord_replace&lt;br /&gt;
|arg3 = {{type|bool}} coord_origin_upper {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointParameter&lt;br /&gt;
|arg1 = {{type|number}} v1, {{type|number}} v2, {{type|number}} v3 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} sizeMin&lt;br /&gt;
|arg3 = {{type|number}} sizeMax&lt;br /&gt;
|arg4 = {{type|number}} sizeFade {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Texture&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} texNum, {{rbracket}} {{type|bool}} enable {{pipe}} {{type|string}} name&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} loaded&lt;br /&gt;
|info = This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span&amp;gt;name may be:&lt;br /&gt;
&lt;br /&gt;
#12&lt;br /&gt;
= unitDef 12 buildpic&lt;br /&gt;
&lt;br /&gt;
%34:1&lt;br /&gt;
= unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
&lt;br /&gt;
%-102:0&lt;br /&gt;
= featureDef 102 s3o tex1&lt;br /&gt;
&lt;br /&gt;
!56&lt;br /&gt;
= lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
&lt;br /&gt;
$units&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units1&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units2&lt;br /&gt;
= 3do textureatlas tex2&lt;br /&gt;
&lt;br /&gt;
$shadow&lt;br /&gt;
= shadowmap&lt;br /&gt;
&lt;br /&gt;
$specular&lt;br /&gt;
= specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$reflection &lt;br /&gt;
= reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$shading&lt;br /&gt;
= ground shading texture&lt;br /&gt;
&lt;br /&gt;
$grass&lt;br /&gt;
= grass shading texture&lt;br /&gt;
&lt;br /&gt;
$heightmap&lt;br /&gt;
= heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
&lt;br /&gt;
$minimap&lt;br /&gt;
= minimap texture&lt;br /&gt;
&lt;br /&gt;
$map_reflection&lt;br /&gt;
= same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$sky_reflection&lt;br /&gt;
= defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$detail&lt;br /&gt;
= detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$normals&lt;br /&gt;
= auto generated normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_normals&lt;br /&gt;
= SSMF normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_specular&lt;br /&gt;
= SSMF specular texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_distr&lt;br /&gt;
= SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_detail&lt;br /&gt;
= SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_normals&lt;br /&gt;
= SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
&lt;br /&gt;
$ssmf_emission&lt;br /&gt;
= SSMF emission texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_parallax&lt;br /&gt;
= SSMF parallax texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$info&lt;br /&gt;
= currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
&lt;br /&gt;
$info_losmap&lt;br /&gt;
= los texture (L-view)&lt;br /&gt;
&lt;br /&gt;
$info_mtlmap&lt;br /&gt;
= metal map texture (F4-view)&lt;br /&gt;
&lt;br /&gt;
$info_hgtmap&lt;br /&gt;
= height map texture (F1-view)&lt;br /&gt;
&lt;br /&gt;
$info_blkmap&lt;br /&gt;
= blocking map texture (F2-view)&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
${opt}:/LuaUI/images/image.png &lt;br /&gt;
= load a texture from the VFS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateTexture&lt;br /&gt;
|arg1 = {{type|number}} intXSize&lt;br /&gt;
|arg2 = {{type|number}} intYSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|table}} texProps {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} texture&lt;br /&gt;
|info = texProps contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;{{type|table}} texProps = {&lt;br /&gt;
    [target     = number,](like GL.TEXTURE_1D,GL.TEXTURE_2D,...)(Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] (needs GLEW_EXT_framebuffer_object!)&lt;br /&gt;
    [fboDepth   = boolean,] (needs GLEW_EXT_framebuffer_object!)&lt;br /&gt;
    [samples    = number,] specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteTexture&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} deleted&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteTextureFBO&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} deleted&lt;br /&gt;
|info = Needs GLEW_EXT_framebuffer_object!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TextureInfo&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} texInfo&lt;br /&gt;
|info = texInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; {{type|table}} texInfo = {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
The format of the texture string is the same as in gl.Texture().&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexCoord&lt;br /&gt;
|arg1 = {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} {{pipe}} {{type|table}} texCoords = { {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexEnv&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexEnv&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} var1&lt;br /&gt;
|arg4 = {{type|number}} var2&lt;br /&gt;
|arg5 = {{type|number}} var3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexEnv&lt;br /&gt;
|arg1 = {{type|number}} texNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexEnv&lt;br /&gt;
|arg1 = {{type|number}} texNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]] &lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} var1&lt;br /&gt;
|arg5 = {{type|number}} var2&lt;br /&gt;
|arg6 = {{type|number}} var3&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|bool}} state &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexGen&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg2 = {{type|bool}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg3 = {{type|number}} var1&lt;br /&gt;
|arg4 = {{type|number}} var2&lt;br /&gt;
|arg5 = {{type|number}} var3&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|bool}} state&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultiTexGen&lt;br /&gt;
|arg1 = {{type|number}} intTexNum&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]&lt;br /&gt;
|arg4 = {{type|number}} var1&lt;br /&gt;
|arg5 = {{type|number}} var2&lt;br /&gt;
|arg6 = {{type|number}} var3&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CopyToTexture&lt;br /&gt;
|arg1 = {{type|string}} texture&lt;br /&gt;
|arg2 = {{type|number}} intXOff&lt;br /&gt;
|arg3 = {{type|number}} intYOff&lt;br /&gt;
|arg4 = {{type|number}} intX&lt;br /&gt;
|arg5 = {{type|number}} intY&lt;br /&gt;
|arg6 = {{type|number}} intW&lt;br /&gt;
|arg7 = {{type|number}} intH {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} target&lt;br /&gt;
|arg9 = {{type|number}} level {{rbracket}}&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderToTexture&lt;br /&gt;
|arg1 = {{type|string}} fbotexture&lt;br /&gt;
|arg2 = {{type|function}} lua_func &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs GLEW_EXT_framebuffer_object!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
     &lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GenerateMipmap&lt;br /&gt;
|arg1 = {{type|string}} texture &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} created&lt;br /&gt;
|info = Needs glGenerateMipmapEXT!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitTextures&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShapeTextures&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureTextures&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShapeTextures&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&#039;&#039;&#039;gl.SaveImage&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h,&lt;br /&gt;
    string filename [, table {alpha=boolean, yflip=boolean, grayscale16bit=boolean, readbuffer=number} ] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ReadPixels&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h [, number format = GL.RGBA ] )&lt;br /&gt;
    -&amp;gt; nil &lt;br /&gt;
    | number r,[g,[b,[a]]] &lt;br /&gt;
    | table { { {1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&#039;&#039;&#039;gl.Lighting&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ShadeModel&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#ShadeModel|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Light&#039;&#039;&#039;&lt;br /&gt;
  ( int light, &lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param1, number param2, number param3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Material&#039;&#039;&#039;&lt;br /&gt;
  ({&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&#039;&#039;&#039;gl.HasExtension&#039;&#039;&#039;&lt;br /&gt;
  ( string extname ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetNumber&#039;&#039;&#039;&lt;br /&gt;
  ( number ext, int count ) -&amp;gt; number [, number, number, ... #count ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetString&#039;&#039;&#039;&lt;br /&gt;
  ( number ext ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundCircle&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: number divs is the number of sides the circle will have. the higher the smoother the circle (and more GPU intensive) &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundQuad&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: x1,z1,x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z are correspond to the coordinates displayed by the tooltip &amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number z1, number x2, number z2,&lt;br /&gt;
    [ boolean useNorm, &amp;lt;span class=warning&amp;gt;(does nothing!)&amp;lt;/span&amp;gt;&lt;br /&gt;
      [ number tu1, number tv1, number tu2, number tv2 |&lt;br /&gt;
        boolean useTextureCoord ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&#039;&#039;&#039;gl.CreateQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil | userdata query&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.RunQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query, function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.GetQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil | number renderedFragments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexNames&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; { [1] = string texture, etc ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexCoords&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;gets the texcoord of a 3do texture in the 3do texture atlas&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string 3doTextureName ) -&amp;gt; number xstart, number ystart, number xend, number yend&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnsafeState&#039;&#039;&#039;&lt;br /&gt;
  ( number state [, boolean disable_state ], function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShadowMapParams&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; number xmid, number ymid, number p17, number p18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMatrixData&#039;&#039;&#039;&lt;br /&gt;
  ( GL.PROJECTION [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( GL.MODELVIEW  [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i] &lt;br /&gt;
  ( GL.TEXTURE    [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( &amp;quot;shadow&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camera&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;caminv&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camprj&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;billboard&amp;quot; )             -&amp;gt; nil | number, etc.. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Flush&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Finish&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20979</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20979"/>
		<updated>2021-04-21T16:00:07Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadowDensity&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} shadowDensity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;diffuse&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;ambient&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;specular&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetAtmosphere&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetWaterRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMapRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigScreen&lt;br /&gt;
|arg1 = {{type|number}} screenWidth&lt;br /&gt;
|arg2 = {{type|number}} screenDistance&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Used for Unit LODs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} transform = true&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SlaveMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigMiniMap&lt;br /&gt;
|arg1 = {{type|number}} intPX&lt;br /&gt;
|arg2 = {{type|number}} intPY&lt;br /&gt;
|arg3 = {{type|number}} intSX&lt;br /&gt;
|arg4 = {{type|number}} intSY&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetViewSizes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Viewport&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Translate&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} angle&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Billboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MatrixMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadIdentity&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadMatrix&lt;br /&gt;
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Ortho&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Frustum&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushPopMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ClipPlane&lt;br /&gt;
|arg1 = {{type|number}} intPlane&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: intPlane can only be 1 or 2.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.DEPTH_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cleardepth {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.STENCIL_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intClearStencil {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.COLOR_BUFFER_BIT}} {{pipe}} {{type|GL.ACCUM_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = {{type|number}} a {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SwapBuffers&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetMatrices&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginEnd&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLType]]&lt;br /&gt;
|arg2 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg3 = arg1&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Color&lt;br /&gt;
|arg1 = {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} {{pipe}} {{type|table}} colors = { {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|table}} vertex = { {{type|number}} x,  {{type|number}} y,  {{bracket}},  {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z, {{type|number}} w&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Normal&lt;br /&gt;
|arg1 = {{type|table}} normal = { {{type|number}} x,  {{type|number}} y,  {{type|number}} z } {{pipe}} {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Rect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexRect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} flip_s, {{type|bool}} flip_t {{pipe}} {{type|number}} s1, {{type|number}} t1, {{type|number}} s2, {{type|number}} t2 {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Texture rect.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Shape&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLtype]]&lt;br /&gt;
|arg2 = {{type|table}} elements&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Elements contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SecondaryColor&lt;br /&gt;
|arg1 = {{type|table}} color = { {{type|number}} r, {{type|number}} g, {{type|number}} b } {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FogCoord&lt;br /&gt;
|arg1 = {{type|number}} value &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateList&lt;br /&gt;
|arg1 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} listID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CallList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} numElements&lt;br /&gt;
|arg2 = {{type|number}} numIndices {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} persistentBuffer = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} bufferID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ &lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UpdateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} elementPos&lt;br /&gt;
|arg3 = {{type|number}} indexPos&lt;br /&gt;
|arg4 = {{type|table}} tbl {{pipe}} {{type|function}} func &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&lt;br /&gt;
4 elements table example:&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&lt;br /&gt;
Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} primType {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} firstIndex = 0&lt;br /&gt;
|arg4 = {{type|number}} count = numElements {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Releases previously allocated VAO&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Text&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;options&amp;quot; {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextWidth&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} width  &lt;br /&gt;
|info = Width in pixels, with a font size of 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextHeight&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height, {{type|number}} descender, {{type|number}} numlines&lt;br /&gt;
|info = Height in pixels, with a font size of 1.0. Further descriptions here: [[GetTextHeight]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EndText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Unit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws a unit - on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitRaw&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShape&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} rawState&lt;br /&gt;
|arg4 = {{type|bool}} toScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = world space -&amp;gt; unit space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = unit space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws the unit piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use gl.UnitPieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Feature&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureRaw&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShape&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} custom&lt;br /&gt;
|arg4 = {{type|bool}} drawScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque  &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;world space -&amp;gt; feature space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;feature space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePiece&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Draws the Feature piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Use gl.FeaturePieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawListAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} listID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} midPos&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} degrees&lt;br /&gt;
|arg6 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawFuncAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} midPos&lt;br /&gt;
|arg3 = {{type|function}} {{bracket}}, arg1, ... {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|string}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Mode can be set to:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;add&amp;quot;&lt;br /&gt;
 = GL.ONE, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;reset&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;color&amp;quot;&lt;br /&gt;
 = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;modulate&amp;quot;&lt;br /&gt;
 = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;disable&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquation&lt;br /&gt;
|arg1 = {{type|number}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFunc&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquationSeparate&lt;br /&gt;
|arg1 = {{type|number}} modeRGB&lt;br /&gt;
|arg2 = {{type|number}} modeAlpha &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcRGB]]&lt;br /&gt;
|arg2 = {{type|number}} [Lua_ConstGL#BlendingFactorDest|dstRGB]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstAlpha]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = AlphaTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = {{type|number}} threshold &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Culling&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthClamp&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Not always available, needs GL.NV_depth_clamp!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthMask&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} masked &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} r, {{type|bool}} g, {{type|bool}} b, {{type|bool}} a&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LogicOp&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#LogicOp|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Fog&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Smoothing&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} point&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} line&lt;br /&gt;
|arg3 = {{type|bool}} enable {{pipe}} {{type|number}} polygon&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|number}} intX, {{type|number}} intY, {{type|number}} intW, {{type|number}} intH&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|string}} any&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use springs default line stipple.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|number}} intFactor&lt;br /&gt;
|arg2 = {{type|number}} pattern&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#PolygonMode|mode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonOffset&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} factor&lt;br /&gt;
|arg2 = {{type|number}} units &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushAttrib&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopAttrib&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilTest&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMask&lt;br /&gt;
|arg1 = {{type|number}} mask &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFunc&lt;br /&gt;
|arg1 = {{type|number}} func&lt;br /&gt;
|arg2 = {{type|number}} ref&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOp&lt;br /&gt;
|arg1 = {{type|number}} fail&lt;br /&gt;
|arg2 = {{type|number}} zfail&lt;br /&gt;
|arg3 = {{type|number}} zpass &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilMaskSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} mask &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} func&lt;br /&gt;
|arg3 = {{type|number}} ref&lt;br /&gt;
|arg4 = {{type|number}} mask &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = StencilOpSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} fail&lt;br /&gt;
|arg3 = {{type|number}} zfail&lt;br /&gt;
|arg4 = {{type|number}} zpass &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineWidth&lt;br /&gt;
|arg1 = {{type|number}} width &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSize&lt;br /&gt;
|arg1 = {{type|number}} size &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointSprite&lt;br /&gt;
|arg1 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} coord_replace&lt;br /&gt;
|arg3 = {{type|bool}} coord_origin_upper {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PointParameter&lt;br /&gt;
|arg1 = {{type|number}} v1, {{type|number}} v2, {{type|number}} v3 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} sizeMin&lt;br /&gt;
|arg3 = {{type|number}} sizeMax&lt;br /&gt;
|arg4 = {{type|number}} sizeFade {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs OpenGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Texture&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} texNum, {{rbracket}} {{type|bool}} enable {{pipe}} {{type|string}} name&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} loaded&lt;br /&gt;
|info = This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span&amp;gt;name may be:&lt;br /&gt;
&lt;br /&gt;
#12&lt;br /&gt;
= unitDef 12 buildpic&lt;br /&gt;
&lt;br /&gt;
%34:1&lt;br /&gt;
= unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
&lt;br /&gt;
%-102:0&lt;br /&gt;
= featureDef 102 s3o tex1&lt;br /&gt;
&lt;br /&gt;
!56&lt;br /&gt;
= lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
&lt;br /&gt;
$units&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units1&lt;br /&gt;
= 3do textureatlas tex1&lt;br /&gt;
&lt;br /&gt;
$units2&lt;br /&gt;
= 3do textureatlas tex2&lt;br /&gt;
&lt;br /&gt;
$shadow&lt;br /&gt;
= shadowmap&lt;br /&gt;
&lt;br /&gt;
$specular&lt;br /&gt;
= specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$reflection &lt;br /&gt;
= reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
$shading&lt;br /&gt;
= ground shading texture&lt;br /&gt;
&lt;br /&gt;
$grass&lt;br /&gt;
= grass shading texture&lt;br /&gt;
&lt;br /&gt;
$heightmap&lt;br /&gt;
= heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
&lt;br /&gt;
$minimap&lt;br /&gt;
= minimap texture&lt;br /&gt;
&lt;br /&gt;
$map_reflection&lt;br /&gt;
= same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$sky_reflection&lt;br /&gt;
= defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$detail&lt;br /&gt;
= detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$normals&lt;br /&gt;
= auto generated normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_normals&lt;br /&gt;
= SSMF normals texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_specular&lt;br /&gt;
= SSMF specular texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_distr&lt;br /&gt;
= SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_detail&lt;br /&gt;
= SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_splat_normals&lt;br /&gt;
= SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
&lt;br /&gt;
$ssmf_emission&lt;br /&gt;
= SSMF emission texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$ssmf_parallax&lt;br /&gt;
= SSMF parallax texture {{new|101.0}}&lt;br /&gt;
&lt;br /&gt;
$info&lt;br /&gt;
= currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
&lt;br /&gt;
$info_losmap&lt;br /&gt;
= los texture (L-view)&lt;br /&gt;
&lt;br /&gt;
$info_mtlmap&lt;br /&gt;
= metal map texture (F4-view)&lt;br /&gt;
&lt;br /&gt;
$info_hgtmap&lt;br /&gt;
= height map texture (F1-view)&lt;br /&gt;
&lt;br /&gt;
$info_blkmap&lt;br /&gt;
= blocking map texture (F2-view)&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$map_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_normtex&lt;br /&gt;
= contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_difftex&lt;br /&gt;
= contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_spectex&lt;br /&gt;
= contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_emittex&lt;br /&gt;
= for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_misctex&lt;br /&gt;
= for arbitrary shader data  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
$model_gbuffer_zvaltex&lt;br /&gt;
= contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
&lt;br /&gt;
${opt}:/LuaUI/images/image.png &lt;br /&gt;
= load a texture from the VFS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int xsize, int ysize,&lt;br /&gt;
  [ { &lt;br /&gt;
    [target     = number,] &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(like GL.TEXTURE_1D,GL.TEXTURE_2D,...)&amp;lt;/font&amp;gt; &amp;lt;font color=darkblue&amp;gt; (Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [fboDepth   = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [samples    = number,] &amp;lt;font color=darkblue&amp;gt; specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
  } ]&lt;br /&gt;
  ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTexture&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTextureFBO&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TextureInfo&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; nil | {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
   the format of the texture string is the same as in gl.Texture()&lt;br /&gt;
&amp;lt;/font&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number x | &lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum,&lt;br /&gt;
    number x |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexGen&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexGen&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil       &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CopyToTexture&#039;&#039;&#039;&lt;br /&gt;
  (string texture, int xoff, int yoff, int x, int y, int w, int h &lt;br /&gt;
  [,number target,number level])-&amp;gt;nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderToTexture&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string fbotexture, lua_func ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GenerateMipmap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs glGenerateMipmapEXT!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&#039;&#039;&#039;gl.SaveImage&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h,&lt;br /&gt;
    string filename [, table {alpha=boolean, yflip=boolean, grayscale16bit=boolean, readbuffer=number} ] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ReadPixels&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h [, number format = GL.RGBA ] )&lt;br /&gt;
    -&amp;gt; nil &lt;br /&gt;
    | number r,[g,[b,[a]]] &lt;br /&gt;
    | table { { {1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&#039;&#039;&#039;gl.Lighting&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ShadeModel&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#ShadeModel|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Light&#039;&#039;&#039;&lt;br /&gt;
  ( int light, &lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param1, number param2, number param3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Material&#039;&#039;&#039;&lt;br /&gt;
  ({&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&#039;&#039;&#039;gl.HasExtension&#039;&#039;&#039;&lt;br /&gt;
  ( string extname ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetNumber&#039;&#039;&#039;&lt;br /&gt;
  ( number ext, int count ) -&amp;gt; number [, number, number, ... #count ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetString&#039;&#039;&#039;&lt;br /&gt;
  ( number ext ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundCircle&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: number divs is the number of sides the circle will have. the higher the smoother the circle (and more GPU intensive) &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundQuad&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: x1,z1,x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z are correspond to the coordinates displayed by the tooltip &amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number z1, number x2, number z2,&lt;br /&gt;
    [ boolean useNorm, &amp;lt;span class=warning&amp;gt;(does nothing!)&amp;lt;/span&amp;gt;&lt;br /&gt;
      [ number tu1, number tv1, number tu2, number tv2 |&lt;br /&gt;
        boolean useTextureCoord ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&#039;&#039;&#039;gl.CreateQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil | userdata query&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.RunQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query, function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.GetQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil | number renderedFragments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexNames&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; { [1] = string texture, etc ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexCoords&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;gets the texcoord of a 3do texture in the 3do texture atlas&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string 3doTextureName ) -&amp;gt; number xstart, number ystart, number xend, number yend&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnsafeState&#039;&#039;&#039;&lt;br /&gt;
  ( number state [, boolean disable_state ], function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShadowMapParams&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; number xmid, number ymid, number p17, number p18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMatrixData&#039;&#039;&#039;&lt;br /&gt;
  ( GL.PROJECTION [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( GL.MODELVIEW  [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i] &lt;br /&gt;
  ( GL.TEXTURE    [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( &amp;quot;shadow&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camera&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;caminv&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camprj&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;billboard&amp;quot; )             -&amp;gt; nil | number, etc.. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Flush&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Finish&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20978</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20978"/>
		<updated>2021-04-21T13:22:56Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadowDensity&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} shadowDensity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;diffuse&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;ambient&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;specular&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetAtmosphere&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetWaterRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMapRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigScreen&lt;br /&gt;
|arg1 = {{type|number}} screenWidth&lt;br /&gt;
|arg2 = {{type|number}} screenDistance&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Used for Unit LODs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} transform = true&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SlaveMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigMiniMap&lt;br /&gt;
|arg1 = {{type|number}} intPX&lt;br /&gt;
|arg2 = {{type|number}} intPY&lt;br /&gt;
|arg3 = {{type|number}} intSX&lt;br /&gt;
|arg4 = {{type|number}} intSY&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetViewSizes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Viewport&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Translate&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} angle&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Billboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MatrixMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadIdentity&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadMatrix&lt;br /&gt;
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Ortho&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Frustum&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushPopMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ClipPlane&lt;br /&gt;
|arg1 = {{type|number}} intPlane&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: intPlane can only be 1 or 2.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.DEPTH_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cleardepth {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.STENCIL_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intClearStencil {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.COLOR_BUFFER_BIT}} {{pipe}} {{type|GL.ACCUM_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = {{type|number}} a {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SwapBuffers&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetMatrices&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginEnd&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLType]]&lt;br /&gt;
|arg2 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg3 = arg1&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Color&lt;br /&gt;
|arg1 = {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} {{pipe}} {{type|table}} colors = { {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|table}} vertex = { {{type|number}} x,  {{type|number}} y,  {{bracket}},  {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z, {{type|number}} w&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Normal&lt;br /&gt;
|arg1 = {{type|table}} normal = { {{type|number}} x,  {{type|number}} y,  {{type|number}} z } {{pipe}} {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Rect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexRect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} flip_s, {{type|bool}} flip_t {{pipe}} {{type|number}} s1, {{type|number}} t1, {{type|number}} s2, {{type|number}} t2 {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Texture rect.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Shape&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLtype]]&lt;br /&gt;
|arg2 = {{type|table}} elements&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Elements contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SecondaryColor&lt;br /&gt;
|arg1 = {{type|table}} color = { {{type|number}} r, {{type|number}} g, {{type|number}} b } {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FogCoord&lt;br /&gt;
|arg1 = {{type|number}} value &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateList&lt;br /&gt;
|arg1 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} listID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CallList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} numElements&lt;br /&gt;
|arg2 = {{type|number}} numIndices {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} persistentBuffer = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} bufferID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ &lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UpdateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} elementPos&lt;br /&gt;
|arg3 = {{type|number}} indexPos&lt;br /&gt;
|arg4 = {{type|table}} tbl {{pipe}} {{type|function}} func &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&lt;br /&gt;
4 elements table example:&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&lt;br /&gt;
Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} primType {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} firstIndex = 0&lt;br /&gt;
|arg4 = {{type|number}} count = numElements {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Releases previously allocated VAO&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Text&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;options&amp;quot; {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextWidth&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} width  &lt;br /&gt;
|info = Width in pixels, with a font size of 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetTextHeight&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;text&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height, {{type|number}} descender, {{type|number}} numlines&lt;br /&gt;
|info = Height in pixels, with a font size of 1.0. Further descriptions here: [[GetTextHeight]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EndText&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Unit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws a unit - on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitRaw&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitShape&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} rawState&lt;br /&gt;
|arg4 = {{type|bool}} toScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = world space -&amp;gt; unit space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = unit space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Draws the unit piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use gl.UnitPieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Feature&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureRaw&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} rawdraw&lt;br /&gt;
|arg3 = {{type|number}} intLOD {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureShape&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = {{type|bool}} custom&lt;br /&gt;
|arg4 = {{type|bool}} drawScreen&lt;br /&gt;
|arg5 = {{type|bool}} opaque  &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeatureMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;world space -&amp;gt; feature space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMultMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;feature space -&amp;gt; piece space&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePiece&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Draws the Feature piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} intPiece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Use gl.FeaturePieceMultMatrix instead!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawListAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} listID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} midPos&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} degrees&lt;br /&gt;
|arg6 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ {{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawFuncAtUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} midPos&lt;br /&gt;
|arg3 = {{type|function}} {{bracket}}, arg1, ... {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Blending&lt;br /&gt;
|arg1 = {{type|string}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Mode can be set to:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;add&amp;quot;&lt;br /&gt;
 = GL.ONE, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;alpha&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;reset&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;color&amp;quot;&lt;br /&gt;
 = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;modulate&amp;quot;&lt;br /&gt;
 = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;disable&amp;quot;&lt;br /&gt;
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquation&lt;br /&gt;
|arg1 = {{type|number}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFunc&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendEquationSeparate&lt;br /&gt;
|arg1 = {{type|number}} modeRGB&lt;br /&gt;
|arg2 = {{type|number}} modeAlpha &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BlendFuncSeparate&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcRGB]]&lt;br /&gt;
|arg2 = {{type|number}} [Lua_ConstGL#BlendingFactorDest|dstRGB]]&lt;br /&gt;
|arg3 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]]&lt;br /&gt;
|arg4 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstAlpha]]&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Needs openGL2.0!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = AlphaTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = {{type|number}} threshold &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthTest&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Culling&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthClamp&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Not always available, needs GL.NV_depth_clamp!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DepthMask&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} masked &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ColorMask&lt;br /&gt;
|arg1 = {{type|bool}} r, {{type|bool}} g, {{type|bool}} b, {{type|bool}} a&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LogicOp&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#LogicOp|func]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Fog&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Smoothing&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} point&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} line&lt;br /&gt;
|arg3 = {{type|bool}} enable {{pipe}} {{type|number}} polygon&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scissor&lt;br /&gt;
|arg1 = {{type|number}} intX, {{type|number}} intY, {{type|number}} intW, {{type|number}} intH&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|string}} any&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use springs default line stipple.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|bool}} enable &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LineStipple&lt;br /&gt;
|arg1 = {{type|number}} intFactor&lt;br /&gt;
|arg2 = {{type|number}} pattern&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]&lt;br /&gt;
|arg2 = {{type|number}} [[Lua_ConstGL#PolygonMode|mode]]&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PolygonOffset&lt;br /&gt;
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} factor&lt;br /&gt;
|arg2 = {{type|number}} units &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushAttrib&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopAttrib&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&#039;&#039;&#039;gl.StencilTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMask&#039;&#039;&#039;&lt;br /&gt;
  ( number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOp&#039;&#039;&#039;&lt;br /&gt;
  ( number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMaskSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOpSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&#039;&#039;&#039;gl.LineWidth&#039;&#039;&#039;&lt;br /&gt;
  ( number width ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSize&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number size ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSprite&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable, [boolean coord_replace, boolean coord_origin_upper] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointParameter&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number v1, number v2, number v3, &lt;br /&gt;
    [ number sizeMin, number sizeMax, number sizeFade ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&#039;&#039;&#039;gl.Texture&#039;&#039;&#039;&lt;br /&gt;
  ( [ number texNum, ] boolean enable | string &amp;lt;span class=note&amp;gt;name&amp;lt;/span&amp;gt; ) -&amp;gt; nil | boolean loaded&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99; text-align:left&amp;quot; |`name` may be:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | #12&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 12 buildpic&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %34:1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %-102:0&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = featureDef 102 s3o tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | !56&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units2&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shadow&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = shadowmap&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $reflection &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shading&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = ground shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $grass&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = grass shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $heightmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $minimap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = minimap texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $sky_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = auto generated normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF specular texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_distr&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_emission&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF emission texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_parallax&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF parallax texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_losmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = los texture (L-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_mtlmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = metal map texture (F4-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_hgtmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = height map texture (F1-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_blkmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = blocking map texture (F2-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&amp;lt;br/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | ${opt}:/LuaUI/images/image.png &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = load a texture from the VFS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int xsize, int ysize,&lt;br /&gt;
  [ { &lt;br /&gt;
    [target     = number,] &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(like GL.TEXTURE_1D,GL.TEXTURE_2D,...)&amp;lt;/font&amp;gt; &amp;lt;font color=darkblue&amp;gt; (Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [fboDepth   = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [samples    = number,] &amp;lt;font color=darkblue&amp;gt; specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
  } ]&lt;br /&gt;
  ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTexture&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTextureFBO&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TextureInfo&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; nil | {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
   the format of the texture string is the same as in gl.Texture()&lt;br /&gt;
&amp;lt;/font&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number x | &lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum,&lt;br /&gt;
    number x |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexGen&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexGen&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil       &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CopyToTexture&#039;&#039;&#039;&lt;br /&gt;
  (string texture, int xoff, int yoff, int x, int y, int w, int h &lt;br /&gt;
  [,number target,number level])-&amp;gt;nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderToTexture&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string fbotexture, lua_func ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GenerateMipmap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs glGenerateMipmapEXT!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&#039;&#039;&#039;gl.SaveImage&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h,&lt;br /&gt;
    string filename [, table {alpha=boolean, yflip=boolean, grayscale16bit=boolean, readbuffer=number} ] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ReadPixels&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h [, number format = GL.RGBA ] )&lt;br /&gt;
    -&amp;gt; nil &lt;br /&gt;
    | number r,[g,[b,[a]]] &lt;br /&gt;
    | table { { {1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&#039;&#039;&#039;gl.Lighting&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ShadeModel&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#ShadeModel|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Light&#039;&#039;&#039;&lt;br /&gt;
  ( int light, &lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param1, number param2, number param3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Material&#039;&#039;&#039;&lt;br /&gt;
  ({&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&#039;&#039;&#039;gl.HasExtension&#039;&#039;&#039;&lt;br /&gt;
  ( string extname ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetNumber&#039;&#039;&#039;&lt;br /&gt;
  ( number ext, int count ) -&amp;gt; number [, number, number, ... #count ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetString&#039;&#039;&#039;&lt;br /&gt;
  ( number ext ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundCircle&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: number divs is the number of sides the circle will have. the higher the smoother the circle (and more GPU intensive) &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundQuad&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: x1,z1,x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z are correspond to the coordinates displayed by the tooltip &amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number z1, number x2, number z2,&lt;br /&gt;
    [ boolean useNorm, &amp;lt;span class=warning&amp;gt;(does nothing!)&amp;lt;/span&amp;gt;&lt;br /&gt;
      [ number tu1, number tv1, number tu2, number tv2 |&lt;br /&gt;
        boolean useTextureCoord ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&#039;&#039;&#039;gl.CreateQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil | userdata query&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.RunQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query, function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.GetQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil | number renderedFragments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexNames&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; { [1] = string texture, etc ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexCoords&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;gets the texcoord of a 3do texture in the 3do texture atlas&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string 3doTextureName ) -&amp;gt; number xstart, number ystart, number xend, number yend&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnsafeState&#039;&#039;&#039;&lt;br /&gt;
  ( number state [, boolean disable_state ], function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShadowMapParams&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; number xmid, number ymid, number p17, number p18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMatrixData&#039;&#039;&#039;&lt;br /&gt;
  ( GL.PROJECTION [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( GL.MODELVIEW  [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i] &lt;br /&gt;
  ( GL.TEXTURE    [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( &amp;quot;shadow&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camera&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;caminv&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camprj&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;billboard&amp;quot; )             -&amp;gt; nil | number, etc.. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Flush&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Finish&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20977</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20977"/>
		<updated>2021-04-21T11:09:20Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadowDensity&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} shadowDensity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;diffuse&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;ambient&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;specular&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetAtmosphere&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetWaterRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMapRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigScreen&lt;br /&gt;
|arg1 = {{type|number}} screenWidth&lt;br /&gt;
|arg2 = {{type|number}} screenDistance&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Used for Unit LODs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} transform = true&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SlaveMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigMiniMap&lt;br /&gt;
|arg1 = {{type|number}} intPX&lt;br /&gt;
|arg2 = {{type|number}} intPY&lt;br /&gt;
|arg3 = {{type|number}} intSX&lt;br /&gt;
|arg4 = {{type|number}} intSY&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetViewSizes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Viewport&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Translate&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} angle&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Billboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MatrixMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadIdentity&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadMatrix&lt;br /&gt;
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Ortho&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Frustum&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushPopMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ClipPlane&lt;br /&gt;
|arg1 = {{type|number}} intPlane&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: intPlane can only be 1 or 2.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.DEPTH_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cleardepth {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.STENCIL_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} intClearStencil {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Clear&lt;br /&gt;
|arg1 = {{type|GL.COLOR_BUFFER_BIT}} {{pipe}} {{type|GL.ACCUM_BUFFER_BIT}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = {{type|number}} a {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SwapBuffers&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ResetMatrices&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = BeginEnd&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLType]]&lt;br /&gt;
|arg2 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg3 = arg1&lt;br /&gt;
|arg4 = ... {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Color&lt;br /&gt;
|arg1 = {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} {{pipe}} {{type|table}} colors = { {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|table}} vertex = { {{type|number}} x,  {{type|number}} y,  {{bracket}},  {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}} }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Vertex&lt;br /&gt;
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z, {{type|number}} w&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Normal&lt;br /&gt;
|arg1 = {{type|table}} normal = { {{type|number}} x,  {{type|number}} y,  {{type|number}} z } {{pipe}} {{type|number}} x,  {{type|number}} y,  {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = EdgeFlag&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Rect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = TexRect&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} y2 {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} flip_s, {{type|bool}} flip_t {{pipe}} {{type|number}} s1, {{type|number}} t1, {{type|number}} s2, {{type|number}} t2 {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Texture rect.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Shape&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLtype]]&lt;br /&gt;
|arg2 = {{type|table}} elements&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Elements contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SecondaryColor&lt;br /&gt;
|arg1 = {{type|table}} color = { {{type|number}} r, {{type|number}} g, {{type|number}} b } {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = FogCoord&lt;br /&gt;
|arg1 = {{type|number}} value &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateList&lt;br /&gt;
|arg1 = {{type|function}} {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} listID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CallList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteList&lt;br /&gt;
|arg1 = {{type|number}} listID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} numElements&lt;br /&gt;
|arg2 = {{type|number}} numIndices {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} persistentBuffer = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} bufferID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ &lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UpdateVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} elementPos&lt;br /&gt;
|arg3 = {{type|number}} indexPos&lt;br /&gt;
|arg4 = {{type|table}} tbl {{pipe}} {{type|function}} func &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&lt;br /&gt;
4 elements table example:&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&lt;br /&gt;
Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = RenderVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = {{type|number}} primType {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} firstIndex = 0&lt;br /&gt;
|arg4 = {{type|number}} count = numElements {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteVertexArray&lt;br /&gt;
|arg1 = {{type|number}} bufferID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Releases previously allocated VAO&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&#039;&#039;&#039;gl.Text&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;, number x, number y, number size [, string &amp;lt;span class=note&amp;gt;&amp;quot;options&amp;quot;&amp;lt;/span&amp;gt;] )&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
http://home.arcor.de/jkei/fontlines.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextWidth&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;) -&amp;gt; number width  &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextHeight&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot; ) -&amp;gt; nil | number height, number descender, number numlines &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;further descriptions here: [[GetTextHeight]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&amp;lt;b&amp;gt;If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;gl.BeginText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.EndText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&#039;&#039;&#039;gl.Unit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws an unit; on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitRaw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true )&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShape&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number teamID, bool rawState, bool toScreen, bool opaque ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
{{new|101.0}} The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(world space -&amp;gt; unit space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(unit space -&amp;gt; piece space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPiece&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws the unit piece)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(use gl.UnitPieceMultMatrix instead!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Feature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureRaw&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShape&#039;&#039;&#039;&lt;br /&gt;
  ( number featureDefID, number teamID, bool custom, bool drawScreen, bool opaque  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureMultMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(world space -&amp;gt; feature space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePieceMultMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(feature space -&amp;gt; piece space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePiece&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws the Feature piece)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePieceMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(use gl.FeaturePieceMultMatrix instead!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawListAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number listID, [ boolean midPos,&lt;br /&gt;
      number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
      number degrees, number rotX, number rotX, number rotZ ] ) -&amp;gt; nil &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawFuncAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean midPos, function [, arg1,... ]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&#039;&#039;&#039;gl.Blending&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
  ( string &amp;lt;span class=note&amp;gt;mode&amp;lt;/span&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99&amp;quot; | mode maybe:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.ONE, GL.ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;reset&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;color&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;modulate&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;disable&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquation&#039;&#039;&#039;&lt;br /&gt;
  ( number mode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquationSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number modeRGB, number modeAlpha ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcRGB]], number [[Lua_ConstGL#BlendingFactorDest|dstRGB]],  number [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]], number [[Lua_ConstGL#BlendingFactorDest|dstAlpha]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.AlphaTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]], number threshold ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Culling&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#Culling|face]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthClamp&#039;&#039;&#039;  &amp;lt;span class=warning&amp;gt;not always available, needs GL.NV_depth_clamp!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ColorMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( boolean r, boolean g, boolean b, boolean a ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LogicOp&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#LogicOp|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Fog&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Smoothing&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
 ( (boolean enable | number POINT), &lt;br /&gt;
   (boolean enable | number LINE),&lt;br /&gt;
   (boolean enable | number POLYGON) ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.EdgeFlag&#039;&#039;&#039;&lt;br /&gt;
 ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Scissor&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( int x, int y, int w, int h ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LineStipple&#039;&#039;&#039;&lt;br /&gt;
  ( string any ) -&amp;gt; nil &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(use springs default line stipple)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
  ( int factor, number pattern ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonMode&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number [[Lua_ConstGL#PolygonMode|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonOffset&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number factor, number units ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushAttrib&#039;&#039;&#039;&lt;br /&gt;
  ( [ number [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PopAttrib&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&#039;&#039;&#039;gl.StencilTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMask&#039;&#039;&#039;&lt;br /&gt;
  ( number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOp&#039;&#039;&#039;&lt;br /&gt;
  ( number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMaskSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOpSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&#039;&#039;&#039;gl.LineWidth&#039;&#039;&#039;&lt;br /&gt;
  ( number width ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSize&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number size ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSprite&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable, [boolean coord_replace, boolean coord_origin_upper] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointParameter&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number v1, number v2, number v3, &lt;br /&gt;
    [ number sizeMin, number sizeMax, number sizeFade ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&#039;&#039;&#039;gl.Texture&#039;&#039;&#039;&lt;br /&gt;
  ( [ number texNum, ] boolean enable | string &amp;lt;span class=note&amp;gt;name&amp;lt;/span&amp;gt; ) -&amp;gt; nil | boolean loaded&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99; text-align:left&amp;quot; |`name` may be:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | #12&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 12 buildpic&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %34:1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %-102:0&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = featureDef 102 s3o tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | !56&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units2&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shadow&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = shadowmap&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $reflection &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shading&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = ground shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $grass&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = grass shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $heightmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $minimap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = minimap texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $sky_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = auto generated normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF specular texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_distr&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_emission&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF emission texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_parallax&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF parallax texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_losmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = los texture (L-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_mtlmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = metal map texture (F4-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_hgtmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = height map texture (F1-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_blkmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = blocking map texture (F2-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&amp;lt;br/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | ${opt}:/LuaUI/images/image.png &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = load a texture from the VFS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int xsize, int ysize,&lt;br /&gt;
  [ { &lt;br /&gt;
    [target     = number,] &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(like GL.TEXTURE_1D,GL.TEXTURE_2D,...)&amp;lt;/font&amp;gt; &amp;lt;font color=darkblue&amp;gt; (Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [fboDepth   = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [samples    = number,] &amp;lt;font color=darkblue&amp;gt; specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
  } ]&lt;br /&gt;
  ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTexture&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTextureFBO&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TextureInfo&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; nil | {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
   the format of the texture string is the same as in gl.Texture()&lt;br /&gt;
&amp;lt;/font&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number x | &lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum,&lt;br /&gt;
    number x |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexGen&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexGen&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil       &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CopyToTexture&#039;&#039;&#039;&lt;br /&gt;
  (string texture, int xoff, int yoff, int x, int y, int w, int h &lt;br /&gt;
  [,number target,number level])-&amp;gt;nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderToTexture&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string fbotexture, lua_func ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GenerateMipmap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs glGenerateMipmapEXT!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&#039;&#039;&#039;gl.SaveImage&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h,&lt;br /&gt;
    string filename [, table {alpha=boolean, yflip=boolean, grayscale16bit=boolean, readbuffer=number} ] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ReadPixels&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h [, number format = GL.RGBA ] )&lt;br /&gt;
    -&amp;gt; nil &lt;br /&gt;
    | number r,[g,[b,[a]]] &lt;br /&gt;
    | table { { {1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&#039;&#039;&#039;gl.Lighting&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ShadeModel&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#ShadeModel|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Light&#039;&#039;&#039;&lt;br /&gt;
  ( int light, &lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param1, number param2, number param3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Material&#039;&#039;&#039;&lt;br /&gt;
  ({&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&#039;&#039;&#039;gl.HasExtension&#039;&#039;&#039;&lt;br /&gt;
  ( string extname ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetNumber&#039;&#039;&#039;&lt;br /&gt;
  ( number ext, int count ) -&amp;gt; number [, number, number, ... #count ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetString&#039;&#039;&#039;&lt;br /&gt;
  ( number ext ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundCircle&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: number divs is the number of sides the circle will have. the higher the smoother the circle (and more GPU intensive) &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundQuad&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: x1,z1,x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z are correspond to the coordinates displayed by the tooltip &amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number z1, number x2, number z2,&lt;br /&gt;
    [ boolean useNorm, &amp;lt;span class=warning&amp;gt;(does nothing!)&amp;lt;/span&amp;gt;&lt;br /&gt;
      [ number tu1, number tv1, number tu2, number tv2 |&lt;br /&gt;
        boolean useTextureCoord ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&#039;&#039;&#039;gl.CreateQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil | userdata query&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.RunQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query, function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.GetQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil | number renderedFragments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexNames&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; { [1] = string texture, etc ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexCoords&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;gets the texcoord of a 3do texture in the 3do texture atlas&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string 3doTextureName ) -&amp;gt; number xstart, number ystart, number xend, number yend&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnsafeState&#039;&#039;&#039;&lt;br /&gt;
  ( number state [, boolean disable_state ], function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShadowMapParams&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; number xmid, number ymid, number p17, number p18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMatrixData&#039;&#039;&#039;&lt;br /&gt;
  ( GL.PROJECTION [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( GL.MODELVIEW  [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i] &lt;br /&gt;
  ( GL.TEXTURE    [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( &amp;quot;shadow&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camera&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;caminv&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camprj&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;billboard&amp;quot; )             -&amp;gt; nil | number, etc.. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Flush&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Finish&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20976</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20976"/>
		<updated>2021-04-21T08:53:51Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;shadowDensity&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} shadowDensity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;diffuse&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;ambient&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;specular&amp;quot; {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;unit&amp;quot; {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetAtmosphere&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetWaterRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetMapRendering&lt;br /&gt;
|arg1 = {{type|string}} name &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active &lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigScreen&lt;br /&gt;
|arg1 = {{type|number}} screenWidth&lt;br /&gt;
|arg2 = {{type|number}} screenDistance&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Used for Unit LODs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DrawMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} transform = true&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SlaveMiniMap&lt;br /&gt;
|arg1 = {{type|bool}} mode&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ConfigMiniMap&lt;br /&gt;
|arg1 = {{type|number}} intPX&lt;br /&gt;
|arg2 = {{type|number}} intPY&lt;br /&gt;
|arg3 = {{type|number}} intSX&lt;br /&gt;
|arg4 = {{type|number}} intSY&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetViewSizes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Viewport&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} w&lt;br /&gt;
|arg4 = {{type|number}} h&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PopMatrix&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Translate&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Scale&lt;br /&gt;
|arg1 = {{type|number}} angle&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Billboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MatrixMode&lt;br /&gt;
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadIdentity&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = LoadMatrix&lt;br /&gt;
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = MultMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Ortho&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Frustum&lt;br /&gt;
|arg1 = {{type|number}} left&lt;br /&gt;
|arg2 = {{type|number}} right&lt;br /&gt;
|arg3 = {{type|number}} bottom&lt;br /&gt;
|arg4 = {{type|number}} top&lt;br /&gt;
|arg5 = {{type|number}} near&lt;br /&gt;
|arg6 = {{type|number}} far &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = PushPopMatrix&lt;br /&gt;
|arg1 = ???&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ClipPlane&lt;br /&gt;
|arg1 = {{type|number}} intPlane&lt;br /&gt;
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: intPlane can only be 1 or 2.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&#039;&#039;&#039;gl.Clear&#039;&#039;&#039;&lt;br /&gt;
  ( GL.DEPTH_BUFFER_BIT [, number cleardepth] ) -&amp;gt; nil&lt;br /&gt;
  ( GL.STENCIL_BUFFER_BIT [, int clearstencil] ) -&amp;gt; nil&lt;br /&gt;
  ( GL.COLOR_BUFFER_BIT | GL.ACCUM_BUFFER_BIT [, number r, number g, number b, number a] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SwapBuffers&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&#039;&#039;&#039;gl.ResetState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&amp;lt;/span&amp;gt;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ResetMatrices&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&#039;&#039;&#039;gl.BeginEnd&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Drawing_Primitives|GLType]], function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Color&#039;&#039;&#039;&lt;br /&gt;
  ( { number r, number g, number b[, number a] } |&lt;br /&gt;
      number r, number g, number b[, number a] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Vertex&#039;&#039;&#039;&lt;br /&gt;
  ( { number x, number y [, number z [, number w ]] } |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Normal&#039;&#039;&#039;&lt;br /&gt;
  (  number x, number y, number z |&lt;br /&gt;
   { number x, number y, number z } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.EdgeFlag&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Rect&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number y1, number x2, number y2 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexRect&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;texture rect&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number y1, number x2, number y2,&lt;br /&gt;
  [ boolean flip_s, boolean flip_t | number s1, number t1, number s2, number t2 ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Shape&#039;&#039;&#039;&lt;br /&gt;
 ( number [[Lua_ConstGL#Drawing_Primitives|GLtype]],&lt;br /&gt;
   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&lt;br /&gt;
 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SecondaryColor&#039;&#039;&#039;&lt;br /&gt;
  ( { number r, number g, number b } |&lt;br /&gt;
      number r, number g, number b ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FogCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number value ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateList&#039;&#039;&#039;&lt;br /&gt;
  ( function [,arg1 [,arg2...]] ) -&amp;gt; number listID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CallList&#039;&#039;&#039;&lt;br /&gt;
  ( number listID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteList&#039;&#039;&#039;&lt;br /&gt;
  ( number listID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateVertexArray&#039;&#039;&#039;&lt;br /&gt;
  ( number numElements, number numIndices, [boolean persistentBuffer = false] ) -&amp;gt; number bufferID&lt;br /&gt;
&lt;br /&gt;
See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/&amp;lt;br&amp;gt;&lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&amp;lt;br&amp;gt;&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UpdateVertexArray&#039;&#039;&#039;&lt;br /&gt;
  ( number bufferID, number elementPos, number indexPos, table tbl | function func ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&amp;lt;br&amp;gt;&lt;br /&gt;
4 elements table example:&amp;lt;br&amp;gt;&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional, use in case of indexed VBO&amp;lt;/font&amp;gt;&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&amp;lt;br&amp;gt;Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderVertexArray&#039;&#039;&#039;&lt;br /&gt;
  ( number bufferID, number primType, [number firstIndex = 0, count = numElements]  ) -&amp;gt; boolean success&lt;br /&gt;
primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&amp;lt;br&amp;gt;&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&amp;lt;br&amp;gt;&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteVertexArray&#039;&#039;&#039;&lt;br /&gt;
 ( number bufferID ) -&amp;gt; boolean success&lt;br /&gt;
Releases previously allocated VAO&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&#039;&#039;&#039;gl.Text&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;, number x, number y, number size [, string &amp;lt;span class=note&amp;gt;&amp;quot;options&amp;quot;&amp;lt;/span&amp;gt;] )&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
http://home.arcor.de/jkei/fontlines.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextWidth&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;) -&amp;gt; number width  &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextHeight&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot; ) -&amp;gt; nil | number height, number descender, number numlines &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;further descriptions here: [[GetTextHeight]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&amp;lt;b&amp;gt;If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;gl.BeginText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.EndText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&#039;&#039;&#039;gl.Unit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws an unit; on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitRaw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true )&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShape&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number teamID, bool rawState, bool toScreen, bool opaque ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
{{new|101.0}} The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(world space -&amp;gt; unit space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(unit space -&amp;gt; piece space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPiece&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws the unit piece)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(use gl.UnitPieceMultMatrix instead!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Feature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureRaw&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShape&#039;&#039;&#039;&lt;br /&gt;
  ( number featureDefID, number teamID, bool custom, bool drawScreen, bool opaque  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureMultMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(world space -&amp;gt; feature space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePieceMultMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(feature space -&amp;gt; piece space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePiece&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws the Feature piece)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePieceMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(use gl.FeaturePieceMultMatrix instead!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawListAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number listID, [ boolean midPos,&lt;br /&gt;
      number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
      number degrees, number rotX, number rotX, number rotZ ] ) -&amp;gt; nil &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawFuncAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean midPos, function [, arg1,... ]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&#039;&#039;&#039;gl.Blending&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
  ( string &amp;lt;span class=note&amp;gt;mode&amp;lt;/span&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99&amp;quot; | mode maybe:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.ONE, GL.ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;reset&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;color&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;modulate&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;disable&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquation&#039;&#039;&#039;&lt;br /&gt;
  ( number mode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquationSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number modeRGB, number modeAlpha ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcRGB]], number [[Lua_ConstGL#BlendingFactorDest|dstRGB]],  number [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]], number [[Lua_ConstGL#BlendingFactorDest|dstAlpha]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.AlphaTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]], number threshold ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Culling&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#Culling|face]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthClamp&#039;&#039;&#039;  &amp;lt;span class=warning&amp;gt;not always available, needs GL.NV_depth_clamp!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ColorMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( boolean r, boolean g, boolean b, boolean a ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LogicOp&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#LogicOp|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Fog&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Smoothing&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
 ( (boolean enable | number POINT), &lt;br /&gt;
   (boolean enable | number LINE),&lt;br /&gt;
   (boolean enable | number POLYGON) ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.EdgeFlag&#039;&#039;&#039;&lt;br /&gt;
 ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Scissor&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( int x, int y, int w, int h ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LineStipple&#039;&#039;&#039;&lt;br /&gt;
  ( string any ) -&amp;gt; nil &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(use springs default line stipple)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
  ( int factor, number pattern ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonMode&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number [[Lua_ConstGL#PolygonMode|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonOffset&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number factor, number units ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushAttrib&#039;&#039;&#039;&lt;br /&gt;
  ( [ number [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PopAttrib&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&#039;&#039;&#039;gl.StencilTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMask&#039;&#039;&#039;&lt;br /&gt;
  ( number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOp&#039;&#039;&#039;&lt;br /&gt;
  ( number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMaskSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOpSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&#039;&#039;&#039;gl.LineWidth&#039;&#039;&#039;&lt;br /&gt;
  ( number width ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSize&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number size ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSprite&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable, [boolean coord_replace, boolean coord_origin_upper] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointParameter&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number v1, number v2, number v3, &lt;br /&gt;
    [ number sizeMin, number sizeMax, number sizeFade ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&#039;&#039;&#039;gl.Texture&#039;&#039;&#039;&lt;br /&gt;
  ( [ number texNum, ] boolean enable | string &amp;lt;span class=note&amp;gt;name&amp;lt;/span&amp;gt; ) -&amp;gt; nil | boolean loaded&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99; text-align:left&amp;quot; |`name` may be:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | #12&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 12 buildpic&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %34:1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %-102:0&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = featureDef 102 s3o tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | !56&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units2&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shadow&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = shadowmap&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $reflection &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shading&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = ground shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $grass&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = grass shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $heightmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $minimap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = minimap texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $sky_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = auto generated normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF specular texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_distr&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_emission&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF emission texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_parallax&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF parallax texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_losmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = los texture (L-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_mtlmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = metal map texture (F4-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_hgtmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = height map texture (F1-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_blkmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = blocking map texture (F2-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&amp;lt;br/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | ${opt}:/LuaUI/images/image.png &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = load a texture from the VFS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int xsize, int ysize,&lt;br /&gt;
  [ { &lt;br /&gt;
    [target     = number,] &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(like GL.TEXTURE_1D,GL.TEXTURE_2D,...)&amp;lt;/font&amp;gt; &amp;lt;font color=darkblue&amp;gt; (Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [fboDepth   = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [samples    = number,] &amp;lt;font color=darkblue&amp;gt; specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
  } ]&lt;br /&gt;
  ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTexture&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTextureFBO&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TextureInfo&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; nil | {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
   the format of the texture string is the same as in gl.Texture()&lt;br /&gt;
&amp;lt;/font&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number x | &lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum,&lt;br /&gt;
    number x |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexGen&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexGen&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil       &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CopyToTexture&#039;&#039;&#039;&lt;br /&gt;
  (string texture, int xoff, int yoff, int x, int y, int w, int h &lt;br /&gt;
  [,number target,number level])-&amp;gt;nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderToTexture&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string fbotexture, lua_func ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GenerateMipmap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs glGenerateMipmapEXT!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&#039;&#039;&#039;gl.SaveImage&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h,&lt;br /&gt;
    string filename [, table {alpha=boolean, yflip=boolean, grayscale16bit=boolean, readbuffer=number} ] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ReadPixels&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h [, number format = GL.RGBA ] )&lt;br /&gt;
    -&amp;gt; nil &lt;br /&gt;
    | number r,[g,[b,[a]]] &lt;br /&gt;
    | table { { {1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&#039;&#039;&#039;gl.Lighting&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ShadeModel&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#ShadeModel|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Light&#039;&#039;&#039;&lt;br /&gt;
  ( int light, &lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param1, number param2, number param3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Material&#039;&#039;&#039;&lt;br /&gt;
  ({&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&#039;&#039;&#039;gl.HasExtension&#039;&#039;&#039;&lt;br /&gt;
  ( string extname ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetNumber&#039;&#039;&#039;&lt;br /&gt;
  ( number ext, int count ) -&amp;gt; number [, number, number, ... #count ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetString&#039;&#039;&#039;&lt;br /&gt;
  ( number ext ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundCircle&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: number divs is the number of sides the circle will have. the higher the smoother the circle (and more GPU intensive) &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundQuad&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: x1,z1,x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z are correspond to the coordinates displayed by the tooltip &amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number z1, number x2, number z2,&lt;br /&gt;
    [ boolean useNorm, &amp;lt;span class=warning&amp;gt;(does nothing!)&amp;lt;/span&amp;gt;&lt;br /&gt;
      [ number tu1, number tv1, number tu2, number tv2 |&lt;br /&gt;
        boolean useTextureCoord ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&#039;&#039;&#039;gl.CreateQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil | userdata query&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.RunQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query, function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.GetQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil | number renderedFragments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexNames&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; { [1] = string texture, etc ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexCoords&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;gets the texcoord of a 3do texture in the 3do texture atlas&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string 3doTextureName ) -&amp;gt; number xstart, number ystart, number xend, number yend&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnsafeState&#039;&#039;&#039;&lt;br /&gt;
  ( number state [, boolean disable_state ], function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShadowMapParams&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; number xmid, number ymid, number p17, number p18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMatrixData&#039;&#039;&#039;&lt;br /&gt;
  ( GL.PROJECTION [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( GL.MODELVIEW  [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i] &lt;br /&gt;
  ( GL.TEXTURE    [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( &amp;quot;shadow&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camera&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;caminv&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camprj&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;billboard&amp;quot; )             -&amp;gt; nil | number, etc.. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Flush&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Finish&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20975</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20975"/>
		<updated>2021-04-21T07:59:02Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Spring =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetSun&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;pos&amp;quot;&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetSun&#039;&#039;&#039;&lt;br /&gt;
  &amp;lt;font style=&amp;quot;font-size:90%&amp;quot;&amp;gt;()        -&amp;gt; number sunPosX, number sunPosY, number sunPosZ&lt;br /&gt;
  ( &amp;quot;pos&amp;quot; ) -&amp;gt; number sunPosX, number sunPosY, number sunPosZ&lt;br /&gt;
  ( &amp;quot;shadowDensity&amp;quot; [, &amp;quot;unit&amp;quot;] ) -&amp;gt; number shadowDensity&lt;br /&gt;
  ( &amp;quot;diffuse&amp;quot;       [, &amp;quot;unit&amp;quot;] ) -&amp;gt; nil | number r, number g, number b&lt;br /&gt;
  ( &amp;quot;ambient&amp;quot;       [, &amp;quot;unit&amp;quot;] ) -&amp;gt; nil | number r, number g, number b&lt;br /&gt;
  ( &amp;quot;specular&amp;quot;      [, &amp;quot;unit&amp;quot;] ) -&amp;gt; nil | number r, number g, number b&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetAtmosphere&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string name ) -&amp;gt; number r, number g, number b&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetWaterRendering&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( string name ) -&amp;gt; number r, number g, number b | string texName | number scalar | boolean active | nil&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMapRendering&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( string name ) -&amp;gt; number r, number g, number b | boolean active | nil&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ConfigScreen&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;used for Unit LODs&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number screenWidth, number screenDistance ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawMiniMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;argument new in 0.82+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;boolean tansform = true&amp;lt;/span&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SlaveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( boolean mode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ConfigMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( int px, int py, int sx, int sy ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetViewSizes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number x, number y&lt;br /&gt;
&lt;br /&gt;
= Matrices &amp;amp; Viewport =&lt;br /&gt;
&#039;&#039;&#039;gl.Viewport&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushMatrix&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PopMatrix&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
	&lt;br /&gt;
&#039;&#039;&#039;gl.Translate&#039;&#039;&#039;&lt;br /&gt;
  (number x, number y, number z) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Scale&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Rotate&#039;&#039;&#039;&lt;br /&gt;
  ( number angle, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Billboard&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Use this to draw 2d primitives in DrawWorld().&lt;br /&gt;
To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:&lt;br /&gt;
  gl.PushMatrix()&lt;br /&gt;
  gl.Texture(read what you need here)&lt;br /&gt;
  gl.Translate(x,y,z)&lt;br /&gt;
  gl.Billboard()			&lt;br /&gt;
  gl.TexRect(x1,y1,x2,y2)&lt;br /&gt;
  gl.PopMatrix()&amp;lt;/span &amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MatrixMode&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#MatrixMode|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LoadIdentity&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LoadMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( 16 numbers or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( ?? ) -&amp;gt; ??&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Ortho&#039;&#039;&#039;&lt;br /&gt;
  ( number left, number right, number bottom, number top, number near, number far ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Frustum&#039;&#039;&#039;&lt;br /&gt;
  ( number left, number right, number bottom, number top, number near, number far ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushPopMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( ?? ) -&amp;gt; ??&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ClipPlane&#039;&#039;&#039;&lt;br /&gt;
  ( int plane, &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: $plane can only be 1 or 2&amp;lt;/font&amp;gt;&lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number A, number B, number C, number D ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Clear =&lt;br /&gt;
&#039;&#039;&#039;gl.Clear&#039;&#039;&#039;&lt;br /&gt;
  ( GL.DEPTH_BUFFER_BIT [, number cleardepth] ) -&amp;gt; nil&lt;br /&gt;
  ( GL.STENCIL_BUFFER_BIT [, int clearstencil] ) -&amp;gt; nil&lt;br /&gt;
  ( GL.COLOR_BUFFER_BIT | GL.ACCUM_BUFFER_BIT [, number r, number g, number b, number a] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SwapBuffers&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Available only in LuaMenu, meant for frame-limited LuaMenu&#039;s that want identical content in both buffers.&lt;br /&gt;
&lt;br /&gt;
= ResetState/Matrices =&lt;br /&gt;
&#039;&#039;&#039;gl.ResetState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;DON&#039;T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!&amp;lt;/span&amp;gt;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  ShadeModel = GL.SMOOTH&lt;br /&gt;
  Scissor    = false&lt;br /&gt;
  Texture    = false&lt;br /&gt;
  Lighting    = false,&lt;br /&gt;
  ColorMask  = true, true, true, true&lt;br /&gt;
  DepthMask  = false&lt;br /&gt;
  DepthTest  = false  (GL.LEQUAL)&lt;br /&gt;
  Culling    = false  (GL.BACK)&lt;br /&gt;
  LogicOp    = false  (GL.INVERT)&lt;br /&gt;
  AlphaTest  = false  (GL.GREATER, 0.5f)&lt;br /&gt;
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ResetMatrices&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  Resets GL.TEXTURE matrix stack&lt;br /&gt;
  Resets GL.MODELVIEW matrix stack&lt;br /&gt;
  Resets GL.PROJECTION matrix stack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Draw Basics =&lt;br /&gt;
&#039;&#039;&#039;gl.BeginEnd&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Drawing_Primitives|GLType]], function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Color&#039;&#039;&#039;&lt;br /&gt;
  ( { number r, number g, number b[, number a] } |&lt;br /&gt;
      number r, number g, number b[, number a] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Vertex&#039;&#039;&#039;&lt;br /&gt;
  ( { number x, number y [, number z [, number w ]] } |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Normal&#039;&#039;&#039;&lt;br /&gt;
  (  number x, number y, number z |&lt;br /&gt;
   { number x, number y, number z } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.EdgeFlag&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Rect&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number y1, number x2, number y2 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexRect&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;texture rect&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number y1, number x2, number y2,&lt;br /&gt;
  [ boolean flip_s, boolean flip_t | number s1, number t1, number s2, number t2 ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Shape&#039;&#039;&#039;&lt;br /&gt;
 ( number [[Lua_ConstGL#Drawing_Primitives|GLtype]],&lt;br /&gt;
   elements = {&lt;br /&gt;
     [1] = { v | vertex   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;required&amp;lt;/font&amp;gt;&lt;br /&gt;
             n | normal   = { number x, number y, number z },           &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             t | texcoord = { number x, number y },                     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
             c | color    = { number r, number g, number b, number a }  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional&amp;lt;/font&amp;gt;&lt;br /&gt;
     },&lt;br /&gt;
     etc ...&lt;br /&gt;
   }&lt;br /&gt;
 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.SecondaryColor&#039;&#039;&#039;&lt;br /&gt;
  ( { number r, number g, number b } |&lt;br /&gt;
      number r, number g, number b ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FogCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number value ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Display Lists =&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateList&#039;&#039;&#039;&lt;br /&gt;
  ( function [,arg1 [,arg2...]] ) -&amp;gt; number listID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CallList&#039;&#039;&#039;&lt;br /&gt;
  ( number listID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteList&#039;&#039;&#039;&lt;br /&gt;
  ( number listID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Vertex Array Objects =&lt;br /&gt;
&amp;lt;span class=note&amp;gt; &amp;lt;font color=darkblue&amp;gt; Only available in &amp;quot;develop&amp;quot; branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. &amp;lt;/font&amp;gt; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateVertexArray&#039;&#039;&#039;&lt;br /&gt;
  ( number numElements, number numIndices, [boolean persistentBuffer = false] ) -&amp;gt; number bufferID&lt;br /&gt;
&lt;br /&gt;
See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/&amp;lt;br&amp;gt;&lt;br /&gt;
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0&amp;lt;br&amp;gt;&lt;br /&gt;
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UpdateVertexArray&#039;&#039;&#039;&lt;br /&gt;
  ( number bufferID, number elementPos, number indexPos, table tbl | function func ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data&amp;lt;br&amp;gt;&lt;br /&gt;
4 elements table example:&amp;lt;br&amp;gt;&lt;br /&gt;
  local verts = {&lt;br /&gt;
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},&lt;br /&gt;
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },&lt;br /&gt;
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},&lt;br /&gt;
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},&lt;br /&gt;
    i = {0, 1, 2, 2, 1, 3},            &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;optional, use in case of indexed VBO&amp;lt;/font&amp;gt;&lt;br /&gt;
    c1 = {...} }&lt;br /&gt;
&amp;lt;br&amp;gt;Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderVertexArray&#039;&#039;&#039;&lt;br /&gt;
  ( number bufferID, number primType, [number firstIndex = 0, count = numElements]  ) -&amp;gt; boolean success&lt;br /&gt;
primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES&amp;lt;br&amp;gt;&lt;br /&gt;
firstIndex specifies the starting index in the enabled arrays.&amp;lt;br&amp;gt;&lt;br /&gt;
count specifies the number of indices to be rendered.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteVertexArray&#039;&#039;&#039;&lt;br /&gt;
 ( number bufferID ) -&amp;gt; boolean success&lt;br /&gt;
Releases previously allocated VAO&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Text =&lt;br /&gt;
&#039;&#039;&#039;gl.Text&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;, number x, number y, number size [, string &amp;lt;span class=note&amp;gt;&amp;quot;options&amp;quot;&amp;lt;/span&amp;gt;] )&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
  options are:&lt;br /&gt;
    horizontal alignment:&lt;br /&gt;
       &#039;c&#039; = center&lt;br /&gt;
       &#039;r&#039; = right&lt;br /&gt;
    vertical alignment:&lt;br /&gt;
       &#039;a&#039; = ascender&lt;br /&gt;
       &#039;t&#039; = top&lt;br /&gt;
       &#039;v&#039; = vertical center&lt;br /&gt;
       &#039;x&#039; = baseline&lt;br /&gt;
       &#039;b&#039; = bottom&lt;br /&gt;
       &#039;d&#039; = descender&lt;br /&gt;
    decorations:&lt;br /&gt;
       &#039;o&#039; = black outline&lt;br /&gt;
       &#039;O&#039; = white outline&lt;br /&gt;
       &#039;s&#039; = shadow&lt;br /&gt;
    other:&lt;br /&gt;
       &#039;n&#039; = don&#039;t round vertex coords to nearest integer (font may get blurry)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
http://home.arcor.de/jkei/fontlines.png&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextWidth&#039;&#039;&#039;&lt;br /&gt;
  (string &amp;quot;text&amp;quot;) -&amp;gt; number width  &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetTextHeight&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot; ) -&amp;gt; nil | number height, number descender, number numlines &amp;lt;span class=note&amp;gt;(in pixels, with a font size of 1.0)&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;further descriptions here: [[GetTextHeight]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&amp;lt;b&amp;gt;If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;gl.BeginText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.EndText&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Unit/Feature Draw Functions =&lt;br /&gt;
&#039;&#039;&#039;gl.Unit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws an unit; on default it uses LOD, with lod&amp;lt;0 it is turned off, else it defines a specific level)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitRaw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(doesn&#039;t apply worldspace-&amp;gt;unit transformation! only works if &amp;lt;i&amp;gt;rawdraw&amp;lt;/i&amp;gt; is true )&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShape&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number teamID, bool rawState, bool toScreen, bool opaque ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
{{new|101.0}} The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in &#039;false&#039; for the THIRD argument to get the fixed behavior, omit it or pass in &#039;true&#039; [default] to render with your own custom state instead. The FOURTH argument should be &#039;true&#039; if in DrawScreen and &#039;false&#039; (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque (&#039;true&#039; [default]) or with translucency (&#039;false&#039;); only has an effect when argument #3 is false.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(world space -&amp;gt; unit space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMultMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(unit space -&amp;gt; piece space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPiece&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws the unit piece)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitPieceMatrix&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(use gl.UnitPieceMultMatrix instead!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Feature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureRaw&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, [ boolean rawdraw, int lod ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShape&#039;&#039;&#039;&lt;br /&gt;
  ( number featureDefID, number teamID, bool custom, bool drawScreen, bool opaque  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureMultMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(world space -&amp;gt; feature space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePieceMultMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(feature space -&amp;gt; piece space)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePiece&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(draws the Feature piece)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeaturePieceMatrix&#039;&#039;&#039; {{new|101.0}} &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(use gl.FeaturePieceMultMatrix instead!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, int piece ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawListAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number listID, [ boolean midPos,&lt;br /&gt;
      number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
      number degrees, number rotX, number rotX, number rotZ ] ) -&amp;gt; nil &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawFuncAtUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, boolean midPos, function [, arg1,... ]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= States (Blending,AlphaTest...) =&lt;br /&gt;
&#039;&#039;&#039;gl.Blending&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
  ( string &amp;lt;span class=note&amp;gt;mode&amp;lt;/span&amp;gt; ) -&amp;gt; nil&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99&amp;quot; | mode maybe:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.ONE, GL.ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha_add&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;alpha&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;reset&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;color&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;modulate&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.DST_COLOR, GL.ZERO&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | &amp;quot;disable&amp;quot;&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquation&#039;&#039;&#039;&lt;br /&gt;
  ( number mode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcmode]], number [[Lua_ConstGL#BlendingFactorDest|dstmode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendEquationSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number modeRGB, number modeAlpha ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.BlendFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#BlendingFactorSrc|srcRGB]], number [[Lua_ConstGL#BlendingFactorDest|dstRGB]],  number [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]], number [[Lua_ConstGL#BlendingFactorDest|dstAlpha]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.AlphaTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]], number threshold ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Culling&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#Culling|face]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthClamp&#039;&#039;&#039;  &amp;lt;span class=warning&amp;gt;not always available, needs GL.NV_depth_clamp!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DepthMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ColorMask&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( boolean r, boolean g, boolean b, boolean a ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LogicOp&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number [[Lua_ConstGL#LogicOp|func]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Fog&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Smoothing&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
 ( (boolean enable | number POINT), &lt;br /&gt;
   (boolean enable | number LINE),&lt;br /&gt;
   (boolean enable | number POLYGON) ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.EdgeFlag&#039;&#039;&#039;&lt;br /&gt;
 ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Scissor&#039;&#039;&#039;&lt;br /&gt;
  ( boolean ) -&amp;gt; nil&lt;br /&gt;
  ( int x, int y, int w, int h ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.LineStipple&#039;&#039;&#039;&lt;br /&gt;
  ( string any ) -&amp;gt; nil &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(use springs default line stipple)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
  ( int factor, number pattern ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonMode&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number [[Lua_ConstGL#PolygonMode|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PolygonOffset&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable | number factor, number units ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PushAttrib&#039;&#039;&#039;&lt;br /&gt;
  ( [ number [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PopAttrib&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Stencil =&lt;br /&gt;
&#039;&#039;&#039;gl.StencilTest&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMask&#039;&#039;&#039;&lt;br /&gt;
  ( number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFunc&#039;&#039;&#039;&lt;br /&gt;
  ( number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOp&#039;&#039;&#039;&lt;br /&gt;
  ( number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.StencilMaskSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilFuncSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number func, number ref, number mask ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.StencilOpSeparate&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;(needs openGL2.0!)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number [[Lua_ConstGL#Culling|face]], number fail, number zfail, number zpass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= LineWidth &amp;amp; PointSize =&lt;br /&gt;
&#039;&#039;&#039;gl.LineWidth&#039;&#039;&#039;&lt;br /&gt;
  ( number width ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSize&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number size ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointSprite&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable, [boolean coord_replace, boolean coord_origin_upper] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.PointParameter&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs openGL2.0!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number v1, number v2, number v3, &lt;br /&gt;
    [ number sizeMin, number sizeMax, number sizeFade ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Textures =&lt;br /&gt;
&#039;&#039;&#039;gl.Texture&#039;&#039;&#039;&lt;br /&gt;
  ( [ number texNum, ] boolean enable | string &amp;lt;span class=note&amp;gt;name&amp;lt;/span&amp;gt; ) -&amp;gt; nil | boolean loaded&lt;br /&gt;
&amp;lt;font color=#dd9944&amp;gt;This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;&lt;br /&gt;
{| cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin-top: -5px; margin-left:5px&amp;quot;&lt;br /&gt;
! style=&amp;quot;color:#55ee99; text-align:left&amp;quot; |`name` may be:&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | #12&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 12 buildpic&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %34:1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = unitDef 34 s3o tex2 (:0-&amp;gt;tex1,:1-&amp;gt;tex2)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | %-102:0&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = featureDef 102 s3o tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | !56&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = lua generated texture 56 (= return value of gl.CreateTexture)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units1&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex1&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $units2&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = 3do textureatlas tex2&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shadow&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = shadowmap&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = specular cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(removed in the latest develop)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $reflection &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = reflection cube map &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $shading&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = ground shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $grass&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = grass shading texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $heightmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = heightmap (needs HeightMapTexture=1 set in spring config)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $minimap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = minimap texture&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = same as &amp;quot;$reflection&amp;quot; {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $sky_reflection&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = defined for SSMF maps that have a skyReflectModTex {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = auto generated normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF normals texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_specular&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF specular texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_distr&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat distribution texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_detail&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat detail texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_splat_normals&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF splat normals texture {{new|101.0}}, used as &amp;quot;$ssmf_splat_normals&amp;quot; or &amp;quot;$ssmf_splat_normals:X&amp;quot;, &#039;X&#039; can be a value between 0 and 3, defaults to 0 if &amp;quot;:X&amp;quot; is omitted&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_emission&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF emission texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $ssmf_parallax&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = SSMF parallax texture {{new|101.0}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = currently active info texture (los, airlos, radar, jammer)&amp;lt;br/&amp;gt; Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_losmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = los texture (L-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_mtlmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = metal map texture (F4-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_hgtmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = height map texture (F1-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $info_blkmap&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = blocking map texture (F2-view)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the map in view {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use) {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $map_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the map in view. {{new|95}} &amp;lt;br/&amp;gt;To translate this to world position coordinates, use:&amp;lt;br/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;No clip control / clipspace for depth is [-1,1]&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;&#039;Default if clip control is supported / clipspace for depth is [0,1].&#039;&#039;&#039;&lt;br /&gt;
  vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, &lt;br /&gt;
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);&lt;br /&gt;
&lt;br /&gt;
  worldpos.xyz = worldpos.xyz / worldpos.w; &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_normtex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_difftex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the diffuse texture buffer of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_spectex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the specular textures of the models in view  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_emittex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for emissive materials (bloom would be the canonical use)  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_misctex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = for arbitrary shader data  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | $model_gbuffer_zvaltex&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = contains the depth values (z-buffer) of the models in view.  {{new|95}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | ${opt}:/LuaUI/images/image.png &lt;br /&gt;
| style=&amp;quot;color:#55ee99&amp;quot; | = load a texture from the VFS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
   possible ${opt}&#039;s are:&lt;br /&gt;
      &#039;n&#039; = nearest&lt;br /&gt;
      &#039;l&#039; = linear&lt;br /&gt;
      &#039;a&#039; = aniso&lt;br /&gt;
      &#039;i&#039; = invert&lt;br /&gt;
      &#039;g&#039; = greyed&lt;br /&gt;
      &#039;c&#039; = clamped&lt;br /&gt;
      &#039;b&#039; = border&lt;br /&gt;
      &#039;t%r,%g,%b&#039; = tint&lt;br /&gt;
      &#039;r%width,%height&#039; = resize&lt;br /&gt;
   The above ${opt}&#039;s are NOT available for .DDS textures! .dds will load faster than other image formats.&lt;br /&gt;
&lt;br /&gt;
    example: &amp;quot;:iac:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example: &amp;quot;:cr16,16:/LuaUI/images/image.png&amp;quot;&lt;br /&gt;
    example2: &amp;quot;:t1.0,0.5,0:/LuaUI/images/image.png&amp;quot;  (orange tint)&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int xsize, int ysize,&lt;br /&gt;
  [ { &lt;br /&gt;
    [target     = number,] &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(like GL.TEXTURE_1D,GL.TEXTURE_2D,...)&amp;lt;/font&amp;gt; &amp;lt;font color=darkblue&amp;gt; (Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [format     = number,]&lt;br /&gt;
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]&lt;br /&gt;
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]&lt;br /&gt;
    [aniso      = number,]&lt;br /&gt;
    [border     = boolean,]&lt;br /&gt;
    [fbo        = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [fboDepth   = boolean,] &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
    [samples    = number,] &amp;lt;font color=darkblue&amp;gt; specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)&amp;lt;/font&amp;gt;&lt;br /&gt;
  } ]&lt;br /&gt;
  ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTexture&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteTextureFBO&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TextureInfo&#039;&#039;&#039;&lt;br /&gt;
  ( string texture ) -&amp;gt; nil | {&lt;br /&gt;
      xsize = number,&lt;br /&gt;
      ysize = number,&lt;br /&gt;
      alpha = boolean, //not used yet&lt;br /&gt;
      type  = number,  //not used yet&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
   the format of the texture string is the same as in gl.Texture()&lt;br /&gt;
&amp;lt;/font&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( number x | &lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexCoord&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum,&lt;br /&gt;
    number x |&lt;br /&gt;
    number x, number y |&lt;br /&gt;
    number x, number y, number z |&lt;br /&gt;
    number x, number y, number z, number w |&lt;br /&gt;
    { number x [, number y [, number z [, number w ]]] } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexEnv&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Environment|target]], number [[Lua_ConstGL#Texture_Environment|pname]],&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Environment|value]] |&lt;br /&gt;
    number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.TexGen&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.MultiTexGen&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, number [[Lua_ConstGL#Texture_Generation|target]],&lt;br /&gt;
    boolean state |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number value |&lt;br /&gt;
    number [[Lua_ConstGL#Texture_Generation|pname]], number var1, number var2, number var3 ) -&amp;gt; nil       &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CopyToTexture&#039;&#039;&#039;&lt;br /&gt;
  (string texture, int xoff, int yoff, int x, int y, int w, int h &lt;br /&gt;
  [,number target,number level])-&amp;gt;nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.RenderToTexture&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs GLEW_EXT_framebuffer_object!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string fbotexture, lua_func ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GenerateMipmap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;(needs glGenerateMipmapEXT!)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string texture ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
The following are primarily intended to be used in conjunction with&lt;br /&gt;
     gl.{Unit,Feature}(objID, ..., raw=true)&lt;br /&gt;
     gl.{Unit,Feature}Shape(defID, ..., raw=true)&lt;br /&gt;
and apply a model&#039;s default textures; easier than gl.Texture(&amp;quot;$%...&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnitShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number unitDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.FeatureShapeTextures&#039;&#039;&#039; &lt;br /&gt;
  ( number featureDefID, boolean enable ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
= PixelReadback =&lt;br /&gt;
&#039;&#039;&#039;gl.SaveImage&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h,&lt;br /&gt;
    string filename [, table {alpha=boolean, yflip=boolean, grayscale16bit=boolean, readbuffer=number} ] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG&amp;lt;br&amp;gt;&lt;br /&gt;
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ReadPixels&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number w, number h [, number format = GL.RGBA ] )&lt;br /&gt;
    -&amp;gt; nil &lt;br /&gt;
    | number r,[g,[b,[a]]] &lt;br /&gt;
    | table { { {1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Lights =&lt;br /&gt;
&#039;&#039;&#039;gl.Lighting&#039;&#039;&#039;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.ShadeModel&#039;&#039;&#039;&lt;br /&gt;
  ( number [[Lua_ConstGL#ShadeModel|mode]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Light&#039;&#039;&#039;&lt;br /&gt;
  ( int light, &lt;br /&gt;
  boolean enable |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param |&lt;br /&gt;
  number [[Lua_ConstGL#Light_Specification|pname]], number param1, number param2, number param3 ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Material&#039;&#039;&#039;&lt;br /&gt;
  ({&lt;br /&gt;
    ambient   = {number r, number g, number b[, number a]},&lt;br /&gt;
    diffuse   = {number r, number g, number b[, number a]},&lt;br /&gt;
    ambidiff  = {number r, number g, number b[, number a]},&lt;br /&gt;
    emission  = {number r, number g, number b[, number a]},&lt;br /&gt;
    specular  = {number r, number g, number b[, number a]},&lt;br /&gt;
    shininess = number specularExponent&lt;br /&gt;
  }) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Hardware relevant =&lt;br /&gt;
&#039;&#039;&#039;gl.HasExtension&#039;&#039;&#039;&lt;br /&gt;
  ( string extname ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetNumber&#039;&#039;&#039;&lt;br /&gt;
  ( number ext, int count ) -&amp;gt; number [, number, number, ... #count ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetString&#039;&#039;&#039;&lt;br /&gt;
  ( number ext ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= DrawGroundPrimitives =&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundCircle&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: number divs is the number of sides the circle will have. the higher the smoother the circle (and more GPU intensive) &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.DrawGroundQuad&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Note: x1,z1,x2 &amp;amp; z2 are rounded, so don&#039;t use it for very small or moving objects. x and z are correspond to the coordinates displayed by the tooltip &amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number z1, number x2, number z2,&lt;br /&gt;
    [ boolean useNorm, &amp;lt;span class=warning&amp;gt;(does nothing!)&amp;lt;/span&amp;gt;&lt;br /&gt;
      [ number tu1, number tv1, number tu2, number tv2 |&lt;br /&gt;
        boolean useTextureCoord ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Queries =&lt;br /&gt;
&#039;&#039;&#039;gl.CreateQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil | userdata query&lt;br /&gt;
&#039;&#039;&#039;gl.DeleteQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.RunQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query, function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;gl.GetQuery&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;needs &amp;gt;=OpengGL2.0!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( userdata query ) -&amp;gt; nil | number renderedFragments&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Extended =&lt;br /&gt;
&#039;&#039;&#039;gl.ActiveTexture&#039;&#039;&#039;&lt;br /&gt;
  ( int texNum, function [, arg1,... ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexNames&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; { [1] = string texture, etc ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetGlobalTexCoords&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;gets the texcoord of a 3do texture in the 3do texture atlas&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string 3doTextureName ) -&amp;gt; number xstart, number ystart, number xend, number yend&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UnsafeState&#039;&#039;&#039;&lt;br /&gt;
  ( number state [, boolean disable_state ], function, arg1, arg2, ... ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Calls glEnable(state) or glDisable(state) (if disable_state==true) and&amp;lt;br&amp;gt;then calls the lua_function and afterwards reverts the state.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetShadowMapParams&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; number xmid, number ymid, number p17, number p18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.GetMatrixData&#039;&#039;&#039;&lt;br /&gt;
  ( GL.PROJECTION [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( GL.MODELVIEW  [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i] &lt;br /&gt;
  ( GL.TEXTURE    [, int i] ) -&amp;gt; nil | number, etc.. | number Matrix[i]&lt;br /&gt;
  ( &amp;quot;shadow&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camera&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;caminv&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;camprj&amp;quot; )                -&amp;gt; nil | number, etc.. &lt;br /&gt;
  ( &amp;quot;billboard&amp;quot; )             -&amp;gt; nil | number, etc.. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Flush&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Finish&#039;&#039;&#039;&lt;br /&gt;
  () -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Shaders (GLSL) =&lt;br /&gt;
  [[Lua_GLSL_Api]]&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20974</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20974"/>
		<updated>2021-04-19T21:29:51Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;&#039;&#039;&#039;Note: After discussion &amp;lt;ref&amp;gt;{{forumlink|topic=28935|title=anything against removal of lualobby?}}&amp;lt;/ref&amp;gt; LuaLobby was removed&amp;lt;ref&amp;gt;[https://github.com/spring/spring/commit/05f61e76f7522096faeef2eaa6aaa16bc2b55d71 github commit]&amp;lt;/ref&amp;gt; from engine &amp;gt; 91.0&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead [[LuaSocket]] can be used.&lt;br /&gt;
There&#039;s an existing LuaSocket implementation available at: https://github.com/gajop/liblobby with docs at: http://gajop.github.io/liblobby/.&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
=Create=&lt;br /&gt;
&#039;&#039;&#039;Script.CreateLobby&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; userdata lobby&lt;br /&gt;
&lt;br /&gt;
=Userdata Functions=&lt;br /&gt;
&#039;&#039;&#039;lobby:Connect&#039;&#039;&#039;&lt;br /&gt;
  ( string url, int port ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:Disconnect&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:Login&#039;&#039;&#039;&lt;br /&gt;
  ( string username, string password ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:Rename&#039;&#039;&#039;&lt;br /&gt;
  ( string newname ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:ChangePass&#039;&#039;&#039;&lt;br /&gt;
  ( string oldpassword, string newpassword ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:Register&#039;&#039;&#039;&lt;br /&gt;
  ( string username, string password ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:ConfirmAggreement&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:JoinChannel&#039;&#039;&#039;&lt;br /&gt;
  ( string chan_name [,string password] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:LeaveChannel&#039;&#039;&#039;&lt;br /&gt;
  ( string chan_name ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:Say&#039;&#039;&#039;&lt;br /&gt;
  ( string chan_name, string message ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:SayEx&#039;&#039;&#039;&lt;br /&gt;
  ( string chan_name, string message ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:SayPrivate&#039;&#039;&#039;&lt;br /&gt;
  ( string user_name, string message ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:StatusUpdate&#039;&#039;&#039;&lt;br /&gt;
  ( bool ingame, bool away ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:Channels&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:KickChannelMember&#039;&#039;&#039;&lt;br /&gt;
  ( string chan_name, string user_name, string reason) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:ChangeTopic&#039;&#039;&#039;&lt;br /&gt;
  ( string chan_name, string topic) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;lobby:Poll&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
=Userdata Events=&lt;br /&gt;
&#039;&#039;&#039;lobby.DoneConnecting&#039;&#039;&#039; = function(bool sucess, string error_message)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ServerGreeting&#039;&#039;&#039; = function(string server_version, string spring_version, int udp_port, int mode)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.RegisterDenied&#039;&#039;&#039; = function(string reason)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.RegisterAccepted&#039;&#039;&#039; = function()&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.LoginDenied&#039;&#039;&#039; = function(string reason)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.LoginEnd&#039;&#039;&#039; = function()&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.Aggreement&#039;&#039;&#039; = function(string text)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.Motd&#039;&#039;&#039; = function(string text)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ServerMessage&#039;&#039;&#039; = function(string text)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ServerMessageBox&#039;&#039;&#039; = function(string text, string url)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.AddUser&#039;&#039;&#039; = function(string user_name, string country, number cpu)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.RemoveUser&#039;&#039;&#039; = function(string user_name)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.UserStatusUpdate&#039;&#039;&#039; = function(string user_name, bool away, bool bot, bool ingame, bool moderator, int rank)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ChannelInfo&#039;&#039;&#039; = function(string chan_name, int num_users)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ChannelInfoEnd&#039;&#039;&#039; = function()&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.RequestMutelist&#039;&#039;&#039; = function(string chan_name)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.Mutelist&#039;&#039;&#039; = function(string chan_name, table {&amp;quot;userABC&amp;quot;,&amp;quot;userXYZ&amp;quot;,...})&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.Joined&#039;&#039;&#039; = function(string chan_name)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.JoinFailed&#039;&#039;&#039; = function(string chan_name, string reason)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ChannelMember&#039;&#039;&#039; = function(string chan_name, string user_name, bool joined)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ChannelMemberLeft&#039;&#039;&#039; = function(string chan_name, string user_name, string reason)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ChannelMemberKicked&#039;&#039;&#039; = function(string chan_name, string user_name, string reason)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ChannelTopic&#039;&#039;&#039; = function(string chan_name, string author, int time, string topic)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.ChannelMessage&#039;&#039;&#039; = function(string chan_name, string text)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.Said&#039;&#039;&#039; = function(string chan_name, string user_name, string text)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.SaidEx&#039;&#039;&#039; = function(string chan_name, string user_name, string text)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.SaidPrivate&#039;&#039;&#039; = function(string user_name, string text)&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.Disconnected&#039;&#039;&#039; = function()&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lobby.NetworkError&#039;&#039;&#039; = function(string message)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12418</id>
		<title>Lua UnsyncedRead</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12418"/>
		<updated>2021-04-19T21:28:05Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: Updated page with new anchorable templates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
=Unsynced Read=&lt;br /&gt;
&lt;br /&gt;
== Replay/Spectating ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsReplay&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isReplay&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetReplayLength&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} timeInSeconds&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSpectatingState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} spectating, {{type|bool}} fullView, {{type|bool}} fullSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Game/Menu Name ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameName&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} name&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Apparently returns {{xtaglink|Modinfo.lua|name}} .. {{xtaglink|Modinfo.lua|version}} from [[Modinfo.lua]]. E.g. &amp;quot;Spring: 1944 test-5640-ac2d15b&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMenuName&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} name&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModUICtrl&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} ModUICtrl&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyAllyTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} allyTeamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyPlayerID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playerID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Local Player,Team,Ally ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Redundant same as the GetMyXYZ functions!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalPlayerID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playerID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerRoster&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} sortType{{rbracket}} {{pipe}} {{bracket}}{{type|number}} sortType{{rbracket}}, {{bracket}}{{type|bool}} showPathingPlayers{{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} playerTable &lt;br /&gt;
|info = &amp;quot;playerTable&amp;quot; contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;playerTable = {&lt;br /&gt;
            [1] = {&lt;br /&gt;
              string  name,&lt;br /&gt;
              number  playerID,&lt;br /&gt;
              number  teamID,&lt;br /&gt;
              number  allyTeamID,&lt;br /&gt;
              boolean spectator,&lt;br /&gt;
              number  cpuUsage,&lt;br /&gt;
              number  pingTime&lt;br /&gt;
            },&lt;br /&gt;
            etc...&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
   if pingTime == -1, the player is pathfinding, in order to find the progress, use:&lt;br /&gt;
   cpuUsage&amp;amp;0x1 if it&#039;s PC or BO, cpuUsage&amp;amp; 0xFE to get path res, (cpuUsage&amp;gt;&amp;gt;8)*1000&lt;br /&gt;
   for the progress&lt;br /&gt;
  Sort codes:&lt;br /&gt;
     1 = Sort by allies  (the default)&lt;br /&gt;
     2 = Sort by teamID&lt;br /&gt;
     3 = Sort by playerName&lt;br /&gt;
     4 = Sort by CPU usage&lt;br /&gt;
     5 = Sort by ping time&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamOrigColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerTraffic&lt;br /&gt;
|arg1 = {{type|number}} playerID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} packetID {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} traffic&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSoundStreamTime&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playedTime, {{type|number}} totalTime,&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraNames&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|camName}} = {{type|number}} camNum, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
|info = See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraPosition&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraDirection&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} forward_x, {{type|number}} forward_y, {{type|number}} forward_z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraFOV&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} vFov, {{type|number}} hFov&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraVectors&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} vectorTable&lt;br /&gt;
|info = vectorTable contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;vectorTable = {&lt;br /&gt;
    forward   = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    up        = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    right     = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    top       = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    bottom    = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    leftside  = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    rightside = { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleUnits&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} teamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius = 30 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} Icons = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleFeatures&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} allyTeamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius = 30 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} Icons = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} geos = true {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsAABBInView&lt;br /&gt;
|arg1 = {{type|number}} minX, {{type|number}} minY, {{type|number}} minZ&lt;br /&gt;
|arg2 = {{type|number}} maxX, {{type|number}} maxY, {{type|number}} maxZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsSphereInView&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitIcon&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isUnitIcon&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInView&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isUnitInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} checkIcons {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isVisible&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = WorldToScreenCoords&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TraceScreenRay&lt;br /&gt;
|arg1 = {{type|number}} mouseX, {{type|number}} mouseY, {{type|number}} mouseZ {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} onlyCoords {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useMinimap {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} includeSky {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} ignoreWater {{bracket}}&lt;br /&gt;
|arg6 ={{type|number}} D {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} unit, {{type|number}} unitID {{pipe}} {{type|string}} feature, {{type|number}} featureID {{pipe}} {{type|string}} ground, {{type|table}} coords = { {{bracket|1}} = {{type|number}} x, {{bracket|2}} = {{type|number}} y, {{bracket|3}} = {{type|number}} z }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Extended to allow a custom plane, parameters are (0, 1, 0, D=0) where D is the offset D can be specified in the third argument (if all the bools are false) or in the seventh (as shown). Intersection coordinates are returned in t[4],t[5],t[6] when the ray goes offmap and includeSky is true), or when no unit or feature is hit (or onlyCoords is true). This will only work for units &amp;amp; objects with the default collission sphere. Per Piece collission and custom collission objects are not supported. The unit must be selectable, to appear to a screen trace ray.&lt;br /&gt;
&lt;br /&gt;
To get map coordinates under mouse cursor: input mouse coordinates obtained via GetMouseState() and pass true for the onlyCoords parameter. Be careful as going off map will result in nil:&lt;br /&gt;
   local mouseX, mouseY = Spring.GetMouseState()&lt;br /&gt;
   print (&amp;quot;Mouse coordinates: (&amp;quot; .. mouseX .. &amp;quot;, &amp;quot; .. mouseY .. &amp;quot;)&amp;quot;)&lt;br /&gt;
   local desc, args = Spring.TraceScreenRay(mouseX, mouseY, true)&lt;br /&gt;
   if nil == desc then return end -- off map&lt;br /&gt;
   local x = args[1]&lt;br /&gt;
   local y = args[2]&lt;br /&gt;
   local z = args[3]&lt;br /&gt;
   print (&amp;quot;World coordinates: (&amp;quot; .. x .. &amp;quot;, &amp;quot; .. y .. &amp;quot;, &amp;quot; .. z .. &amp;quot;)&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPixelDir&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetViewGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} viewSizeX, {{type|number}} viewSizeY, {{type|number}} viewPosX, {{type|number}} viewPosY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWindowGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} winSizeX, {{type|number}} winSizeY, {{type|number}} winPosX, {{type|number}} winPosY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetScreenGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} screenSizeX, {{type|number}} screenSizeY, {{type|number}} ZERO, {{type|number}} ZERO&lt;br /&gt;
|info = Is missing multiscreen support!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitAllied&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitViewPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransformMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} invert = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} a11, {{type|number}} a12 ..., {{type|number}} a44 (4x4 matrix)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnits&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsSorted&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{bracket}}{{type|number}} unitID{{rbracket}}, etc... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsCounts&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsCount&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitSelected&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isSelected&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitGroup&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} groupNumber&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|number}} = {{type|number}} unitCount, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedGroup&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} groupNumber&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupAIName&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} aiName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupAIList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} aiName, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnits&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsCount&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleProjectiles&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} addSyncedProjectiles = true {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addWeaponProjectiles = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} addPieceProjectiles = true {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} projectileID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUICommands&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = { command={{type|string}}, description={{type|string}}, synced={{type|bool}}, cheat={{type|bool}}}, ... }&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Returns a list of available [[UI commands]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGUIHidden&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}}  {{type|bool}} isHidden&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = HaveShadows&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}}  {{type|bool}} haveShadows&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = HaveAdvShading&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} haveShading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWaterMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|string}} mode&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  mode numbers:&lt;br /&gt;
      0 - basic&lt;br /&gt;
      1 - reflective&lt;br /&gt;
      2 - dynamic&lt;br /&gt;
      3 - refractive&lt;br /&gt;
      4 - bumpwater&lt;br /&gt;
      default - unknown&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapDrawMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;normal&amp;quot; {{pipe}} {{type|string}} &amp;quot;height&amp;quot; {{pipe}} {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} {{type|string}} &amp;quot;pathTraversability&amp;quot; {{pipe}} {{type|string}} &amp;quot;los&amp;quot;&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetDrawSelectionInfo&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} drawSelectInfo&lt;br /&gt;
|info = Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit &amp;amp; Feature GUI States ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLuaDraw&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} unitDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNoDraw&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNoMinimap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noMinimap&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNoSelect&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLuaDraw&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} featureDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoDraw&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMiniMapGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} sizeX, {{type|number}} sizeY, {{type|bool}} minimized, {{type|bool}} maximized&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMiniMapDualScreen&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} false {{pipe}} {{type|string}} &amp;quot;left&amp;quot; {{pipe}} {{type|string}} &amp;quot;right&amp;quot;&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsAboveMiniMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAbove&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActiveCommand&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index {{bracket}}, {{type|number}} cmd_id, {{type|number}} cmd_type, {{type|string}} cmd_name {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetDefaultCommand&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index {{bracket}}, {{type|number}} cmd_id, {{type|number}} cmd_type, {{type|string}} cmd_name {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActiveCmdDescs&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} cmdDesc&lt;br /&gt;
|info = cmdDesc contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;cmdDesc = {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActiveCmdDesc&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} cmdDesc&lt;br /&gt;
|info = cmdDesc contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;cmdDesc = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCmdDescIndex&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActivePage&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pageNum, {{type|number}} maxPages&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetBuildFacing&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetBuildSpacing&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} spacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGatherMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} gatherMode&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetInvertQueueKey&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} queueKey&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMouseState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|bool}} leftPressed, {{type|bool}} middlePressed, {{type|bool}} rightPressed, {{type|bool}} offscreen&lt;br /&gt;
|info = {{new|104.0}} Sixth return value offscreen.&amp;lt;br&amp;gt;X, Y are the screen coordinates, not world ones. This coordinate system starts in the lower left corner. For world coordinates see Spring.TraceScreenRay.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMouseCursor&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string }} name, {{type|number}} scale&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMouseStartPosition&lt;br /&gt;
|arg1 = {{type|number}} mouseButton &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pressedX, {{type|number}} pressedY, {{type|number}} camPosX, {{type|number}} camPosY, {{type|number}} camPosZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeyState&lt;br /&gt;
|arg1 = {{type|number}} key&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} keyState&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModKeyState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} alt, {{type|bool}} ctrl, {{type|bool}} meta, {{type|bool}} shift&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPressedKeys&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} code{{rbracket}} = {{type|bool}}, {{bracket}}{{type|string}} name{{rbracket}} = {{type|bool}}, ... }&lt;br /&gt;
|info = {{new|99.0}}: {{type|string}} name &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeyCode&lt;br /&gt;
|arg1 = {{type|string}} keysym&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} keyCode&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeySymbol&lt;br /&gt;
|arg1 = {{type|number}} key&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;keysym1&amp;quot;, {{type|string}} &amp;quot;keysym2&amp;quot;&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeyBindings&lt;br /&gt;
|arg1 = {{type|string}} keyset &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} keyBindings&lt;br /&gt;
|info = keyBindings contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;keyBindings = {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      [string actionCmd] = string actionExtra,&lt;br /&gt;
      command   = string actionCmd,    {{new|97}}&lt;br /&gt;
      boundWith = string boundWith,    {{new|97}}&lt;br /&gt;
      extra     = string actionExtra,  {{new|97}}&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActionHotKeys&lt;br /&gt;
|arg1 = {{type|string}} action&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} hotKey, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLastMessagePositions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = { {{type|number}} x, {{type|number}} y, {{type|number}} z }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConsoleBuffer&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} maxLines{{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = { text = {{type|string}}, priority = {{type|number}} }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCurrentTooltip&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== LOS Colors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLosViewColors&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} always = {r,g,b}, {{type|table}} LOS = {r,g,b}, {{type|table}} radar = {r,g,b}, {{type|table}} jam = {r,g,b}, {{type|table}} radar2 = {r,g,b}&lt;br /&gt;
|info = {{new|100}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Config ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} configParams&lt;br /&gt;
|info = Same information as &amp;lt;code&amp;gt;spring --list-config-vars&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;configParams contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;configParams = {&lt;br /&gt;
    {&lt;br /&gt;
      name = string,&lt;br /&gt;
      type = string,&lt;br /&gt;
      [ description = string, ]&lt;br /&gt;
      [ defaultValue = string, ]&lt;br /&gt;
      [ minimumValue = string, ]&lt;br /&gt;
      [ maximumValue = string, ]&lt;br /&gt;
      [ safemodeValue = string, ]&lt;br /&gt;
      [ declarationFile = string, ]&lt;br /&gt;
      [ declarationLine = number, ]&lt;br /&gt;
      [ readOnly = bool, ]&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigInt&lt;br /&gt;
|arg1 = {{type|string}} name {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} default {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} configInt&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigFloat&lt;br /&gt;
|arg1 = {{type|string}} name {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} default {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} configFloat&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigString&lt;br /&gt;
|arg1 = {{type|string}} name {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} default {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} configString&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFPS&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} fps&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetDrawFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} low_16bit, {{type|number}} high_16bit&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVideoCapturingMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} videoCaptureAllowed&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = {{new|98.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} finishedLoading, {{type|bool}} loadedFromSave, {{type|bool}} locallyPaused, {{type|bool}} laggingWrtExpectedFromSimtime&lt;br /&gt;
|info = {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFrameTimeOffset&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} offset&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLastUpdateSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lastUpdateSeconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHasLag&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} hasLag&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTimer&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|timer}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFrameTimer&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|timer}}&lt;br /&gt;
|info = {{new|102.0}}&amp;lt;br&amp;gt;Get a timer for the start of the frame, this should give better results for camera interpolations.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DiffTimers&lt;br /&gt;
|arg1 = {{type|timer}} cur&lt;br /&gt;
|arg2 = {{type|timer}} ago {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} inMilliseconds {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = {{New|95.0}}&amp;lt;br&amp;gt;Optional third argument (boolean) to return dt in milliseconds.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapSquareTexture&lt;br /&gt;
|arg1 = {{type|number}} texSqrX, {{type|number}} texSqrY&lt;br /&gt;
|arg2 = {{type|number}} texMipLvl&lt;br /&gt;
|arg3 = {{type|string}} luaTexName&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLogSections&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} logSections = { &amp;quot;KeyBindings&amp;quot; = LOG.INFO, &amp;quot;Font&amp;quot; = LOG.INFO, &amp;quot;Sound&amp;quot; = LOG.WARNING, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetClipboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} text&lt;br /&gt;
|info = {{new|98.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20973</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20973"/>
		<updated>2021-04-19T21:27:05Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
=Unsynced Read=&lt;br /&gt;
&lt;br /&gt;
== Replay/Spectating ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsReplay&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isReplay&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetReplayLength&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} timeInSeconds&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSpectatingState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} spectating, {{type|bool}} fullView, {{type|bool}} fullSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Game/Menu Name ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameName&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} name&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Apparently returns {{xtaglink|Modinfo.lua|name}} .. {{xtaglink|Modinfo.lua|version}} from [[Modinfo.lua]]. E.g. &amp;quot;Spring: 1944 test-5640-ac2d15b&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMenuName&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} name&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModUICtrl&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} ModUICtrl&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyAllyTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} allyTeamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyPlayerID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playerID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Local Player,Team,Ally ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Redundant same as the GetMyXYZ functions!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalPlayerID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playerID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerRoster&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} sortType{{rbracket}} {{pipe}} {{bracket}}{{type|number}} sortType{{rbracket}}, {{bracket}}{{type|bool}} showPathingPlayers{{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} playerTable &lt;br /&gt;
|info = &amp;quot;playerTable&amp;quot; contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;playerTable = {&lt;br /&gt;
            [1] = {&lt;br /&gt;
              string  name,&lt;br /&gt;
              number  playerID,&lt;br /&gt;
              number  teamID,&lt;br /&gt;
              number  allyTeamID,&lt;br /&gt;
              boolean spectator,&lt;br /&gt;
              number  cpuUsage,&lt;br /&gt;
              number  pingTime&lt;br /&gt;
            },&lt;br /&gt;
            etc...&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
   if pingTime == -1, the player is pathfinding, in order to find the progress, use:&lt;br /&gt;
   cpuUsage&amp;amp;0x1 if it&#039;s PC or BO, cpuUsage&amp;amp; 0xFE to get path res, (cpuUsage&amp;gt;&amp;gt;8)*1000&lt;br /&gt;
   for the progress&lt;br /&gt;
  Sort codes:&lt;br /&gt;
     1 = Sort by allies  (the default)&lt;br /&gt;
     2 = Sort by teamID&lt;br /&gt;
     3 = Sort by playerName&lt;br /&gt;
     4 = Sort by CPU usage&lt;br /&gt;
     5 = Sort by ping time&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamOrigColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerTraffic&lt;br /&gt;
|arg1 = {{type|number}} playerID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} packetID {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} traffic&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSoundStreamTime&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playedTime, {{type|number}} totalTime,&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraNames&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|camName}} = {{type|number}} camNum, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
|info = See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraPosition&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraDirection&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} forward_x, {{type|number}} forward_y, {{type|number}} forward_z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraFOV&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} vFov, {{type|number}} hFov&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraVectors&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} vectorTable&lt;br /&gt;
|info = vectorTable contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;vectorTable = {&lt;br /&gt;
    forward   = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    up        = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    right     = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    top       = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    bottom    = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    leftside  = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    rightside = { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleUnits&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} teamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius = 30 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} Icons = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleFeatures&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} allyTeamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius = 30 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} Icons = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} geos = true {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsAABBInView&lt;br /&gt;
|arg1 = {{type|number}} minX, {{type|number}} minY, {{type|number}} minZ&lt;br /&gt;
|arg2 = {{type|number}} maxX, {{type|number}} maxY, {{type|number}} maxZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsSphereInView&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitIcon&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isUnitIcon&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInView&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isUnitInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} checkIcons {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isVisible&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = WorldToScreenCoords&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TraceScreenRay&lt;br /&gt;
|arg1 = {{type|number}} mouseX, {{type|number}} mouseY, {{type|number}} mouseZ {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} onlyCoords {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useMinimap {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} includeSky {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} ignoreWater {{bracket}}&lt;br /&gt;
|arg6 ={{type|number}} D {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} unit, {{type|number}} unitID {{pipe}} {{type|string}} feature, {{type|number}} featureID {{pipe}} {{type|string}} ground, {{type|table}} coords = { {{bracket|1}} = {{type|number}} x, {{bracket|2}} = {{type|number}} y, {{bracket|3}} = {{type|number}} z }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Extended to allow a custom plane, parameters are (0, 1, 0, D=0) where D is the offset D can be specified in the third argument (if all the bools are false) or in the seventh (as shown). Intersection coordinates are returned in t[4],t[5],t[6] when the ray goes offmap and includeSky is true), or when no unit or feature is hit (or onlyCoords is true). This will only work for units &amp;amp; objects with the default collission sphere. Per Piece collission and custom collission objects are not supported. The unit must be selectable, to appear to a screen trace ray.&lt;br /&gt;
&lt;br /&gt;
To get map coordinates under mouse cursor: input mouse coordinates obtained via GetMouseState() and pass true for the onlyCoords parameter. Be careful as going off map will result in nil:&lt;br /&gt;
   local mouseX, mouseY = Spring.GetMouseState()&lt;br /&gt;
   print (&amp;quot;Mouse coordinates: (&amp;quot; .. mouseX .. &amp;quot;, &amp;quot; .. mouseY .. &amp;quot;)&amp;quot;)&lt;br /&gt;
   local desc, args = Spring.TraceScreenRay(mouseX, mouseY, true)&lt;br /&gt;
   if nil == desc then return end -- off map&lt;br /&gt;
   local x = args[1]&lt;br /&gt;
   local y = args[2]&lt;br /&gt;
   local z = args[3]&lt;br /&gt;
   print (&amp;quot;World coordinates: (&amp;quot; .. x .. &amp;quot;, &amp;quot; .. y .. &amp;quot;, &amp;quot; .. z .. &amp;quot;)&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPixelDir&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetViewGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} viewSizeX, {{type|number}} viewSizeY, {{type|number}} viewPosX, {{type|number}} viewPosY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWindowGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} winSizeX, {{type|number}} winSizeY, {{type|number}} winPosX, {{type|number}} winPosY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetScreenGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} screenSizeX, {{type|number}} screenSizeY, {{type|number}} ZERO, {{type|number}} ZERO&lt;br /&gt;
|info = Is missing multiscreen support!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitAllied&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitViewPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransformMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} invert = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} a11, {{type|number}} a12 ..., {{type|number}} a44 (4x4 matrix)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnits&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsSorted&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{bracket}}{{type|number}} unitID{{rbracket}}, etc... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsCounts&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsCount&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitSelected&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isSelected&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitGroup&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} groupNumber&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|number}} = {{type|number}} unitCount, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedGroup&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} groupNumber&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupAIName&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} aiName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupAIList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} aiName, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnits&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsCount&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleProjectiles&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} addSyncedProjectiles = true {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addWeaponProjectiles = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} addPieceProjectiles = true {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} projectileID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUICommands&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = { command={{type|string}}, description={{type|string}}, synced={{type|bool}}, cheat={{type|bool}}}, ... }&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Returns a list of available [[UI commands]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGUIHidden&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}}  {{type|bool}} isHidden&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = HaveShadows&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}}  {{type|bool}} haveShadows&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = HaveAdvShading&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} haveShading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWaterMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|string}} mode&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  mode numbers:&lt;br /&gt;
      0 - basic&lt;br /&gt;
      1 - reflective&lt;br /&gt;
      2 - dynamic&lt;br /&gt;
      3 - refractive&lt;br /&gt;
      4 - bumpwater&lt;br /&gt;
      default - unknown&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapDrawMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;normal&amp;quot; {{pipe}} {{type|string}} &amp;quot;height&amp;quot; {{pipe}} {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} {{type|string}} &amp;quot;pathTraversability&amp;quot; {{pipe}} {{type|string}} &amp;quot;los&amp;quot;&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetDrawSelectionInfo&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} drawSelectInfo&lt;br /&gt;
|info = Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit &amp;amp; Feature GUI States ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLuaDraw&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} unitDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNoDraw&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNoMinimap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noMinimap&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNoSelect&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLuaDraw&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} featureDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoDraw&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noDraw&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMiniMapGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} sizeX, {{type|number}} sizeY, {{type|bool}} minimized, {{type|bool}} maximized&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMiniMapDualScreen&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} false {{pipe}} {{type|string}} &amp;quot;left&amp;quot; {{pipe}} {{type|string}} &amp;quot;right&amp;quot;&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsAboveMiniMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAbove&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActiveCommand&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index {{bracket}}, {{type|number}} cmd_id, {{type|number}} cmd_type, {{type|string}} cmd_name {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetDefaultCommand&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index {{bracket}}, {{type|number}} cmd_id, {{type|number}} cmd_type, {{type|string}} cmd_name {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActiveCmdDescs&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} cmdDesc&lt;br /&gt;
|info = cmdDesc contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;cmdDesc = {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActiveCmdDesc&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} cmdDesc&lt;br /&gt;
|info = cmdDesc contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;cmdDesc = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCmdDescIndex&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActivePage&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pageNum, {{type|number}} maxPages&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetBuildFacing&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetBuildSpacing&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} spacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGatherMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} gatherMode&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetInvertQueueKey&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} queueKey&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMouseState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|bool}} leftPressed, {{type|bool}} middlePressed, {{type|bool}} rightPressed, {{type|bool}} offscreen&lt;br /&gt;
|info = {{new|104.0}} Sixth return value offscreen.&amp;lt;br&amp;gt;X, Y are the screen coordinates, not world ones. This coordinate system starts in the lower left corner. For world coordinates see Spring.TraceScreenRay.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMouseCursor&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string }} name, {{type|number}} scale&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMouseStartPosition&lt;br /&gt;
|arg1 = {{type|number}} mouseButton &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pressedX, {{type|number}} pressedY, {{type|number}} camPosX, {{type|number}} camPosY, {{type|number}} camPosZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeyState&lt;br /&gt;
|arg1 = {{type|number}} key&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} keyState&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModKeyState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} alt, {{type|bool}} ctrl, {{type|bool}} meta, {{type|bool}} shift&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPressedKeys&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} code{{rbracket}} = {{type|bool}}, {{bracket}}{{type|string}} name{{rbracket}} = {{type|bool}}, ... }&lt;br /&gt;
|info = {{new|99.0}}: {{type|string}} name &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeyCode&lt;br /&gt;
|arg1 = {{type|string}} keysym&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} keyCode&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeySymbol&lt;br /&gt;
|arg1 = {{type|number}} key&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;keysym1&amp;quot;, {{type|string}} &amp;quot;keysym2&amp;quot;&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetKeyBindings&lt;br /&gt;
|arg1 = {{type|string}} keyset &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} keyBindings&lt;br /&gt;
|info = keyBindings contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;keyBindings = {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      [string actionCmd] = string actionExtra,&lt;br /&gt;
      command   = string actionCmd,    {{new|97}}&lt;br /&gt;
      boundWith = string boundWith,    {{new|97}}&lt;br /&gt;
      extra     = string actionExtra,  {{new|97}}&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetActionHotKeys&lt;br /&gt;
|arg1 = {{type|string}} action&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} hotKey, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLastMessagePositions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = { {{type|number}} x, {{type|number}} y, {{type|number}} z }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConsoleBuffer&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} maxLines{{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = { text = {{type|string}}, priority = {{type|number}} }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCurrentTooltip&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== LOS Colors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLosViewColors&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} always = {r,g,b}, {{type|table}} LOS = {r,g,b}, {{type|table}} radar = {r,g,b}, {{type|table}} jam = {r,g,b}, {{type|table}} radar2 = {r,g,b}&lt;br /&gt;
|info = {{new|100}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Config ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} configParams&lt;br /&gt;
|info = Same information as &amp;lt;code&amp;gt;spring --list-config-vars&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;configParams contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;configParams = {&lt;br /&gt;
    {&lt;br /&gt;
      name = string,&lt;br /&gt;
      type = string,&lt;br /&gt;
      [ description = string, ]&lt;br /&gt;
      [ defaultValue = string, ]&lt;br /&gt;
      [ minimumValue = string, ]&lt;br /&gt;
      [ maximumValue = string, ]&lt;br /&gt;
      [ safemodeValue = string, ]&lt;br /&gt;
      [ declarationFile = string, ]&lt;br /&gt;
      [ declarationLine = number, ]&lt;br /&gt;
      [ readOnly = bool, ]&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigInt&lt;br /&gt;
|arg1 = {{type|string}} name {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} default {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} configInt&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigFloat&lt;br /&gt;
|arg1 = {{type|string}} name {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} default {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} configFloat&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetConfigString&lt;br /&gt;
|arg1 = {{type|string}} name {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} default {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} configString&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFPS&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} fps&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetDrawFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} low_16bit, {{type|number}} high_16bit&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVideoCapturingMode&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} videoCaptureAllowed&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = {{new|98.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} finishedLoading, {{type|bool}} loadedFromSave, {{type|bool}} locallyPaused, {{type|bool}} laggingWrtExpectedFromSimtime&lt;br /&gt;
|info = {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFrameTimeOffset&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} offset&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLastUpdateSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lastUpdateSeconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHasLag&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} hasLag&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTimer&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|timer}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFrameTimer&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|timer}}&lt;br /&gt;
|info = {{new|102.0}}&amp;lt;br&amp;gt;Get a timer for the start of the frame, this should give better results for camera interpolations.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DiffTimers&lt;br /&gt;
|arg1 = {{type|timer}} cur&lt;br /&gt;
|arg2 = {{type|timer}} ago {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} inMilliseconds {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = {{New|95.0}}&amp;lt;br&amp;gt;Optional third argument (boolean) to return dt in milliseconds.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapSquareTexture&lt;br /&gt;
|arg1 = {{type|number}} texSqrX, {{type|number}} texSqrY&lt;br /&gt;
|arg2 = {{type|number}} texMipLvl&lt;br /&gt;
|arg3 = {{type|string}} luaTexName&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLogSections&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} logSections = { &amp;quot;KeyBindings&amp;quot; = LOG.INFO, &amp;quot;Font&amp;quot; = LOG.INFO, &amp;quot;Sound&amp;quot; = LOG.WARNING, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetClipboard&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} text&lt;br /&gt;
|info = {{new|98.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20972</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20972"/>
		<updated>2021-04-19T18:13:50Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
=Unsynced Read=&lt;br /&gt;
&lt;br /&gt;
== Replay/Spectating ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsReplay&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isReplay&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetReplayLength&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} timeInSeconds&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSpectatingState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} spectating, {{type|bool}} fullView, {{type|bool}} fullSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Game/Menu Name ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameName&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} name&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Apparently returns {{xtaglink|Modinfo.lua|name}} .. {{xtaglink|Modinfo.lua|version}} from [[Modinfo.lua]]. E.g. &amp;quot;Spring: 1944 test-5640-ac2d15b&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMenuName&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} name&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModUICtrl&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} ModUICtrl&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyAllyTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} allyTeamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMyPlayerID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playerID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Local Player,Team,Ally ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Redundant same as the GetMyXYZ functions!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalPlayerID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playerID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetLocalTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerRoster&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} sortType{{rbracket}} {{pipe}} {{bracket}}{{type|number}} sortType{{rbracket}}, {{bracket}}{{type|bool}} showPathingPlayers{{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} playerTable &lt;br /&gt;
|info = &amp;quot;playerTable&amp;quot; contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;playerTable = {&lt;br /&gt;
            [1] = {&lt;br /&gt;
              string  name,&lt;br /&gt;
              number  playerID,&lt;br /&gt;
              number  teamID,&lt;br /&gt;
              number  allyTeamID,&lt;br /&gt;
              boolean spectator,&lt;br /&gt;
              number  cpuUsage,&lt;br /&gt;
              number  pingTime&lt;br /&gt;
            },&lt;br /&gt;
            etc...&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
   if pingTime == -1, the player is pathfinding, in order to find the progress, use:&lt;br /&gt;
   cpuUsage&amp;amp;0x1 if it&#039;s PC or BO, cpuUsage&amp;amp; 0xFE to get path res, (cpuUsage&amp;gt;&amp;gt;8)*1000&lt;br /&gt;
   for the progress&lt;br /&gt;
  Sort codes:&lt;br /&gt;
     1 = Sort by allies  (the default)&lt;br /&gt;
     2 = Sort by teamID&lt;br /&gt;
     3 = Sort by playerName&lt;br /&gt;
     4 = Sort by CPU usage&lt;br /&gt;
     5 = Sort by ping time&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamOrigColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerTraffic&lt;br /&gt;
|arg1 = {{type|number}} playerID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} packetID {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} traffic&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSoundStreamTime&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} playedTime, {{type|number}} totalTime,&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraNames&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|camName}} = {{type|number}} camNum, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraState&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
|info = See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraPosition&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraDirection&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} forward_x, {{type|number}} forward_y, {{type|number}} forward_z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraFOV&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} vFov, {{type|number}} hFov&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCameraVectors&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} vectorTable&lt;br /&gt;
|info = vectorTable contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;vectorTable = {&lt;br /&gt;
    forward   = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    up        = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    right     = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    top       = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    bottom    = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    leftside  = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    rightside = { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleUnits&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} teamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius = 30 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} Icons = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleFeatures&lt;br /&gt;
|arg1 = {{bracket}}{{type|number}} allyTeamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius = 30 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} Icons = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} geos = true {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsAABBInView&lt;br /&gt;
|arg1 = {{type|number}} minX, {{type|number}} minY, {{type|number}} minZ&lt;br /&gt;
|arg2 = {{type|number}} maxX, {{type|number}} maxY, {{type|number}} maxZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsSphereInView&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitIcon&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isUnitIcon&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInView&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isUnitInView&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} checkIcons {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isVisible&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = WorldToScreenCoords&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TraceScreenRay&lt;br /&gt;
|arg1 = {{type|number}} mouseX, {{type|number}} mouseY, {{type|number}} mouseZ {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} onlyCoords {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useMinimap {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} includeSky {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} ignoreWater {{bracket}}&lt;br /&gt;
|arg6 ={{type|number}} D {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} unit, {{type|number}} unitID {{pipe}} {{type|string}} feature, {{type|number}} featureID {{pipe}} {{type|string}} ground, {{type|table}} coords = { {{bracket|1}} = {{type|number}} x, {{bracket|2}} = {{type|number}} y, {{bracket|3}} = {{type|number}} z }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Extended to allow a custom plane, parameters are (0, 1, 0, D=0) where D is the offset D can be specified in the third argument (if all the bools are false) or in the seventh (as shown). Intersection coordinates are returned in t[4],t[5],t[6] when the ray goes offmap and includeSky is true), or when no unit or feature is hit (or onlyCoords is true). This will only work for units &amp;amp; objects with the default collission sphere. Per Piece collission and custom collission objects are not supported. The unit must be selectable, to appear to a screen trace ray.&lt;br /&gt;
&lt;br /&gt;
To get map coordinates under mouse cursor: input mouse coordinates obtained via GetMouseState() and pass true for the onlyCoords parameter. Be careful as going off map will result in nil:&lt;br /&gt;
   local mouseX, mouseY = Spring.GetMouseState()&lt;br /&gt;
   print (&amp;quot;Mouse coordinates: (&amp;quot; .. mouseX .. &amp;quot;, &amp;quot; .. mouseY .. &amp;quot;)&amp;quot;)&lt;br /&gt;
   local desc, args = Spring.TraceScreenRay(mouseX, mouseY, true)&lt;br /&gt;
   if nil == desc then return end -- off map&lt;br /&gt;
   local x = args[1]&lt;br /&gt;
   local y = args[2]&lt;br /&gt;
   local z = args[3]&lt;br /&gt;
   print (&amp;quot;World coordinates: (&amp;quot; .. x .. &amp;quot;, &amp;quot; .. y .. &amp;quot;, &amp;quot; .. z .. &amp;quot;)&amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPixelDir&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetViewGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} viewSizeX, {{type|number}} viewSizeY, {{type|number}} viewPosX, {{type|number}} viewPosY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWindowGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} winSizeX, {{type|number}} winSizeY, {{type|number}} winPosX, {{type|number}} winPosY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetScreenGeometry&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} screenSizeX, {{type|number}} screenSizeY, {{type|number}} ZERO, {{type|number}} ZERO&lt;br /&gt;
|info = Is missing multiscreen support!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitAllied&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitViewPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransformMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} invert = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} a11, {{type|number}} a12 ..., {{type|number}} a44 (4x4 matrix)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnits&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsSorted&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{bracket}}{{type|number}} unitID{{rbracket}}, etc... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsCounts&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedUnitsCount&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitSelected&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isSelected&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitGroup&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} groupNumber&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|number}} = {{type|number}} unitCount, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSelectedGroup&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} groupNumber&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupAIName&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} aiName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupAIList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} aiName, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnits&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroupUnitsCount&lt;br /&gt;
|arg1 = {{type|number}} groupID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVisibleProjectiles&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} addSyncedProjectiles = true {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addWeaponProjectiles = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} addPieceProjectiles = true {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} projectileID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUICommands&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = { command={{type|string}}, description={{type|string}}, synced={{type|bool}}, cheat={{type|bool}}}, ... }&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Returns a list of available [[UI commands]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGUIHidden&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveShadows&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveAdvShading&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWaterMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number mode, string &amp;quot;mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  mode numbers:&lt;br /&gt;
      0 - basic&lt;br /&gt;
      1 - reflective&lt;br /&gt;
      2 - dynamic&lt;br /&gt;
      3 - refractive&lt;br /&gt;
      4 - bumpwater&lt;br /&gt;
      default - unknown&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapDrawMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | &amp;quot;normal&amp;quot; | &amp;quot;height&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;pathTraversability&amp;quot; | &amp;quot;los&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit &amp;amp; Feature GUI States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoMinimap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number posX, number posY, number sizeX, number sizeY,&lt;br /&gt;
    boolean minimized, boolean maximized&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapDualScreen&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean false | string &amp;quot;left&amp;quot; | string &amp;quot;right&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAboveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDefaultCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number index ) -&amp;gt; nil | {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCmdDescIndex&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActivePage&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number pageNum, number maxPages&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGatherMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetInvertQueueKey&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseState&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  ( ) -&amp;gt; number X, number Y,&lt;br /&gt;
    boolean leftPressed, boolean middlePressed, boolean rightPressed,&lt;br /&gt;
    boolean offscreen&lt;br /&gt;
&lt;br /&gt;
X, Y are the screen coordinates, not world ones. This coordinate system starts in the lower left corner.&lt;br /&gt;
&lt;br /&gt;
{{new|104.0}} Sixth return value offscreen&lt;br /&gt;
&lt;br /&gt;
For world coordinates see Spring.TraceScreenRay&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseCursor&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string name, number scale&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseButton ) -&amp;gt; nil | number pressedX, number pressedY,&lt;br /&gt;
    number camPosX, number camPosY, number camPosZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean alt, boolean ctrl, boolean meta, boolean shift&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPressedKeys&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [number code] = boolean,&lt;br /&gt;
    [string name] = boolean, {{new|99.0}}&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyCode&#039;&#039;&#039;&lt;br /&gt;
  ( string keysym ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeySymbol&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; string &amp;quot;keysym1&amp;quot;, string &amp;quot;keysym2&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyBindings&#039;&#039;&#039;&lt;br /&gt;
  ( string keyset ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      [string actionCmd] = string actionExtra,&lt;br /&gt;
      command   = string actionCmd,    {{new|97}}&lt;br /&gt;
      boundWith = string boundWith,    {{new|97}}&lt;br /&gt;
      extra     = string actionExtra,  {{new|97}}&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActionHotKeys&#039;&#039;&#039;&lt;br /&gt;
  ( string action ) -&amp;gt; nil | { [1] = string hotKey, ... }&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastMessagePositions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = { number X, number Y, number Z },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConsoleBuffer&#039;&#039;&#039;&lt;br /&gt;
  ( [number maxLines] ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      text = string,&lt;br /&gt;
      priority = number&lt;br /&gt;
   }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCurrentTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
=== LOS Colors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLosViewColors&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  ( ) -&amp;gt; always = {r,g,b}, LOS = {r,g,b}, radar = {r,g,b}, jam = {r,g,b}, radar2 = {r,g,b}  {{new|100}}&lt;br /&gt;
&lt;br /&gt;
== Config ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigParams&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;same information as &amp;lt;code&amp;gt;spring --list-config-vars&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; table {&lt;br /&gt;
    {&lt;br /&gt;
      name = string,&lt;br /&gt;
      type = string,&lt;br /&gt;
      [ description = string, ]&lt;br /&gt;
      [ defaultValue = string, ]&lt;br /&gt;
      [ minimumValue = string, ]&lt;br /&gt;
      [ maximumValue = string, ]&lt;br /&gt;
      [ safemodeValue = string, ]&lt;br /&gt;
      [ declarationFile = string, ]&lt;br /&gt;
      [ declarationLine = number, ]&lt;br /&gt;
      [ readOnly = bool, ]&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigInt&#039;&#039;&#039;&lt;br /&gt;
  ( string name [, number default ] ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigFloat&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( string name [, number default ] ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigString&#039;&#039;&#039;&lt;br /&gt;
  ( string name [, string default ] ) -&amp;gt; nil | string&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFPS&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number low 16bit, number high 16bit&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVideoCapturingMode&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( ) -&amp;gt; boolean videoCaptureAllowed&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameState&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( ) -&amp;gt; boolean finishedLoading, boolean loadedFromSave, boolean locallyPaused, boolean laggingWrtExpectedFromSimtime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimeOffset&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastUpdateSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHasLag&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTimer&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimer&#039;&#039;&#039; {{new|102.0}}&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Get a timer for the start of the frame, this should give better results for camera interpolations.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DiffTimers&#039;&#039;&#039;&lt;br /&gt;
  ( timer cur, timer ago, [boolean inMilliseconds]) -&amp;gt; number seconds&lt;br /&gt;
{{New|95.0}} optional third argument (boolean) to return dt in milliseconds&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  (number texSqrX, number texSqrY, number texMipLvl, string luaTexName) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLogSections&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; table { &amp;quot;KeyBindings&amp;quot; = LOG.INFO, &amp;quot;Font&amp;quot; = LOG.INFO, &amp;quot;Sound&amp;quot; = LOG.WARNING, ... }&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClipboard&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; string text&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20971</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20971"/>
		<updated>2021-04-19T15:24:42Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
=Unsynced Read=&lt;br /&gt;
&lt;br /&gt;
== Replay/Spectating ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsReplay&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetReplayLength&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( ) -&amp;gt; nil | number (in seconds)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSpectatingState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean spectating, boolean fullView, boolean fullSelect&lt;br /&gt;
&lt;br /&gt;
== Game/Menu Name ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameName&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( ) -&amp;gt; string name&lt;br /&gt;
&lt;br /&gt;
Apparently returns {{xtaglink|Modinfo.lua|name}} .. {{xtaglink|Modinfo.lua|version}} from [[Modinfo.lua]]. E.g. &amp;quot;Spring: 1944 test-5640-ac2d15b&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMenuName&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( ) -&amp;gt; string name&lt;br /&gt;
&lt;br /&gt;
== ModUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModUICtrl&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
== MyInfo ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMyPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Local Player,Team,Ally ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Redundant same as the GetMyXYZ functions!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalPlayerID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playerID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLocalAllyTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number allyID&lt;br /&gt;
&lt;br /&gt;
== Team/Player Info ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerRoster&#039;&#039;&#039;&lt;br /&gt;
  ( [number sortType] | [number sortType], [bool showPathingPlayers] ) -&amp;gt;&lt;br /&gt;
    nil | playerTable = {&lt;br /&gt;
            [1] = {&lt;br /&gt;
              string  name,&lt;br /&gt;
              number  playerID,&lt;br /&gt;
              number  teamID,&lt;br /&gt;
              number  allyTeamID,&lt;br /&gt;
              boolean spectator,&lt;br /&gt;
              number  cpuUsage,&lt;br /&gt;
              number  pingTime&lt;br /&gt;
            },&lt;br /&gt;
            etc...&lt;br /&gt;
          }&lt;br /&gt;
   if pingTime is == -1, the player is pathfinding, in order to find the progress, use:&lt;br /&gt;
   cpuUsage&amp;amp;0x1 if it&#039;s PC or BO, cpuUsage&amp;amp; 0xFE to get path res, (cpuUsage&amp;gt;&amp;gt;8)*1000&lt;br /&gt;
   for the progress&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  Sort codes:&lt;br /&gt;
     1 = Sort by allies  (the default)&lt;br /&gt;
     2 = Sort by teamID&lt;br /&gt;
     3 = Sort by playerName&lt;br /&gt;
     4 = Sort by CPU usage&lt;br /&gt;
     5 = Sort by ping time&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamOrigColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number r, number g, number b,  number a&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerTraffic&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID [, number packetID] ) -&amp;gt; number&lt;br /&gt;
&lt;br /&gt;
== Sound ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSoundStreamTime&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number playedTime, number totalTime&lt;br /&gt;
&lt;br /&gt;
== Camera ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraNames&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [camName] = number camNum, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { &amp;quot;name&amp;quot; = string, &amp;quot;mode&amp;quot; = number camIdx, state1 = number, state2 = number, ... }&lt;br /&gt;
&lt;br /&gt;
See [[Lua_camState]] for details about Spring.GetCameraState output.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraPosition&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraDirection&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number forward_x, number forward_y, number forward_z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraFOV&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number vFov, number hFov&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCameraVectors&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; vectorTable = {&lt;br /&gt;
    forward   = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    up        = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    right     = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    top       = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    bottom    = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    leftside  = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    rightside = { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
=== Inview ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleUnits&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 [, number radius = 30 [, boolean Icons = true ]]] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1 [, number radius = 30 [, boolean Icons = true [, boolean geos = true ]]]] )&lt;br /&gt;
    -&amp;gt; nil | featureTable = { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAABBInView&#039;&#039;&#039;&lt;br /&gt;
  ( number minX, number minY, number minZ,&lt;br /&gt;
    number maxX, number maxY, number maxZ ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsSphereInView&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [, number radius ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInView&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number radius [, boolean checkIcons] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Screen Trace ===&lt;br /&gt;
&#039;&#039;&#039;Spring.WorldToScreenCoords&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TraceScreenRay&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  ( number mouseX, number mouseY [, boolean onlyCoords &lt;br /&gt;
  [, boolean useMinimap [, boolean includeSky [, boolean ignoreWater [, number D] ] ] ] ] )&lt;br /&gt;
    -&amp;gt; nil |&lt;br /&gt;
    string &amp;quot;unit&amp;quot;,    number unitID    |&lt;br /&gt;
    string &amp;quot;feature&amp;quot;, number featureID |&lt;br /&gt;
    string &amp;quot;ground&amp;quot;,  { [1] = number x, [2] = number y, [3] = number z }&lt;br /&gt;
&lt;br /&gt;
{{new|101.0}} Exended to allow a custom plane, parameters are (0, 1, 0, D=0) where D is the offset D can be specified in the third argument (if all the bools are false) or in the seventh (as shown). Intersection coordinates are returned in t[4],t[5],t[6] when the ray goes offmap and includeSky is true), or when no unit or feature is hit (or onlyCoords is true). This will only work for units &amp;amp; objects with the default collission sphere. Per Piece collission and custom collission objects are not supported. The unit must be selectable, to appear to a screen trace ray.&lt;br /&gt;
&lt;br /&gt;
to get map coordinates under mouse cursor: input mouse coordinates obtained via GetMouseState() and pass true for the onlyCoords parameter. Be careful as going off map will result in nil:&lt;br /&gt;
   local mouseX, mouseY = Spring.GetMouseState()&lt;br /&gt;
   print (&amp;quot;Mouse coordinates: (&amp;quot; .. mouseX .. &amp;quot;, &amp;quot; .. mouseY .. &amp;quot;)&amp;quot;)&lt;br /&gt;
   local desc, args = Spring.TraceScreenRay(mouseX, mouseY, true)&lt;br /&gt;
   if nil == desc then return end -- off map&lt;br /&gt;
   local x = args[1]&lt;br /&gt;
   local y = args[2]&lt;br /&gt;
   local z = args[3]&lt;br /&gt;
   print (&amp;quot;World coordinates: (&amp;quot; .. x .. &amp;quot;, &amp;quot; .. y .. &amp;quot;, &amp;quot; .. z .. &amp;quot;)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPixelDir&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
  ( number x, number y ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
=== Screen &amp;amp; Window Geometry ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetViewGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number viewSizeX, number viewSizeY, number viewPosX, number viewPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWindowGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number winSizeX, number winSizeY, number winPosX, number winPosY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetScreenGeometry&#039;&#039;&#039; (is missing multiscreen support!)&lt;br /&gt;
  ( ) -&amp;gt; number screenSizeX, number screenSizeY, number ZERO, number ZERO&lt;br /&gt;
&lt;br /&gt;
== Unit ==&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitViewPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean midPos = false ] ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransformMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, boolean invert = false] ) -&amp;gt; nil | number a11, number a12 ..., number a44    &amp;lt;span class=note&amp;gt;(4x4 matrix)&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelectionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
=== Selected Units ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = { [1] = [number unitID], etc...}, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [number unitDefID] = number count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number count&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitSelected&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Groups ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitGroup&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [number] = number unitCount,&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSelectedGroup&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIName&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; string aiName&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupAIList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [1] = string aiName, ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = number unitID, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = {number unitID, ...}, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | {&lt;br /&gt;
    [number unitDefID] = number count, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroupUnitsCount&#039;&#039;&#039;&lt;br /&gt;
  ( number groupID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
== Feature ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSelectionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVisibleProjectiles&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   ([ number allyTeamID = -1&lt;br /&gt;
   [ , boolean addSyncedProjectiles = true&lt;br /&gt;
   [ , boolean addWeaponProjectiles = true&lt;br /&gt;
   [ , boolean addPieceProjectiles = true ]]]]&lt;br /&gt;
   ) --&amp;gt; nil | {[1] = projectileID, ...}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== UI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUICommands&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      command=string,&lt;br /&gt;
      description=string,&lt;br /&gt;
      synced=bool,&lt;br /&gt;
      cheat=bool,&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&lt;br /&gt;
Returns a list of available [[UI commands]].&lt;br /&gt;
&lt;br /&gt;
=== GUI Settings ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGUIHidden&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveShadows&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.HaveAdvShading&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWaterMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number mode, string &amp;quot;mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;  mode numbers:&lt;br /&gt;
      0 - basic&lt;br /&gt;
      1 - reflective&lt;br /&gt;
      2 - dynamic&lt;br /&gt;
      3 - refractive&lt;br /&gt;
      4 - bumpwater&lt;br /&gt;
      default - unknown&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapDrawMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | &amp;quot;normal&amp;quot; | &amp;quot;height&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;pathTraversability&amp;quot; | &amp;quot;los&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns whether &amp;amp;quot;Selected units&amp;amp;quot; text is displayed.&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit &amp;amp; Feature GUI States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoMinimap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLuaDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoDraw&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Minimap ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapGeometry&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number posX, number posY, number sizeX, number sizeY,&lt;br /&gt;
    boolean minimized, boolean maximized&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMiniMapDualScreen&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean false | string &amp;quot;left&amp;quot; | string &amp;quot;right&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.IsAboveMiniMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (Build-)Menu ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDefaultCommand&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number index (, number cmd_id, number cmd_type, string cmd_name)&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActiveCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number index ) -&amp;gt; nil | {&lt;br /&gt;
      id=number,&lt;br /&gt;
      type=number,&lt;br /&gt;
      name=string,&lt;br /&gt;
      action=string,&lt;br /&gt;
      tooltip=string,&lt;br /&gt;
      texture=string,&lt;br /&gt;
      cursor=string,&lt;br /&gt;
      hidden=boolean,&lt;br /&gt;
      disabled=boolean,&lt;br /&gt;
      showUnique=boolean,&lt;br /&gt;
      onlyTexture=boolean,&lt;br /&gt;
      params = { [1] = string, .. }&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCmdDescIndex&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActivePage&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number pageNum, number maxPages&lt;br /&gt;
&lt;br /&gt;
=== Build Facing ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
=== GatherMode &amp;amp; InvertQueueKey ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGatherMode&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetInvertQueueKey&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
=== Mouse States ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseState&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  ( ) -&amp;gt; number X, number Y,&lt;br /&gt;
    boolean leftPressed, boolean middlePressed, boolean rightPressed,&lt;br /&gt;
    boolean offscreen&lt;br /&gt;
&lt;br /&gt;
X, Y are the screen coordinates, not world ones. This coordinate system starts in the lower left corner.&lt;br /&gt;
&lt;br /&gt;
{{new|104.0}} Sixth return value offscreen&lt;br /&gt;
&lt;br /&gt;
For world coordinates see Spring.TraceScreenRay&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseCursor&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string name, number scale&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMouseStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number mouseButton ) -&amp;gt; nil | number pressedX, number pressedY,&lt;br /&gt;
    number camPosX, number camPosY, number camPosZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
=== (Hot-)Keys ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModKeyState&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean alt, boolean ctrl, boolean meta, boolean shift&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPressedKeys&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
    [number code] = boolean,&lt;br /&gt;
    [string name] = boolean, {{new|99.0}}&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyCode&#039;&#039;&#039;&lt;br /&gt;
  ( string keysym ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeySymbol&#039;&#039;&#039;&lt;br /&gt;
  ( number key ) -&amp;gt; string &amp;quot;keysym1&amp;quot;, string &amp;quot;keysym2&amp;quot;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetKeyBindings&#039;&#039;&#039;&lt;br /&gt;
  ( string keyset ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      [string actionCmd] = string actionExtra,&lt;br /&gt;
      command   = string actionCmd,    {{new|97}}&lt;br /&gt;
      boundWith = string boundWith,    {{new|97}}&lt;br /&gt;
      extra     = string actionExtra,  {{new|97}}&lt;br /&gt;
    }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetActionHotKeys&#039;&#039;&#039;&lt;br /&gt;
  ( string action ) -&amp;gt; nil | { [1] = string hotKey, ... }&lt;br /&gt;
&lt;br /&gt;
=== Console ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastMessagePositions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = { number X, number Y, number Z },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConsoleBuffer&#039;&#039;&#039;&lt;br /&gt;
  ( [number maxLines] ) -&amp;gt; nil | {&lt;br /&gt;
    [1] = {&lt;br /&gt;
      text = string,&lt;br /&gt;
      priority = number&lt;br /&gt;
   }, ...&lt;br /&gt;
  }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCurrentTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
=== LOS Colors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLosViewColors&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
  ( ) -&amp;gt; always = {r,g,b}, LOS = {r,g,b}, radar = {r,g,b}, jam = {r,g,b}, radar2 = {r,g,b}  {{new|100}}&lt;br /&gt;
&lt;br /&gt;
== Config ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigParams&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;same information as &amp;lt;code&amp;gt;spring --list-config-vars&amp;lt;/code&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; table {&lt;br /&gt;
    {&lt;br /&gt;
      name = string,&lt;br /&gt;
      type = string,&lt;br /&gt;
      [ description = string, ]&lt;br /&gt;
      [ defaultValue = string, ]&lt;br /&gt;
      [ minimumValue = string, ]&lt;br /&gt;
      [ maximumValue = string, ]&lt;br /&gt;
      [ safemodeValue = string, ]&lt;br /&gt;
      [ declarationFile = string, ]&lt;br /&gt;
      [ declarationLine = number, ]&lt;br /&gt;
      [ readOnly = bool, ]&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigInt&#039;&#039;&#039;&lt;br /&gt;
  ( string name [, number default ] ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigFloat&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( string name [, number default ] ) -&amp;gt; nil | number&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetConfigString&#039;&#039;&#039;&lt;br /&gt;
  ( string name [, string default ] ) -&amp;gt; nil | string&lt;br /&gt;
&lt;br /&gt;
== FPS &amp;amp; GetDrawFrame ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFPS&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetDrawFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number low 16bit, number high 16bit&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVideoCapturingMode&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( ) -&amp;gt; boolean videoCaptureAllowed&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameState&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( ) -&amp;gt; boolean finishedLoading, boolean loadedFromSave, boolean locallyPaused, boolean laggingWrtExpectedFromSimtime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimeOffset&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLastUpdateSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHasLag&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTimer&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFrameTimer&#039;&#039;&#039; {{new|102.0}}&lt;br /&gt;
  ( ) -&amp;gt; timer&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Get a timer for the start of the frame, this should give better results for camera interpolations.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DiffTimers&#039;&#039;&#039;&lt;br /&gt;
  ( timer cur, timer ago, [boolean inMilliseconds]) -&amp;gt; number seconds&lt;br /&gt;
{{New|95.0}} optional third argument (boolean) to return dt in milliseconds&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  (number texSqrX, number texSqrY, number texMipLvl, string luaTexName) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetLogSections&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; table { &amp;quot;KeyBindings&amp;quot; = LOG.INFO, &amp;quot;Font&amp;quot; = LOG.INFO, &amp;quot;Sound&amp;quot; = LOG.WARNING, ... }&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClipboard&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; string text&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12329</id>
		<title>Lua UnsyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12329"/>
		<updated>2021-04-19T15:24:02Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: /* Map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Prior to 102.0, entries below marked &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt; require the setting ModUICtrl to be enabled in the users [[springrc]], if you want to use them in unsynced LuaRules/LuaGaia. It is enabled by default in previous versions and removed in 102.0 so you generally don&#039;t need to care.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= UI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLastMessagePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Ingame Console =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Echo&lt;br /&gt;
|arg1 = {{type|arg1}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|arg2}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Useful for debugging.&amp;lt;br&amp;gt; Prints values in the spring chat console.&amp;lt;br&amp;gt; Hint: the default print() writes to STDOUT.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Log&lt;br /&gt;
|arg1 = {{type|string}} section&lt;br /&gt;
|arg2 = {{type|number}} logLevel {{pipe}} {{type|string}} logLevel &lt;br /&gt;
|arg3 = {{type|string}} LogMessage1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} LogMessage2{{bracket}}&lt;br /&gt;
|arg5 = ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Possible values for logLevel are:&lt;br /&gt;
    &amp;quot;debug&amp;quot;   | LOG.DEBUG&lt;br /&gt;
    &amp;quot;info&amp;quot;    | LOG.INFO&lt;br /&gt;
    &amp;quot;notice&amp;quot;  | LOG.NOTICE (engine default) (new in Version 97)&lt;br /&gt;
    &amp;quot;warning&amp;quot; | LOG.WARNING&lt;br /&gt;
    &amp;quot;error&amp;quot;   | LOG.ERROR&lt;br /&gt;
    &amp;quot;fatal&amp;quot;   | LOG.FATAL&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = {{type|string}} command1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} command2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = { {{type|string}} command1, {{type|string}} command2, ... }&lt;br /&gt;
|arg2 =&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|string}} action {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} actionExtra {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|number}} cmdIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} button = 1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} leftClick {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} rightClick {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} alt {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} ctrl {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} meta {{bracket}}&lt;br /&gt;
|arg8 = {{type|bool}} shift {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCmdColorsConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCtrlPanelConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ForceLayoutUpdate&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSelectionInfo&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Disables the &amp;quot;Selected Units x&amp;quot; box in the GUI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Mouse ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} cursorName {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scale {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = WarpMouse&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== LOS Colors ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLosViewColors&lt;br /&gt;
|arg1 = {{type|table}} always = {r,g,b}&lt;br /&gt;
|arg2 = {{type|table}} LOS = {r,g,b}&lt;br /&gt;
|arg3 = {{type|table}} radar = {r,g,b}&lt;br /&gt;
|arg4 = {{type|table}} jam = {r,g,b}&lt;br /&gt;
|arg5 = {{type|table}} radar2 = {r,g,b}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;New arguments since 100.0 (radar2 is the inside of radar edge). Arguments for 99.0 and before:&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;( table reds = { number always, number LOS, number radar, number jam }, &lt;br /&gt;
    table greens = { number always, number LOS, number radar, number jam },&lt;br /&gt;
    table blues = { number always, number LOS, number radar, number jam } ) -&amp;gt; nil&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SendMessage ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessage&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToPlayer&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToSpectators&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;PLAYER#&amp;gt; (with # being a playerid) inside the string will be replaced with the players name - i.e. :&amp;lt;br&amp;gt;Spring.SendMessage (&amp;quot;&amp;lt;PLAYER1&amp;gt; did something&amp;quot;)&amp;lt;br&amp;gt;might display as &amp;quot;ProRusher did something&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddPoint&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} text = &amp;quot;&amp;quot; {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} localOnly {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddLine&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} z1&lt;br /&gt;
|arg4 = {{type|number}} x2&lt;br /&gt;
|arg5 = {{type|number}} y2&lt;br /&gt;
|arg6 = {{type|number}} z2&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerErasePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadSoundDef&lt;br /&gt;
|arg1 = {{type|string}} soundfile&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = Loads a SoundDefs file, the format is the same as in `gamedata/sounds.lua`.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundFile&lt;br /&gt;
|arg1 = {{type|string}} soundfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posx {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posy {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} posz {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} speedx{{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} speedy{{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} speedz{{bracket}}&lt;br /&gt;
|arg9 = {{type|number}} {{pipe}} {{type|string}} channel {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} playSound&lt;br /&gt;
|info = Possible arguments for channel argument:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;quot;general&amp;quot; || 0 || nil (default)&lt;br /&gt;
    &amp;quot;battle&amp;quot; || &amp;quot;sfx&amp;quot; | 1&lt;br /&gt;
    &amp;quot;unitreply&amp;quot; || &amp;quot;voice&amp;quot; || 2&lt;br /&gt;
    &amp;quot;userinterface&amp;quot; || &amp;quot;ui&amp;quot; || 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundStream&lt;br /&gt;
|arg1 = {{type|string}} oggfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enqueue {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = Allows to play an Ogg Vorbis (.OGG) compressed sound file.&amp;lt;br&amp;gt; In 83.0 and up multiple sound streams may be played at once.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = StopSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Terminates any SoundStream currently running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PauseSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSoundStreamVolume&lt;br /&gt;
|arg1 = {{type|number}} volume&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= SendLuaMessage =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Very important! (allows synced inter-lua-enviroment communications)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaUIMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = {{type|string}} mode &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Possible modes are:&amp;lt;br&amp;gt;&amp;quot;s&amp;quot;/&amp;quot;specs&amp;quot; &amp;amp; &amp;quot;a&amp;quot;/&amp;quot;allies&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaGaiaMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaRulesMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendSkirmishAIMessage&lt;br /&gt;
|arg1 = {{type|number}} aiTeam&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} ai_processed, { {{bracket|1}} = {{type|string}} response1, ... }&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Note there is nothing in this table due to &amp;quot;limitations&amp;quot; of the AI interface.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Units =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLeaveTracks&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} leavetracks &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Selection ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SelectUnitMap&lt;br /&gt;
|arg1 = { {{bracket|unitID}} = anything, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} append {{rbacket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SelectUnitArray&lt;br /&gt;
|arg1 = { {{bracket|1}} = unitID1, {{bracket|2}} = unitID2, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} append {{rbacket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSelectionInfo&lt;br /&gt;
|arg1 = {{type|bool}} drawSelectionInfo&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Group ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitGroup&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} groupID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Give Order ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrder&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg3 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Gives order to all selected units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = {{type|table}} unitMap = { {{bracket|unitID}} = arg1, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = {{type|table}} unitArray = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = {{type|table}} unitMap = { {{bracket|unitID}} = arg1, etc... }&lt;br /&gt;
|arg2 = {{type|table}} orderArray = { {{type|number}} cmdID, {{type|table}} params = {number, etc...}, {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = {{type|table}} unitArray = { {{bracket|11}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = {{type|table}} orderArray = { {{type|number}} cmdID, {{type|table}} params = {number, etc...}, {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} pairwise {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;quot;pairwise&amp;quot; paramater ({{new|89.0}}) is used to send multiple units a single individual command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} facing &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetBuildSpacing&lt;br /&gt;
|arg1 = {{type|number}} spacing &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit NoDraw,NoSelect,NoMinimap ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoDraw&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noDraw&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoSelect&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoMinimap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noMinimap&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureFade&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} allow&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Control whether a feature will fade or not when zoomed out.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoDraw&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noDraw&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSky&lt;br /&gt;
|arg1 = {{type|bool}} drawSky &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawWater&lt;br /&gt;
|arg1 = {{type|bool}} drawWater&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawGround&lt;br /&gt;
|arg1 = {{type|bool}} drawGround &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWaterParams&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 104.0 no longer needs cheating enabled.&amp;lt;br&amp;gt;Allows to change water params (mostly BumpWater ones) at runtime. You may want to set BumpWaterUseUniforms in your [[springrc]] to 1, then you don&#039;t even need to restart BumpWater via `/water 4`. &amp;quot;Params&amp;quot; table contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  params = {&lt;br /&gt;
    absorb = {number r, number g, number b},&lt;br /&gt;
    baseColor = {number r, number g, number b},&lt;br /&gt;
    minColor = {number r, number g, number b},&lt;br /&gt;
    surfaceColor = {number r, number g, number b},&lt;br /&gt;
    diffuseColor = {number r, number g, number b},&lt;br /&gt;
    specularColor = {number r, number g, number b},&lt;br /&gt;
    planeColor = {number r, number g, number b},&lt;br /&gt;
    texture = string file,&lt;br /&gt;
    foamTexture = string file,&lt;br /&gt;
    normalTexture = string file,&lt;br /&gt;
    damage = number value,&lt;br /&gt;
    repeatX = number value,&lt;br /&gt;
    repeatY = number value,&lt;br /&gt;
    surfaceAlpha = number value,&lt;br /&gt;
    ambientFactor = number value,&lt;br /&gt;
    diffuseFactor = number value,&lt;br /&gt;
    specularFactor = number value,&lt;br /&gt;
    specularPower = number value,&lt;br /&gt;
    fresnelMin = number value,&lt;br /&gt;
    fresnelMax = number value,&lt;br /&gt;
    fresnelPower = number value,&lt;br /&gt;
    reflectionDistortion = number value,&lt;br /&gt;
    blurBase = number value,&lt;br /&gt;
    blurExponent = number value,&lt;br /&gt;
    perlinStartFreq = number value,&lt;br /&gt;
    perlinLacunarity = number value,&lt;br /&gt;
    perlinAmplitude = number value,&lt;br /&gt;
    numTiles = number value,&lt;br /&gt;
    shoreWaves = boolean value,&lt;br /&gt;
    forceRendering = boolean value,&lt;br /&gt;
    hasWaterPlane = boolean value,&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapRenderingParams&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Allows to change map rendering params at runtime.&amp;lt;br&amp;gt;&amp;quot;Params&amp;quot; table contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  params = {&lt;br /&gt;
    splatTexMults = {number r, number g, number b, number a},&lt;br /&gt;
    splatTexScales = {number r, number g, number b, number a},&lt;br /&gt;
    voidWater = boolean value,&lt;br /&gt;
    voidGround = boolean value,&lt;br /&gt;
    splatDetailNormalDiffuseAlpha = boolean value,&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLogSectionFilterLevel&lt;br /&gt;
|arg1 = {{type|string}} sectionName&lt;br /&gt;
|arg2 = {{type|string}} {{pipe}} {{type|number}} logLevel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&amp;lt;br&amp;gt;See [[infolog.txt]] for possible log sections.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawGroundDeferred&lt;br /&gt;
|arg1 = {{type|bool}} drawGroundDeferred {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} drawGroundForward {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}} {{var|drawGroundForward}} allows disabling of the forward pass&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawModelsDeferred&lt;br /&gt;
|arg1 = {{type|bool}} drawUnitsDeferred &lt;br /&gt;
|arg2 = {{type|bool}} drawFeaturesDeferred {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} drawUnitsForward {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} drawFeaturesForward  {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}} {{var|drawFeaturesForward}}, {{var|drawUnitsForward}} allows disabling of the respective forward passes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetVideoCapturingMode&lt;br /&gt;
|arg1 = {{type|bool}} allowCaptureMode &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;This doesn&#039;t actually record the game in any way, it just regulates the framerate and interpolations.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetVideoCapturingTimeOffset&lt;br /&gt;
|arg1 = {{type|bool}} timeOffset&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|table}} units = { {{bracket|1}} = unitID, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} false&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|table}} units = { {{bracket|unitID}} = arg1, ... } &lt;br /&gt;
|arg2 = {{type|bool}} true&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} cmdName&lt;br /&gt;
|arg2 = {{type|string}} iconFileName {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} overwrite = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} hotSpotTopLeft = false {{rbracket}}{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Changes/creates the cursor of a single CursorCmd. Note, that iconFileName is not the full filename instead it is like this:&amp;lt;br/&amp;gt;Wanted filename: Anims/cursorattack_0.bmp&amp;lt;br/&amp;gt;=&amp;gt; iconFileName: cursorattack&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ReplaceMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} oldFileName&lt;br /&gt;
|arg2 = {{type|string}} newFileName {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} hotSpotTopLeft = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Mass replace all occurrence of the cursor in all CursorCmds.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCustomCommandDrawData&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|number}} cmdID_cloneIcon {{pipe}} {{type|string}} iconname&lt;br /&gt;
|arg3 = {{type|table}} RGBA = { {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a } {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} showArea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Register your custom cmd so it gets visible in the unit&#039;s cmd queue&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCustomCommandDrawData&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|nil}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Register your custom cmd so it gets visible in the unit&#039;s cmd queue&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sharing =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetShareLevel&lt;br /&gt;
|arg1 = {{type|string}} metal {{pipe}} {{type|string}} energy&lt;br /&gt;
|arg2 = {{type|number}} shareLevel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Note: shareLevel is 0&amp;lt;= x &amp;lt;= 1 .&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} units&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} metal {{pipe}} {{type|string}} energy&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= UnitDef RadarIcons &amp;amp; BuildPics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitIcon&lt;br /&gt;
|arg1 = {{type|string}} iconName&lt;br /&gt;
|arg2 = {{type|string}} texFile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} dist {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} radAdjust {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} added&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FreeUnitIcon&lt;br /&gt;
|arg1 = {{type|string}} iconName&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} freed&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDefIcon&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|string}} iconName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Sets radar icon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDefImage&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|string}} luaTexture {{pipe}} {{type|string}} texFile &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Sets buildpic.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Camera =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraState&lt;br /&gt;
|arg1 = {{type|table}} camState&lt;br /&gt;
|arg2 = {{type|number}} camTime&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stateSet&lt;br /&gt;
|info = camState has the same format as the output of Spring.GetCameraState(). See [[Lua_camState]] for details about camState.&amp;lt;br&amp;gt;The camState&#039;s mode/name must fit the rest of the state. Getting a state, changing its mode/name and then passing it to SetCameraState will have undesired results. [https://springrts.com/mantis/view.php?id=5028#c15491] Also see #5028]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraTarget&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} transTime {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = For Spring Engine XZ represents horizontal, from north west corner of map and Y vertical, from water level and rising.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraOffset&lt;br /&gt;
|arg1 = {{type|number}} px = 0 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} py = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} pz = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} tx = 0 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} ty = 0 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tz = 0 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= (Virtual-)FileSystem =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ExtractModArchiveFile&lt;br /&gt;
|arg1 = {{type|string}} modfile&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} extracted&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateDir&lt;br /&gt;
|arg1 = {{type|string}} path&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} dirCreated&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The full VFS API is available at [[Lua_VFS|link]].&lt;br /&gt;
&lt;br /&gt;
= Engine Config =&lt;br /&gt;
&lt;br /&gt;
The following functions read the engine configs saved in [[Springsettings.cfg]], a version-ed instance of these or a custom file supplied on the command line.&lt;br /&gt;
If &#039;&#039;*Overlay&#039;&#039; is &#039;&#039;true&#039;&#039;, the value will only be set in memory, and not be restored for the next game.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigInt&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigFloat&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigString&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= World Primitives =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;outdated! use opengl api instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldIcon&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldText&lt;br /&gt;
|arg1 = {{type|string}} text&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldUnit&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} team&lt;br /&gt;
|arg4 = {{type|number}} facing&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sun  =&lt;br /&gt;
The dynamic Sun must be invoked via /dynamicsun (Dynamic sun was removed in 104.0, use SetSunDirection, SetSunLighting &amp;amp; SetAtmosphere instead).&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunManualControl&lt;br /&gt;
|arg1 = {{type|bool}} setManualControl &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunParameters&lt;br /&gt;
|arg1 = {{type|number}} dirX&lt;br /&gt;
|arg2 = {{type|number}} dirY&lt;br /&gt;
|arg3 = {{type|number}} dirZ&lt;br /&gt;
|arg4 = {{type|number}} dist&lt;br /&gt;
|arg5 = {{type|number}} startTime&lt;br /&gt;
|arg6 = {{type|number}} orbitTime &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunDirection&lt;br /&gt;
|arg1 = {{type|number}} dirX&lt;br /&gt;
|arg2 = {{type|number}} dirY&lt;br /&gt;
|arg3 = {{type|number}} dirZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunLighting&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;It can be used to modify the following sun lighting parameters: &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;     {ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent&lt;br /&gt;
     All Colourvalues have to in the Range from 0.0 to 1.0 for all colors and the alpha&lt;br /&gt;
     Example usage: Spring.SetSunLighting({groundAmbientColor = {1, 0.1, 1}, groundDiffuseColor = {1, 0.1, 1} })&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAtmosphere&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;It can be used to modify the following atmosphere parameters: &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;     fog{Start,End}, {sun,sky,cloud}Color&lt;br /&gt;
     Example usage: Spring.SetAtmosphere({ fogStart = 0, fogEnd   = 0.5, fogColor = { 0.7, 0.2, 0.2, 1 }})&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Reload&lt;br /&gt;
|arg1 = {{type|string}} startscript&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|99.0}}&amp;lt;br&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Restart&lt;br /&gt;
|arg1 = {{type|string}} commandline_args&lt;br /&gt;
|arg2 = {{type|string}} startscript&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|0.79}}&amp;lt;br&amp;gt;If this call returns, something went wrong.&amp;lt;br&amp;gt;&#039;&#039;commandline_args&#039;&#039; are commandline arguments passed to spring executable.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Start&lt;br /&gt;
|arg1 = {{type|string}} commandline_args&lt;br /&gt;
|arg2 = {{type|string}} startscript&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|102.0}}&amp;lt;br&amp;gt;If this call returns, something went wrong.&amp;lt;br&amp;gt;Launches a new Spring instance without terminating the existing one.&amp;lt;br&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start (if empty, no start-script is added, you can still point spring to your custom script.txt when you add the file-path to &#039;&#039;commandline_args&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWMIcon&lt;br /&gt;
|arg1 = {{type|string}} iconFileName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Sets the icon for the process which is seen in the OS task-bar and other places (default: spring-logo).&amp;lt;br/&amp;gt;Note: has to be 24bit or 32bit.&amp;lt;br/&amp;gt;Note: on windows, it has to be 32x32 pixels in size (recommended for cross-platform)&amp;lt;br/&amp;gt;Note: &#039;&#039;*.bmp&#039;&#039; images have to be in BGR format (default for m$ ones).&amp;lt;br/&amp;gt;Note: &#039;&#039;*.ico&#039;&#039; images are not supported.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWMCaption&lt;br /&gt;
|arg1 = {{type|string}} title {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} titleShort = title {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Sets the window &#039;&#039;title&#039;&#039; for the process (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;br&amp;gt;The &#039;&#039;shortTitle&#039;&#039; is displayed in the OS task-bar (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;br&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; &#039;&#039;shortTitle&#039;&#039; is only ever possibly used under X11 (Linux &amp;amp; OS X), but not with QT (KDE) and never under Windows. See [http://www.gpwiki.org/index.php/SDL:Tutorials:Initializing_SDL_Libraries#About_the_icon_.28.22Icon_Title.22.29_parameter_on_different_window-managers this site] for more details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearWatchDogTimer&lt;br /&gt;
|arg1 = {{bracket}} {{type|string}} threadName = main {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetClipboard&lt;br /&gt;
|arg1 = {{type|string}} text&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|98.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Rendering =&lt;br /&gt;
== Preload ==&lt;br /&gt;
Allow the engine to load the unit&#039;s model (and texture) in a background thread. Wreckages and buildOptions of a unit are automatically preloaded.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PreloadUnitDefModel&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PreloadFetureDefModel&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;NOTE: these (0.83+) lighting callouts only work when called from unsynced gadgets!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddMapLight&lt;br /&gt;
|arg1 = {{type|table}} lightParams&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} lightHandle&lt;br /&gt;
|info = (requires MaxDynamicMapLights &amp;amp;gt; 0)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddModelLight&lt;br /&gt;
|arg1 = {{type|table}} lightParams&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} lightHandle&lt;br /&gt;
|info = (requires MaxDynamicMapLights &amp;amp;gt; 0)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UpdateMapLight&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|table}} lightParams&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UpdateModelLight&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|table}} lightParams&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapLightTrackingState&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|number}} unitOrProjectileID&lt;br /&gt;
|arg3 = {{type|bool}} enableTracking&lt;br /&gt;
|arg4 = {{type|bool}} unitOrProjectile&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetModelLightTrackingState&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|number}} unitOrProjectileID&lt;br /&gt;
|arg3 = {{type|bool}} enableTracking&lt;br /&gt;
|arg4 = {{type|bool}} unitOrProjectile&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;lightParams&#039;&#039;&#039; is a table that should contain at least one of the following recognized key/value pairs:&lt;br /&gt;
&lt;br /&gt;
    lightParams = {&lt;br /&gt;
        position = {px, py, pz},&lt;br /&gt;
        direction = {dx, dy, dz},&lt;br /&gt;
        ambientColor = {red, green, blue},&lt;br /&gt;
        diffuseColor = {red, green, blue},&lt;br /&gt;
        specularColor = {red, green, blue},&lt;br /&gt;
        intensityWeight = {ambientWeight, diffuseWeight, specularWeight},&lt;br /&gt;
&lt;br /&gt;
        -- per-frame decay of ambientColor (spread over TTL frames)&lt;br /&gt;
        ambientDecayRate = {ambientRedDecay, ambientGreenDecay, ambientBlueDecay},&lt;br /&gt;
        -- per-frame decay of diffuseColor (spread over TTL frames)&lt;br /&gt;
        diffuseDecayRate = {diffuseRedDecay, diffuseGreenDecay, diffuseBlueDecay},&lt;br /&gt;
        -- per-frame decay of specularColor (spread over TTL frames)&lt;br /&gt;
        specularDecayRate = {specularRedDecay, specularGreenDecay, specularBlueDecay},&lt;br /&gt;
        -- *DecayType = 0.0 -&amp;gt; interpret *DecayRate values as linear, else as exponential&lt;br /&gt;
        decayFunctionType = {ambientDecayType, diffuseDecayType, specularDecayType},&lt;br /&gt;
&lt;br /&gt;
        radius = number elmos,&lt;br /&gt;
        fov = number degrees,&lt;br /&gt;
        ttl = number frames,&lt;br /&gt;
        priority = number,&lt;br /&gt;
        ignoreLOS = boolean,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSkyBoxTexture&lt;br /&gt;
|arg1 = {{type|string}} texName&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapShadingTexture&lt;br /&gt;
|arg1 = {{type|string}} texType&lt;br /&gt;
|arg2 = {{type|string}} texName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Example usage: Spring.SetMapShadingTexture(&amp;quot;$ssmf_specular&amp;quot;, &amp;quot;name_of_my_shiny_texture&amp;quot;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapSquareTexture&lt;br /&gt;
|arg1 = {{type|number}} texSqrX&lt;br /&gt;
|arg2 = {{type|number}} texSqrY&lt;br /&gt;
|arg3 = {{type|string}} luaTexName&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapShader&lt;br /&gt;
|arg1 = {{type|number}} standardShaderID&lt;br /&gt;
|arg2 = {{type|number}} deferredShaderID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;The ID&#039;s must refer to valid programs returned by gl.CreateShader. Passing in a value of 0 will cause the respective shader to revert back to its engine default. Custom map shaders that declare a uniform ivec2 named &amp;quot;texSquare&amp;quot; can sample from the default diffuse texture(s), which are always bound to TU 0.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12328</id>
		<title>Lua UnsyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12328"/>
		<updated>2021-04-19T15:23:15Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: Updated page with new anchorable templates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Prior to 102.0, entries below marked &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt; require the setting ModUICtrl to be enabled in the users [[springrc]], if you want to use them in unsynced LuaRules/LuaGaia. It is enabled by default in previous versions and removed in 102.0 so you generally don&#039;t need to care.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= UI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLastMessagePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Ingame Console =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Echo&lt;br /&gt;
|arg1 = {{type|arg1}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|arg2}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Useful for debugging.&amp;lt;br&amp;gt; Prints values in the spring chat console.&amp;lt;br&amp;gt; Hint: the default print() writes to STDOUT.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Log&lt;br /&gt;
|arg1 = {{type|string}} section&lt;br /&gt;
|arg2 = {{type|number}} logLevel {{pipe}} {{type|string}} logLevel &lt;br /&gt;
|arg3 = {{type|string}} LogMessage1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} LogMessage2{{bracket}}&lt;br /&gt;
|arg5 = ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Possible values for logLevel are:&lt;br /&gt;
    &amp;quot;debug&amp;quot;   | LOG.DEBUG&lt;br /&gt;
    &amp;quot;info&amp;quot;    | LOG.INFO&lt;br /&gt;
    &amp;quot;notice&amp;quot;  | LOG.NOTICE (engine default) (new in Version 97)&lt;br /&gt;
    &amp;quot;warning&amp;quot; | LOG.WARNING&lt;br /&gt;
    &amp;quot;error&amp;quot;   | LOG.ERROR&lt;br /&gt;
    &amp;quot;fatal&amp;quot;   | LOG.FATAL&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = {{type|string}} command1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} command2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = { {{type|string}} command1, {{type|string}} command2, ... }&lt;br /&gt;
|arg2 =&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|string}} action {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} actionExtra {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|number}} cmdIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} button = 1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} leftClick {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} rightClick {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} alt {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} ctrl {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} meta {{bracket}}&lt;br /&gt;
|arg8 = {{type|bool}} shift {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCmdColorsConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCtrlPanelConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ForceLayoutUpdate&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSelectionInfo&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Disables the &amp;quot;Selected Units x&amp;quot; box in the GUI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Mouse ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} cursorName {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scale {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = WarpMouse&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== LOS Colors ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLosViewColors&lt;br /&gt;
|arg1 = {{type|table}} always = {r,g,b}&lt;br /&gt;
|arg2 = {{type|table}} LOS = {r,g,b}&lt;br /&gt;
|arg3 = {{type|table}} radar = {r,g,b}&lt;br /&gt;
|arg4 = {{type|table}} jam = {r,g,b}&lt;br /&gt;
|arg5 = {{type|table}} radar2 = {r,g,b}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;New arguments since 100.0 (radar2 is the inside of radar edge). Arguments for 99.0 and before:&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;( table reds = { number always, number LOS, number radar, number jam }, &lt;br /&gt;
    table greens = { number always, number LOS, number radar, number jam },&lt;br /&gt;
    table blues = { number always, number LOS, number radar, number jam } ) -&amp;gt; nil&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SendMessage ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessage&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToPlayer&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToSpectators&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;PLAYER#&amp;gt; (with # being a playerid) inside the string will be replaced with the players name - i.e. :&amp;lt;br&amp;gt;Spring.SendMessage (&amp;quot;&amp;lt;PLAYER1&amp;gt; did something&amp;quot;)&amp;lt;br&amp;gt;might display as &amp;quot;ProRusher did something&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddPoint&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} text = &amp;quot;&amp;quot; {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} localOnly {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddLine&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} z1&lt;br /&gt;
|arg4 = {{type|number}} x2&lt;br /&gt;
|arg5 = {{type|number}} y2&lt;br /&gt;
|arg6 = {{type|number}} z2&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerErasePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadSoundDef&lt;br /&gt;
|arg1 = {{type|string}} soundfile&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = Loads a SoundDefs file, the format is the same as in `gamedata/sounds.lua`.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundFile&lt;br /&gt;
|arg1 = {{type|string}} soundfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posx {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posy {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} posz {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} speedx{{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} speedy{{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} speedz{{bracket}}&lt;br /&gt;
|arg9 = {{type|number}} {{pipe}} {{type|string}} channel {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} playSound&lt;br /&gt;
|info = Possible arguments for channel argument:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;quot;general&amp;quot; || 0 || nil (default)&lt;br /&gt;
    &amp;quot;battle&amp;quot; || &amp;quot;sfx&amp;quot; | 1&lt;br /&gt;
    &amp;quot;unitreply&amp;quot; || &amp;quot;voice&amp;quot; || 2&lt;br /&gt;
    &amp;quot;userinterface&amp;quot; || &amp;quot;ui&amp;quot; || 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundStream&lt;br /&gt;
|arg1 = {{type|string}} oggfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enqueue {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = Allows to play an Ogg Vorbis (.OGG) compressed sound file.&amp;lt;br&amp;gt; In 83.0 and up multiple sound streams may be played at once.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = StopSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Terminates any SoundStream currently running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PauseSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSoundStreamVolume&lt;br /&gt;
|arg1 = {{type|number}} volume&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= SendLuaMessage =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Very important! (allows synced inter-lua-enviroment communications)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaUIMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = {{type|string}} mode &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Possible modes are:&amp;lt;br&amp;gt;&amp;quot;s&amp;quot;/&amp;quot;specs&amp;quot; &amp;amp; &amp;quot;a&amp;quot;/&amp;quot;allies&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaGaiaMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaRulesMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendSkirmishAIMessage&lt;br /&gt;
|arg1 = {{type|number}} aiTeam&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} ai_processed, { {{bracket|1}} = {{type|string}} response1, ... }&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Note there is nothing in this table due to &amp;quot;limitations&amp;quot; of the AI interface.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Units =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLeaveTracks&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} leavetracks &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Selection ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SelectUnitMap&lt;br /&gt;
|arg1 = { {{bracket|unitID}} = anything, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} append {{rbacket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SelectUnitArray&lt;br /&gt;
|arg1 = { {{bracket|1}} = unitID1, {{bracket|2}} = unitID2, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} append {{rbacket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSelectionInfo&lt;br /&gt;
|arg1 = {{type|bool}} drawSelectionInfo&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Group ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitGroup&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} groupID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Give Order ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrder&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg3 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Gives order to all selected units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = {{type|table}} unitMap = { {{bracket|unitID}} = arg1, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = {{type|table}} unitArray = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = {{type|table}} unitMap = { {{bracket|unitID}} = arg1, etc... }&lt;br /&gt;
|arg2 = {{type|table}} orderArray = { {{type|number}} cmdID, {{type|table}} params = {number, etc...}, {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = {{type|table}} unitArray = { {{bracket|11}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = {{type|table}} orderArray = { {{type|number}} cmdID, {{type|table}} params = {number, etc...}, {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} pairwise {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;quot;pairwise&amp;quot; paramater ({{new|89.0}}) is used to send multiple units a single individual command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} facing &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetBuildSpacing&lt;br /&gt;
|arg1 = {{type|number}} spacing &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit NoDraw,NoSelect,NoMinimap ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoDraw&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noDraw&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoSelect&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoMinimap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noMinimap&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureFade&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} allow&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Control whether a feature will fade or not when zoomed out.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoDraw&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noDraw&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSky&lt;br /&gt;
|arg1 = {{type|bool}} drawSky &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawWater&lt;br /&gt;
|arg1 = {{type|bool}} drawWater&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawGround&lt;br /&gt;
|arg1 = {{type|bool}} drawGround &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWaterParams&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 104.0 no longer needs cheating enabled.&amp;lt;br&amp;gt;Allows to change water params (mostly BumpWater ones) at runtime. You may want to set BumpWaterUseUniforms in your [[springrc]] to 1, then you don&#039;t even need to restart BumpWater via `/water 4`. &amp;quot;Params&amp;quot; table contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  params = {&lt;br /&gt;
    absorb = {number r, number g, number b},&lt;br /&gt;
    baseColor = {number r, number g, number b},&lt;br /&gt;
    minColor = {number r, number g, number b},&lt;br /&gt;
    surfaceColor = {number r, number g, number b},&lt;br /&gt;
    diffuseColor = {number r, number g, number b},&lt;br /&gt;
    specularColor = {number r, number g, number b},&lt;br /&gt;
    planeColor = {number r, number g, number b},&lt;br /&gt;
    texture = string file,&lt;br /&gt;
    foamTexture = string file,&lt;br /&gt;
    normalTexture = string file,&lt;br /&gt;
    damage = number value,&lt;br /&gt;
    repeatX = number value,&lt;br /&gt;
    repeatY = number value,&lt;br /&gt;
    surfaceAlpha = number value,&lt;br /&gt;
    ambientFactor = number value,&lt;br /&gt;
    diffuseFactor = number value,&lt;br /&gt;
    specularFactor = number value,&lt;br /&gt;
    specularPower = number value,&lt;br /&gt;
    fresnelMin = number value,&lt;br /&gt;
    fresnelMax = number value,&lt;br /&gt;
    fresnelPower = number value,&lt;br /&gt;
    reflectionDistortion = number value,&lt;br /&gt;
    blurBase = number value,&lt;br /&gt;
    blurExponent = number value,&lt;br /&gt;
    perlinStartFreq = number value,&lt;br /&gt;
    perlinLacunarity = number value,&lt;br /&gt;
    perlinAmplitude = number value,&lt;br /&gt;
    numTiles = number value,&lt;br /&gt;
    shoreWaves = boolean value,&lt;br /&gt;
    forceRendering = boolean value,&lt;br /&gt;
    hasWaterPlane = boolean value,&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapRenderingParams&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Allows to change map rendering params at runtime.&amp;lt;br&amp;gt;&amp;quot;Params&amp;quot; table contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  params = {&lt;br /&gt;
    splatTexMults = {number r, number g, number b, number a},&lt;br /&gt;
    splatTexScales = {number r, number g, number b, number a},&lt;br /&gt;
    voidWater = boolean value,&lt;br /&gt;
    voidGround = boolean value,&lt;br /&gt;
    splatDetailNormalDiffuseAlpha = boolean value,&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLogSectionFilterLevel&lt;br /&gt;
|arg1 = {{type|string}} sectionName&lt;br /&gt;
|arg2 = {{type|string}} {{pipe}} {{type|number}} logLevel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&amp;lt;br&amp;gt;See [[infolog.txt]] for possible log sections.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawGroundDeferred&lt;br /&gt;
|arg1 = {{type|bool}} drawGroundDeferred {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} drawGroundForward {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}} {{var|drawGroundForward}} allows disabling of the forward pass&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawModelsDeferred&lt;br /&gt;
|arg1 = {{type|bool}} drawUnitsDeferred &lt;br /&gt;
|arg2 = {{type|bool}} drawFeaturesDeferred {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} drawUnitsForward {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} drawFeaturesForward  {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}} {{var|drawFeaturesForward}}, {{var|drawUnitsForward}} allows disabling of the respective forward passes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetVideoCapturingMode&lt;br /&gt;
|arg1 = {{type|bool}} allowCaptureMode &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;This doesn&#039;t actually record the game in any way, it just regulates the framerate and interpolations.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetVideoCapturingTimeOffset&lt;br /&gt;
|arg1 = {{type|bool}} timeOffset&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|table}} units = { {{bracket|1}} = unitID, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} false&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|table}} units = { {{bracket|unitID}} = arg1, ... } &lt;br /&gt;
|arg2 = {{type|bool}} true&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} cmdName&lt;br /&gt;
|arg2 = {{type|string}} iconFileName {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} overwrite = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} hotSpotTopLeft = false {{rbracket}}{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Changes/creates the cursor of a single CursorCmd. Note, that iconFileName is not the full filename instead it is like this:&amp;lt;br/&amp;gt;Wanted filename: Anims/cursorattack_0.bmp&amp;lt;br/&amp;gt;=&amp;gt; iconFileName: cursorattack&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ReplaceMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} oldFileName&lt;br /&gt;
|arg2 = {{type|string}} newFileName {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} hotSpotTopLeft = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Mass replace all occurrence of the cursor in all CursorCmds.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCustomCommandDrawData&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|number}} cmdID_cloneIcon {{pipe}} {{type|string}} iconname&lt;br /&gt;
|arg3 = {{type|table}} RGBA = { {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a } {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} showArea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Register your custom cmd so it gets visible in the unit&#039;s cmd queue&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCustomCommandDrawData&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|nil}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Register your custom cmd so it gets visible in the unit&#039;s cmd queue&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sharing =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetShareLevel&lt;br /&gt;
|arg1 = {{type|string}} metal {{pipe}} {{type|string}} energy&lt;br /&gt;
|arg2 = {{type|number}} shareLevel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Note: shareLevel is 0&amp;lt;= x &amp;lt;= 1 .&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} units&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} metal {{pipe}} {{type|string}} energy&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= UnitDef RadarIcons &amp;amp; BuildPics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitIcon&lt;br /&gt;
|arg1 = {{type|string}} iconName&lt;br /&gt;
|arg2 = {{type|string}} texFile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} dist {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} radAdjust {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} added&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FreeUnitIcon&lt;br /&gt;
|arg1 = {{type|string}} iconName&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} freed&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDefIcon&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|string}} iconName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Sets radar icon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDefImage&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|string}} luaTexture {{pipe}} {{type|string}} texFile &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Sets buildpic.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Camera =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraState&lt;br /&gt;
|arg1 = {{type|table}} camState&lt;br /&gt;
|arg2 = {{type|number}} camTime&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stateSet&lt;br /&gt;
|info = camState has the same format as the output of Spring.GetCameraState(). See [[Lua_camState]] for details about camState.&amp;lt;br&amp;gt;The camState&#039;s mode/name must fit the rest of the state. Getting a state, changing its mode/name and then passing it to SetCameraState will have undesired results. [https://springrts.com/mantis/view.php?id=5028#c15491] Also see #5028]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraTarget&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} transTime {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = For Spring Engine XZ represents horizontal, from north west corner of map and Y vertical, from water level and rising.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraOffset&lt;br /&gt;
|arg1 = {{type|number}} px = 0 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} py = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} pz = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} tx = 0 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} ty = 0 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tz = 0 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= (Virtual-)FileSystem =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ExtractModArchiveFile&lt;br /&gt;
|arg1 = {{type|string}} modfile&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} extracted&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateDir&lt;br /&gt;
|arg1 = {{type|string}} path&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} dirCreated&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The full VFS API is available at [[Lua_VFS|link]].&lt;br /&gt;
&lt;br /&gt;
= Engine Config =&lt;br /&gt;
&lt;br /&gt;
The following functions read the engine configs saved in [[Springsettings.cfg]], a version-ed instance of these or a custom file supplied on the command line.&lt;br /&gt;
If &#039;&#039;*Overlay&#039;&#039; is &#039;&#039;true&#039;&#039;, the value will only be set in memory, and not be restored for the next game.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigInt&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigFloat&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigString&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= World Primitives =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;outdated! use opengl api instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldIcon&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldText&lt;br /&gt;
|arg1 = {{type|string}} text&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldUnit&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} team&lt;br /&gt;
|arg4 = {{type|number}} facing&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sun  =&lt;br /&gt;
The dynamic Sun must be invoked via /dynamicsun (Dynamic sun was removed in 104.0, use SetSunDirection, SetSunLighting &amp;amp; SetAtmosphere instead).&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunManualControl&lt;br /&gt;
|arg1 = {{type|bool}} setManualControl &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunParameters&lt;br /&gt;
|arg1 = {{type|number}} dirX&lt;br /&gt;
|arg2 = {{type|number}} dirY&lt;br /&gt;
|arg3 = {{type|number}} dirZ&lt;br /&gt;
|arg4 = {{type|number}} dist&lt;br /&gt;
|arg5 = {{type|number}} startTime&lt;br /&gt;
|arg6 = {{type|number}} orbitTime &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunDirection&lt;br /&gt;
|arg1 = {{type|number}} dirX&lt;br /&gt;
|arg2 = {{type|number}} dirY&lt;br /&gt;
|arg3 = {{type|number}} dirZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunLighting&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;It can be used to modify the following sun lighting parameters: &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;     {ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent&lt;br /&gt;
     All Colourvalues have to in the Range from 0.0 to 1.0 for all colors and the alpha&lt;br /&gt;
     Example usage: Spring.SetSunLighting({groundAmbientColor = {1, 0.1, 1}, groundDiffuseColor = {1, 0.1, 1} })&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAtmosphere&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;It can be used to modify the following atmosphere parameters: &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;     fog{Start,End}, {sun,sky,cloud}Color&lt;br /&gt;
     Example usage: Spring.SetAtmosphere({ fogStart = 0, fogEnd   = 0.5, fogColor = { 0.7, 0.2, 0.2, 1 }})&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Reload&lt;br /&gt;
|arg1 = {{type|string}} startscript&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|99.0}}&amp;lt;br&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Restart&lt;br /&gt;
|arg1 = {{type|string}} commandline_args&lt;br /&gt;
|arg2 = {{type|string}} startscript&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|0.79}}&amp;lt;br&amp;gt;If this call returns, something went wrong.&amp;lt;br&amp;gt;&#039;&#039;commandline_args&#039;&#039; are commandline arguments passed to spring executable.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Start&lt;br /&gt;
|arg1 = {{type|string}} commandline_args&lt;br /&gt;
|arg2 = {{type|string}} startscript&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|102.0}}&amp;lt;br&amp;gt;If this call returns, something went wrong.&amp;lt;br&amp;gt;Launches a new Spring instance without terminating the existing one.&amp;lt;br&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start (if empty, no start-script is added, you can still point spring to your custom script.txt when you add the file-path to &#039;&#039;commandline_args&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWMIcon&lt;br /&gt;
|arg1 = {{type|string}} iconFileName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Sets the icon for the process which is seen in the OS task-bar and other places (default: spring-logo).&amp;lt;br/&amp;gt;Note: has to be 24bit or 32bit.&amp;lt;br/&amp;gt;Note: on windows, it has to be 32x32 pixels in size (recommended for cross-platform)&amp;lt;br/&amp;gt;Note: &#039;&#039;*.bmp&#039;&#039; images have to be in BGR format (default for m$ ones).&amp;lt;br/&amp;gt;Note: &#039;&#039;*.ico&#039;&#039; images are not supported.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWMCaption&lt;br /&gt;
|arg1 = {{type|string}} title {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} titleShort = title {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Sets the window &#039;&#039;title&#039;&#039; for the process (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;br&amp;gt;The &#039;&#039;shortTitle&#039;&#039; is displayed in the OS task-bar (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;br&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; &#039;&#039;shortTitle&#039;&#039; is only ever possibly used under X11 (Linux &amp;amp; OS X), but not with QT (KDE) and never under Windows. See [http://www.gpwiki.org/index.php/SDL:Tutorials:Initializing_SDL_Libraries#About_the_icon_.28.22Icon_Title.22.29_parameter_on_different_window-managers this site] for more details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearWatchDogTimer&lt;br /&gt;
|arg1 = {{bracket}} {{type|string}} threadName = main {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetClipboard&lt;br /&gt;
|arg1 = {{type|string}} text&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|98.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Rendering =&lt;br /&gt;
== Preload ==&lt;br /&gt;
Allow the engine to load the unit&#039;s model (and texture) in a background thread. Wreckages and buildOptions of a unit are automatically preloaded.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PreloadUnitDefModel&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PreloadFetureDefModel&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;NOTE: these (0.83+) lighting callouts only work when called from unsynced gadgets!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddMapLight&lt;br /&gt;
|arg1 = {{type|table}} lightParams&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} lightHandle&lt;br /&gt;
|info = (requires MaxDynamicMapLights &amp;amp;gt; 0)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddModelLight&lt;br /&gt;
|arg1 = {{type|table}} lightParams&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} lightHandle&lt;br /&gt;
|info = (requires MaxDynamicMapLights &amp;amp;gt; 0)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UpdateMapLight&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|table}} lightParams&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UpdateModelLight&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|table}} lightParams&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapLightTrackingState&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|number}} unitOrProjectileID&lt;br /&gt;
|arg3 = {{type|bool}} enableTracking&lt;br /&gt;
|arg4 = {{type|bool}} unitOrProjectile&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetModelLightTrackingState&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|number}} unitOrProjectileID&lt;br /&gt;
|arg3 = {{type|bool}} enableTracking&lt;br /&gt;
|arg4 = {{type|bool}} unitOrProjectile&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;lightParams&#039;&#039;&#039; is a table that should contain at least one of the following recognized key/value pairs:&lt;br /&gt;
&lt;br /&gt;
    lightParams = {&lt;br /&gt;
        position = {px, py, pz},&lt;br /&gt;
        direction = {dx, dy, dz},&lt;br /&gt;
        ambientColor = {red, green, blue},&lt;br /&gt;
        diffuseColor = {red, green, blue},&lt;br /&gt;
        specularColor = {red, green, blue},&lt;br /&gt;
        intensityWeight = {ambientWeight, diffuseWeight, specularWeight},&lt;br /&gt;
&lt;br /&gt;
        -- per-frame decay of ambientColor (spread over TTL frames)&lt;br /&gt;
        ambientDecayRate = {ambientRedDecay, ambientGreenDecay, ambientBlueDecay},&lt;br /&gt;
        -- per-frame decay of diffuseColor (spread over TTL frames)&lt;br /&gt;
        diffuseDecayRate = {diffuseRedDecay, diffuseGreenDecay, diffuseBlueDecay},&lt;br /&gt;
        -- per-frame decay of specularColor (spread over TTL frames)&lt;br /&gt;
        specularDecayRate = {specularRedDecay, specularGreenDecay, specularBlueDecay},&lt;br /&gt;
        -- *DecayType = 0.0 -&amp;gt; interpret *DecayRate values as linear, else as exponential&lt;br /&gt;
        decayFunctionType = {ambientDecayType, diffuseDecayType, specularDecayType},&lt;br /&gt;
&lt;br /&gt;
        radius = number elmos,&lt;br /&gt;
        fov = number degrees,&lt;br /&gt;
        ttl = number frames,&lt;br /&gt;
        priority = number,&lt;br /&gt;
        ignoreLOS = boolean,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSkyBoxTexture&lt;br /&gt;
|arg1 = {{type|string}} texName&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapShadingTexture&lt;br /&gt;
|arg1 = {{type|string}} texType&lt;br /&gt;
|arg2 = {{type|string}} texName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Example usage: Spring.SetMapShadingTexture(&amp;quot;$ssmf_specular&amp;quot;, &amp;quot;name_of_my_shiny_texture&amp;quot;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapSquareTexture&lt;br /&gt;
|arg1 = {{type|number}} texSqrX&lt;br /&gt;
|arg2 = {{type|number}} texSqrY&lt;br /&gt;
|arg3 = {{type|string}} luaTexName&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapShader&lt;br /&gt;
|arg1 = {{type|number}} standardShaderID&lt;br /&gt;
|arg2 = {{type|number}} deferredShaderID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;The ID&#039;s must refer to valid programs returned by gl.CreateShader. Passing in a value of 0 will cause the respective shader to revert back to its engine default. Custom map shaders that declare a uniform ivec2 named &amp;quot;texSquare&amp;quot; can sample from the default diffuse texture(s), which are always bound to TU 0.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20970</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20970"/>
		<updated>2021-04-19T15:21:41Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Prior to 102.0, entries below marked &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt; require the setting ModUICtrl to be enabled in the users [[springrc]], if you want to use them in unsynced LuaRules/LuaGaia. It is enabled by default in previous versions and removed in 102.0 so you generally don&#039;t need to care.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= UI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLastMessagePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Ingame Console =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Echo&lt;br /&gt;
|arg1 = {{type|arg1}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|arg2}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Useful for debugging.&amp;lt;br&amp;gt; Prints values in the spring chat console.&amp;lt;br&amp;gt; Hint: the default print() writes to STDOUT.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Log&lt;br /&gt;
|arg1 = {{type|string}} section&lt;br /&gt;
|arg2 = {{type|number}} logLevel {{pipe}} {{type|string}} logLevel &lt;br /&gt;
|arg3 = {{type|string}} LogMessage1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} LogMessage2{{bracket}}&lt;br /&gt;
|arg5 = ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Possible values for logLevel are:&lt;br /&gt;
    &amp;quot;debug&amp;quot;   | LOG.DEBUG&lt;br /&gt;
    &amp;quot;info&amp;quot;    | LOG.INFO&lt;br /&gt;
    &amp;quot;notice&amp;quot;  | LOG.NOTICE (engine default) (new in Version 97)&lt;br /&gt;
    &amp;quot;warning&amp;quot; | LOG.WARNING&lt;br /&gt;
    &amp;quot;error&amp;quot;   | LOG.ERROR&lt;br /&gt;
    &amp;quot;fatal&amp;quot;   | LOG.FATAL&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = {{type|string}} command1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} command2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = { {{type|string}} command1, {{type|string}} command2, ... }&lt;br /&gt;
|arg2 =&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|string}} action {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} actionExtra {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|number}} cmdIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} button = 1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} leftClick {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} rightClick {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} alt {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} ctrl {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} meta {{bracket}}&lt;br /&gt;
|arg8 = {{type|bool}} shift {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCmdColorsConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCtrlPanelConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ForceLayoutUpdate&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSelectionInfo&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Disables the &amp;quot;Selected Units x&amp;quot; box in the GUI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Mouse ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} cursorName {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scale {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = WarpMouse&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== LOS Colors ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLosViewColors&lt;br /&gt;
|arg1 = {{type|table}} always = {r,g,b}&lt;br /&gt;
|arg2 = {{type|table}} LOS = {r,g,b}&lt;br /&gt;
|arg3 = {{type|table}} radar = {r,g,b}&lt;br /&gt;
|arg4 = {{type|table}} jam = {r,g,b}&lt;br /&gt;
|arg5 = {{type|table}} radar2 = {r,g,b}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;New arguments since 100.0 (radar2 is the inside of radar edge). Arguments for 99.0 and before:&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;( table reds = { number always, number LOS, number radar, number jam }, &lt;br /&gt;
    table greens = { number always, number LOS, number radar, number jam },&lt;br /&gt;
    table blues = { number always, number LOS, number radar, number jam } ) -&amp;gt; nil&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SendMessage ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessage&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToPlayer&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToSpectators&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;PLAYER#&amp;gt; (with # being a playerid) inside the string will be replaced with the players name - i.e. :&amp;lt;br&amp;gt;Spring.SendMessage (&amp;quot;&amp;lt;PLAYER1&amp;gt; did something&amp;quot;)&amp;lt;br&amp;gt;might display as &amp;quot;ProRusher did something&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddPoint&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} text = &amp;quot;&amp;quot; {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} localOnly {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddLine&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} z1&lt;br /&gt;
|arg4 = {{type|number}} x2&lt;br /&gt;
|arg5 = {{type|number}} y2&lt;br /&gt;
|arg6 = {{type|number}} z2&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerErasePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadSoundDef&lt;br /&gt;
|arg1 = {{type|string}} soundfile&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = Loads a SoundDefs file, the format is the same as in `gamedata/sounds.lua`.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundFile&lt;br /&gt;
|arg1 = {{type|string}} soundfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posx {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posy {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} posz {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} speedx{{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} speedy{{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} speedz{{bracket}}&lt;br /&gt;
|arg9 = {{type|number}} {{pipe}} {{type|string}} channel {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} playSound&lt;br /&gt;
|info = Possible arguments for channel argument:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;quot;general&amp;quot; || 0 || nil (default)&lt;br /&gt;
    &amp;quot;battle&amp;quot; || &amp;quot;sfx&amp;quot; | 1&lt;br /&gt;
    &amp;quot;unitreply&amp;quot; || &amp;quot;voice&amp;quot; || 2&lt;br /&gt;
    &amp;quot;userinterface&amp;quot; || &amp;quot;ui&amp;quot; || 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundStream&lt;br /&gt;
|arg1 = {{type|string}} oggfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enqueue {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = Allows to play an Ogg Vorbis (.OGG) compressed sound file.&amp;lt;br&amp;gt; In 83.0 and up multiple sound streams may be played at once.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = StopSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Terminates any SoundStream currently running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PauseSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSoundStreamVolume&lt;br /&gt;
|arg1 = {{type|number}} volume&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= SendLuaMessage =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Very important! (allows synced inter-lua-enviroment communications)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaUIMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = {{type|string}} mode &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Possible modes are:&amp;lt;br&amp;gt;&amp;quot;s&amp;quot;/&amp;quot;specs&amp;quot; &amp;amp; &amp;quot;a&amp;quot;/&amp;quot;allies&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaGaiaMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaRulesMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendSkirmishAIMessage&lt;br /&gt;
|arg1 = {{type|number}} aiTeam&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} ai_processed, { {{bracket|1}} = {{type|string}} response1, ... }&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Note there is nothing in this table due to &amp;quot;limitations&amp;quot; of the AI interface.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Units =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLeaveTracks&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} leavetracks &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Selection ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SelectUnitMap&lt;br /&gt;
|arg1 = { {{bracket|unitID}} = anything, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} append {{rbacket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SelectUnitArray&lt;br /&gt;
|arg1 = { {{bracket|1}} = unitID1, {{bracket|2}} = unitID2, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} append {{rbacket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSelectionInfo&lt;br /&gt;
|arg1 = {{type|bool}} drawSelectionInfo&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Group ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitGroup&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} groupID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Give Order ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrder&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg3 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Gives order to all selected units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = {{type|table}} unitMap = { {{bracket|unitID}} = arg1, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = {{type|table}} unitArray = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = {{type|table}} params = {number, etc...}&lt;br /&gt;
|arg4 = {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = {{type|table}} unitMap = { {{bracket|unitID}} = arg1, etc... }&lt;br /&gt;
|arg2 = {{type|table}} orderArray = { {{type|number}} cmdID, {{type|table}} params = {number, etc...}, {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = {{type|table}} unitArray = { {{bracket|11}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = {{type|table}} orderArray = { {{type|number}} cmdID, {{type|table}} params = {number, etc...}, {{type|table}} options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} pairwise {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;quot;pairwise&amp;quot; paramater ({{new|89.0}}) is used to send multiple units a single individual command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} facing &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetBuildSpacing&lt;br /&gt;
|arg1 = {{type|number}} spacing &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit NoDraw,NoSelect,NoMinimap ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoDraw&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noDraw&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoSelect&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNoMinimap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} noMinimap&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureFade&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} allow&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Control whether a feature will fade or not when zoomed out.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoDraw&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noDraw&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureSelectionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSky&lt;br /&gt;
|arg1 = {{type|bool}} drawSky &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawWater&lt;br /&gt;
|arg1 = {{type|bool}} drawWater&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawGround&lt;br /&gt;
|arg1 = {{type|bool}} drawGround &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWaterParams&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 104.0 no longer needs cheating enabled.&amp;lt;br&amp;gt;Allows to change water params (mostly BumpWater ones) at runtime. You may want to set BumpWaterUseUniforms in your [[springrc]] to 1, then you don&#039;t even need to restart BumpWater via `/water 4`. &amp;quot;Params&amp;quot; table contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  params = {&lt;br /&gt;
    absorb = {number r, number g, number b},&lt;br /&gt;
    baseColor = {number r, number g, number b},&lt;br /&gt;
    minColor = {number r, number g, number b},&lt;br /&gt;
    surfaceColor = {number r, number g, number b},&lt;br /&gt;
    diffuseColor = {number r, number g, number b},&lt;br /&gt;
    specularColor = {number r, number g, number b},&lt;br /&gt;
    planeColor = {number r, number g, number b},&lt;br /&gt;
    texture = string file,&lt;br /&gt;
    foamTexture = string file,&lt;br /&gt;
    normalTexture = string file,&lt;br /&gt;
    damage = number value,&lt;br /&gt;
    repeatX = number value,&lt;br /&gt;
    repeatY = number value,&lt;br /&gt;
    surfaceAlpha = number value,&lt;br /&gt;
    ambientFactor = number value,&lt;br /&gt;
    diffuseFactor = number value,&lt;br /&gt;
    specularFactor = number value,&lt;br /&gt;
    specularPower = number value,&lt;br /&gt;
    fresnelMin = number value,&lt;br /&gt;
    fresnelMax = number value,&lt;br /&gt;
    fresnelPower = number value,&lt;br /&gt;
    reflectionDistortion = number value,&lt;br /&gt;
    blurBase = number value,&lt;br /&gt;
    blurExponent = number value,&lt;br /&gt;
    perlinStartFreq = number value,&lt;br /&gt;
    perlinLacunarity = number value,&lt;br /&gt;
    perlinAmplitude = number value,&lt;br /&gt;
    numTiles = number value,&lt;br /&gt;
    shoreWaves = boolean value,&lt;br /&gt;
    forceRendering = boolean value,&lt;br /&gt;
    hasWaterPlane = boolean value,&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapRenderingParams&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Allows to change map rendering params at runtime.&amp;lt;br&amp;gt;&amp;quot;Params&amp;quot; table contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  params = {&lt;br /&gt;
    splatTexMults = {number r, number g, number b, number a},&lt;br /&gt;
    splatTexScales = {number r, number g, number b, number a},&lt;br /&gt;
    voidWater = boolean value,&lt;br /&gt;
    voidGround = boolean value,&lt;br /&gt;
    splatDetailNormalDiffuseAlpha = boolean value,&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLogSectionFilterLevel&lt;br /&gt;
|arg1 = {{type|string}} sectionName&lt;br /&gt;
|arg2 = {{type|string}} {{pipe}} {{type|number}} logLevel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&amp;lt;br&amp;gt;See [[infolog.txt]] for possible log sections.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawGroundDeferred&lt;br /&gt;
|arg1 = {{type|bool}} drawGroundDeferred {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} drawGroundForward {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}} {{var|drawGroundForward}} allows disabling of the forward pass&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawModelsDeferred&lt;br /&gt;
|arg1 = {{type|bool}} drawUnitsDeferred &lt;br /&gt;
|arg2 = {{type|bool}} drawFeaturesDeferred {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} drawUnitsForward {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} drawFeaturesForward  {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}} {{var|drawFeaturesForward}}, {{var|drawUnitsForward}} allows disabling of the respective forward passes&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetVideoCapturingMode&lt;br /&gt;
|arg1 = {{type|bool}} allowCaptureMode &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;This doesn&#039;t actually record the game in any way, it just regulates the framerate and interpolations.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetVideoCapturingTimeOffset&lt;br /&gt;
|arg1 = {{type|bool}} timeOffset&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|table}} units = { {{bracket|1}} = unitID, ... } {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} false&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DrawUnitCommands&lt;br /&gt;
|arg1 = {{type|table}} units = { {{bracket|unitID}} = arg1, ... } &lt;br /&gt;
|arg2 = {{type|bool}} true&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamColor&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} r&lt;br /&gt;
|arg3 = {{type|number}} g&lt;br /&gt;
|arg4 = {{type|number}} b&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} cmdName&lt;br /&gt;
|arg2 = {{type|string}} iconFileName {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} overwrite = true {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} hotSpotTopLeft = false {{rbracket}}{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Changes/creates the cursor of a single CursorCmd. Note, that iconFileName is not the full filename instead it is like this:&amp;lt;br/&amp;gt;Wanted filename: Anims/cursorattack_0.bmp&amp;lt;br/&amp;gt;=&amp;gt; iconFileName: cursorattack&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ReplaceMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} oldFileName&lt;br /&gt;
|arg2 = {{type|string}} newFileName {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} hotSpotTopLeft = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Mass replace all occurrence of the cursor in all CursorCmds.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCustomCommandDrawData&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|number}} cmdID_cloneIcon {{pipe}} {{type|string}} iconname&lt;br /&gt;
|arg3 = {{type|table}} RGBA = { {{type|number}} r, {{type|number}} g, {{type|number}} b, {{type|number}} a } {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} showArea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Register your custom cmd so it gets visible in the unit&#039;s cmd queue&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCustomCommandDrawData&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|nil}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} assigned&lt;br /&gt;
|info = Register your custom cmd so it gets visible in the unit&#039;s cmd queue&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sharing =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetShareLevel&lt;br /&gt;
|arg1 = {{type|string}} metal {{pipe}} {{type|string}} energy&lt;br /&gt;
|arg2 = {{type|number}} shareLevel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Note: shareLevel is 0&amp;lt;= x &amp;lt;= 1 .&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} units&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} metal {{pipe}} {{type|string}} energy&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= UnitDef RadarIcons &amp;amp; BuildPics =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitIcon&lt;br /&gt;
|arg1 = {{type|string}} iconName&lt;br /&gt;
|arg2 = {{type|string}} texFile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} size {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} dist {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} radAdjust {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} added&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FreeUnitIcon&lt;br /&gt;
|arg1 = {{type|string}} iconName&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} freed&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDefIcon&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|string}} iconName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Sets radar icon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDefImage&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|string}} luaTexture {{pipe}} {{type|string}} texFile &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Sets buildpic.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Camera =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraState&lt;br /&gt;
|arg1 = {{type|table}} camState&lt;br /&gt;
|arg2 = {{type|number}} camTime&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stateSet&lt;br /&gt;
|info = camState has the same format as the output of Spring.GetCameraState(). See [[Lua_camState]] for details about camState.&amp;lt;br&amp;gt;The camState&#039;s mode/name must fit the rest of the state. Getting a state, changing its mode/name and then passing it to SetCameraState will have undesired results. [https://springrts.com/mantis/view.php?id=5028#c15491] Also see #5028]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraTarget&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} transTime {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = For Spring Engine XZ represents horizontal, from north west corner of map and Y vertical, from water level and rising.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetCameraOffset&lt;br /&gt;
|arg1 = {{type|number}} px = 0 {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} py = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} pz = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} tx = 0 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} ty = 0 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tz = 0 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= (Virtual-)FileSystem =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ExtractModArchiveFile&lt;br /&gt;
|arg1 = {{type|string}} modfile&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} extracted&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateDir&lt;br /&gt;
|arg1 = {{type|string}} path&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} dirCreated&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The full VFS API is available at [[Lua_VFS|link]].&lt;br /&gt;
&lt;br /&gt;
= Engine Config =&lt;br /&gt;
&lt;br /&gt;
The following functions read the engine configs saved in [[Springsettings.cfg]], a version-ed instance of these or a custom file supplied on the command line.&lt;br /&gt;
If &#039;&#039;*Overlay&#039;&#039; is &#039;&#039;true&#039;&#039;, the value will only be set in memory, and not be restored for the next game.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigInt&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigFloat&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetConfigString&lt;br /&gt;
|arg1 = {{type|string}} name&lt;br /&gt;
|arg2 = {{type|number}} value {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useOverlay = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= World Primitives =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;outdated! use opengl api instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldIcon&lt;br /&gt;
|arg1 = {{type|number}} cmdID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldText&lt;br /&gt;
|arg1 = {{type|string}} text&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddWorldUnit&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} team&lt;br /&gt;
|arg4 = {{type|number}} facing&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sun  =&lt;br /&gt;
The dynamic Sun must be invoked via /dynamicsun (Dynamic sun was removed in 104.0, use SetSunDirection, SetSunLighting &amp;amp; SetAtmosphere instead).&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunManualControl&lt;br /&gt;
|arg1 = {{type|bool}} setManualControl &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunParameters&lt;br /&gt;
|arg1 = {{type|number}} dirX&lt;br /&gt;
|arg2 = {{type|number}} dirY&lt;br /&gt;
|arg3 = {{type|number}} dirZ&lt;br /&gt;
|arg4 = {{type|number}} dist&lt;br /&gt;
|arg5 = {{type|number}} startTime&lt;br /&gt;
|arg6 = {{type|number}} orbitTime &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{removed|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunDirection&lt;br /&gt;
|arg1 = {{type|number}} dirX&lt;br /&gt;
|arg2 = {{type|number}} dirY&lt;br /&gt;
|arg3 = {{type|number}} dirZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSunLighting&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;It can be used to modify the following sun lighting parameters: &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;     {ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent&lt;br /&gt;
     All Colourvalues have to in the Range from 0.0 to 1.0 for all colors and the alpha&lt;br /&gt;
     Example usage: Spring.SetSunLighting({groundAmbientColor = {1, 0.1, 1}, groundDiffuseColor = {1, 0.1, 1} })&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAtmosphere&lt;br /&gt;
|arg1 = {{type|table}} params&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;It can be used to modify the following atmosphere parameters: &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;     fog{Start,End}, {sun,sky,cloud}Color&lt;br /&gt;
     Example usage: Spring.SetAtmosphere({ fogStart = 0, fogEnd   = 0.5, fogColor = { 0.7, 0.2, 0.2, 1 }})&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Reload&lt;br /&gt;
|arg1 = {{type|string}} startscript&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|99.0}}&amp;lt;br&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Restart&lt;br /&gt;
|arg1 = {{type|string}} commandline_args&lt;br /&gt;
|arg2 = {{type|string}} startscript&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|0.79}}&amp;lt;br&amp;gt;If this call returns, something went wrong.&amp;lt;br&amp;gt;&#039;&#039;commandline_args&#039;&#039; are commandline arguments passed to spring executable.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Start&lt;br /&gt;
|arg1 = {{type|string}} commandline_args&lt;br /&gt;
|arg2 = {{type|string}} startscript&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = -&lt;br /&gt;
|info = {{new|102.0}}&amp;lt;br&amp;gt;If this call returns, something went wrong.&amp;lt;br&amp;gt;Launches a new Spring instance without terminating the existing one.&amp;lt;br&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start (if empty, no start-script is added, you can still point spring to your custom script.txt when you add the file-path to &#039;&#039;commandline_args&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWMIcon&lt;br /&gt;
|arg1 = {{type|string}} iconFileName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Sets the icon for the process which is seen in the OS task-bar and other places (default: spring-logo).&amp;lt;br/&amp;gt;Note: has to be 24bit or 32bit.&amp;lt;br/&amp;gt;Note: on windows, it has to be 32x32 pixels in size (recommended for cross-platform)&amp;lt;br/&amp;gt;Note: &#039;&#039;*.bmp&#039;&#039; images have to be in BGR format (default for m$ ones).&amp;lt;br/&amp;gt;Note: &#039;&#039;*.ico&#039;&#039; images are not supported.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetWMCaption&lt;br /&gt;
|arg1 = {{type|string}} title {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} titleShort = title {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;Sets the window &#039;&#039;title&#039;&#039; for the process (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;br&amp;gt;The &#039;&#039;shortTitle&#039;&#039; is displayed in the OS task-bar (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;br&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; &#039;&#039;shortTitle&#039;&#039; is only ever possibly used under X11 (Linux &amp;amp; OS X), but not with QT (KDE) and never under Windows. See [http://www.gpwiki.org/index.php/SDL:Tutorials:Initializing_SDL_Libraries#About_the_icon_.28.22Icon_Title.22.29_parameter_on_different_window-managers this site] for more details.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearWatchDogTimer&lt;br /&gt;
|arg1 = {{bracket}} {{type|string}} threadName = main {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetClipboard&lt;br /&gt;
|arg1 = {{type|string}} text&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{new|98.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Rendering =&lt;br /&gt;
== Preload ==&lt;br /&gt;
Allow the engine to load the unit&#039;s model (and texture) in a background thread. Wreckages and buildOptions of a unit are automatically preloaded.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PreloadUnitDefModel&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PreloadFetureDefModel&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = {{{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;NOTE: these (0.83+) lighting callouts only work when called from unsynced gadgets!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddMapLight&lt;br /&gt;
|arg1 = {{type|table}} lightParams&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} lightHandle&lt;br /&gt;
|info = (requires MaxDynamicMapLights &amp;amp;gt; 0)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddModelLight&lt;br /&gt;
|arg1 = {{type|table}} lightParams&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} lightHandle&lt;br /&gt;
|info = (requires MaxDynamicMapLights &amp;amp;gt; 0)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UpdateMapLight&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|table}} lightParams&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UpdateModelLight&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|table}} lightParams&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapLightTrackingState&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|number}} unitOrProjectileID&lt;br /&gt;
|arg3 = {{type|bool}} enableTracking&lt;br /&gt;
|arg4 = {{type|bool}} unitOrProjectile&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetModelLightTrackingState&lt;br /&gt;
|arg1 = {{type|number}} lightHandle&lt;br /&gt;
|arg2 = {{type|number}} unitOrProjectileID&lt;br /&gt;
|arg3 = {{type|bool}} enableTracking&lt;br /&gt;
|arg4 = {{type|bool}} unitOrProjectile&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;lightParams&#039;&#039;&#039; is a table that should contain at least one of the following recognized key/value pairs:&lt;br /&gt;
&lt;br /&gt;
    lightParams = {&lt;br /&gt;
        position = {px, py, pz},&lt;br /&gt;
        direction = {dx, dy, dz},&lt;br /&gt;
        ambientColor = {red, green, blue},&lt;br /&gt;
        diffuseColor = {red, green, blue},&lt;br /&gt;
        specularColor = {red, green, blue},&lt;br /&gt;
        intensityWeight = {ambientWeight, diffuseWeight, specularWeight},&lt;br /&gt;
&lt;br /&gt;
        -- per-frame decay of ambientColor (spread over TTL frames)&lt;br /&gt;
        ambientDecayRate = {ambientRedDecay, ambientGreenDecay, ambientBlueDecay},&lt;br /&gt;
        -- per-frame decay of diffuseColor (spread over TTL frames)&lt;br /&gt;
        diffuseDecayRate = {diffuseRedDecay, diffuseGreenDecay, diffuseBlueDecay},&lt;br /&gt;
        -- per-frame decay of specularColor (spread over TTL frames)&lt;br /&gt;
        specularDecayRate = {specularRedDecay, specularGreenDecay, specularBlueDecay},&lt;br /&gt;
        -- *DecayType = 0.0 -&amp;gt; interpret *DecayRate values as linear, else as exponential&lt;br /&gt;
        decayFunctionType = {ambientDecayType, diffuseDecayType, specularDecayType},&lt;br /&gt;
&lt;br /&gt;
        radius = number elmos,&lt;br /&gt;
        fov = number degrees,&lt;br /&gt;
        ttl = number frames,&lt;br /&gt;
        priority = number,&lt;br /&gt;
        ignoreLOS = boolean,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSkyBoxTexture&lt;br /&gt;
|arg1 = {{type|string}} texName&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapShadingTexture&lt;br /&gt;
|arg1 = {{type|string}} texType&lt;br /&gt;
|arg2 = {{type|string}} texName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Example usage: Spring.SetMapShadingTexture(&amp;quot;$ssmf_specular&amp;quot;, &amp;quot;name_of_my_shiny_texture&amp;quot;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapSquareTexture&lt;br /&gt;
|arg1 = {{type|number}} texSqrX&lt;br /&gt;
|arg2 = {{type|number}} texSqrY&lt;br /&gt;
|arg3 = {{type|string}} luaTexName&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapShader&lt;br /&gt;
|arg1 = {{type|number}} standardShaderID&lt;br /&gt;
|arg2 = {{type|number}} deferredShaderID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;The ID&#039;s must refer to valid programs returned by gl.CreateShader. Passing in a value of 0 will cause the respective shader to revert back to its engine default. Custom map shaders that declare a uniform ivec2 named &amp;quot;texSquare&amp;quot; can sample from the default diffuse texture(s), which are always bound to TU 0.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20969</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20969"/>
		<updated>2021-04-18T18:28:10Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Prior to 102.0, entries below marked &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt; require the setting ModUICtrl to be enabled in the users [[springrc]], if you want to use them in unsynced LuaRules/LuaGaia. It is enabled by default in previous versions and removed in 102.0 so you generally don&#039;t need to care.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= UI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLastMessagePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Ingame Console =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Echo&lt;br /&gt;
|arg1 = {{type|arg1}} {{bracket}}&lt;br /&gt;
|arg2 = {{type|arg2}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Useful for debugging.&amp;lt;br&amp;gt; Prints values in the spring chat console.&amp;lt;br&amp;gt; Hint: the default print() writes to STDOUT.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Log&lt;br /&gt;
|arg1 = {{type|string}} section&lt;br /&gt;
|arg2 = {{type|number}} logLevel {{pipe}} {{type|string}} logLevel &lt;br /&gt;
|arg3 = {{type|string}} LogMessage1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} LogMessage2{{bracket}}&lt;br /&gt;
|arg5 = ... {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Possible values for logLevel are:&lt;br /&gt;
    &amp;quot;debug&amp;quot;   | LOG.DEBUG&lt;br /&gt;
    &amp;quot;info&amp;quot;    | LOG.INFO&lt;br /&gt;
    &amp;quot;notice&amp;quot;  | LOG.NOTICE (engine default) (new in Version 97)&lt;br /&gt;
    &amp;quot;warning&amp;quot; | LOG.WARNING&lt;br /&gt;
    &amp;quot;error&amp;quot;   | LOG.ERROR&lt;br /&gt;
    &amp;quot;fatal&amp;quot;   | LOG.FATAL&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = {{type|string}} command1 {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} command2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|...}} {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendCommands&lt;br /&gt;
|arg1 = { {{type|string}} command1, {{type|string}} command2, ... }&lt;br /&gt;
|arg2 =&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|string}} action {{bracket}}&lt;br /&gt;
|arg2 = {{type|string}} actionExtra {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetActiveCommand&lt;br /&gt;
|arg1 = {{type|number}} cmdIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} button = 1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} leftClick {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} rightClick {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} alt {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} ctrl {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} meta {{bracket}}&lt;br /&gt;
|arg8 = {{type|bool}} shift {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} commandSet&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCmdColorsConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadCtrlPanelConfig&lt;br /&gt;
|arg1 = {{type|string}} config &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ForceLayoutUpdate&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetDrawSelectionInfo&lt;br /&gt;
|arg1 = {{type|bool}} enable&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Disables the &amp;quot;Selected Units x&amp;quot; box in the GUI.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Mouse ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMouseCursor&lt;br /&gt;
|arg1 = {{type|string}} cursorName {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scale {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = WarpMouse&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== LOS Colors ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLosViewColors&lt;br /&gt;
|arg1 = {{type|table}} always = {r,g,b}&lt;br /&gt;
|arg2 = {{type|table}} LOS = {r,g,b}&lt;br /&gt;
|arg3 = {{type|table}} radar = {r,g,b}&lt;br /&gt;
|arg4 = {{type|table}} jam = {r,g,b}&lt;br /&gt;
|arg5 = {{type|table}} radar2 = {r,g,b}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;New arguments since 100.0 (radar2 is the inside of radar edge). Arguments for 99.0 and before:&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;( table reds = { number always, number LOS, number radar, number jam }, &lt;br /&gt;
    table greens = { number always, number LOS, number radar, number jam },&lt;br /&gt;
    table blues = { number always, number LOS, number radar, number jam } ) -&amp;gt; nil&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SendMessage ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessage&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToPlayer&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|string}} message&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendMessageToSpectators&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;PLAYER#&amp;gt; (with # being a playerid) inside the string will be replaced with the players name - i.e. :&amp;lt;br&amp;gt;Spring.SendMessage (&amp;quot;&amp;lt;PLAYER1&amp;gt; did something&amp;quot;)&amp;lt;br&amp;gt;might display as &amp;quot;ProRusher did something&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddPoint&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|string}} text = &amp;quot;&amp;quot; {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} localOnly {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerAddLine&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} y1&lt;br /&gt;
|arg3 = {{type|number}} z1&lt;br /&gt;
|arg4 = {{type|number}} x2&lt;br /&gt;
|arg5 = {{type|number}} y2&lt;br /&gt;
|arg6 = {{type|number}} z2&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = MarkerErasePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LoadSoundDef&lt;br /&gt;
|arg1 = {{type|string}} soundfile&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = Loads a SoundDefs file, the format is the same as in `gamedata/sounds.lua`.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundFile&lt;br /&gt;
|arg1 = {{type|string}} soundfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posx {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posy {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} posz {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} speedx{{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} speedy{{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} speedz{{bracket}}&lt;br /&gt;
|arg9 = {{type|number}} {{pipe}} {{type|string}} channel {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} playSound&lt;br /&gt;
|info = Possible arguments for channel argument:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    &amp;quot;general&amp;quot; || 0 || nil (default)&lt;br /&gt;
    &amp;quot;battle&amp;quot; || &amp;quot;sfx&amp;quot; | 1&lt;br /&gt;
    &amp;quot;unitreply&amp;quot; || &amp;quot;voice&amp;quot; || 2&lt;br /&gt;
    &amp;quot;userinterface&amp;quot; || &amp;quot;ui&amp;quot; || 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PlaySoundStream&lt;br /&gt;
|arg1 = {{type|string}} oggfile {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} volume = 1.0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enqueue {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = Allows to play an Ogg Vorbis (.OGG) compressed sound file.&amp;lt;br&amp;gt; In 83.0 and up multiple sound streams may be played at once.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = StopSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Terminates any SoundStream currently running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = PauseSoundStream&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSoundStreamVolume&lt;br /&gt;
|arg1 = {{type|number}} volume&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= SendLuaMessage =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Very important! (allows synced inter-lua-enviroment communications)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaUIMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = {{type|string}} mode &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;Possible modes are:&amp;lt;br&amp;gt;&amp;quot;s&amp;quot;/&amp;quot;specs&amp;quot; &amp;amp; &amp;quot;a&amp;quot;/&amp;quot;allies&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaGaiaMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SendLuaRulesMsg&lt;br /&gt;
|arg1 = {{type|string}} message&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Needs ModUICtrl.&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
&#039;&#039;&#039;Spring.SendSkirmishAIMessage&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number aiTeam, string message )&lt;br /&gt;
  -&amp;gt; nil | boolean ai_processed, { [1] = string response1, etc... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note there is nothing in this table due to &amp;quot;limitations&amp;quot; of the AI interface.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Units =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLeaveTracks&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number unitID, boolean leavetracks ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSelectionVolumeData&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Selection ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( { [unitID] = anything, ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( { [1] = unitID1 , [2] = unitID2 , ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSelectionInfo&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSelectionInfo ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Group ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitGroup&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number groupID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Give Order ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrder&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;gives order to all selected units&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        params = {number, etc...},&lt;br /&gt;
        options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        params = {number, etc...},&lt;br /&gt;
        options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    },&lt;br /&gt;
    [boolean pairwise]&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;pairwise param ({{new|89.0}}) is used to send multiple units a single individual command&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Facing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Spacing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit NoDraw,NoSelect,NoMinimap ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoDraw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noDraw ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoSelect&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoMinimap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noMinimap ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureFade&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( int featureID, bool allow ) -&amp;gt; nil&lt;br /&gt;
Control whether a feature will fade or not when zoomed out.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoDraw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, boolean noDraw ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureSelectionVolumeData&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSky&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSky ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawWater&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawWater ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawGround&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawGround ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWaterParams&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;As of 104.0 no longer needs cheating enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Allows to change water params (mostly BumpWater ones) at runtime. You may want to set BumpWaterUseUniforms in your [[springrc]] to 1, then you don&#039;t even need to restart BumpWater via `/water 4`.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`params` table may contain:&lt;br /&gt;
  params = {&lt;br /&gt;
    absorb = {number r, number g, number b},&lt;br /&gt;
    baseColor = {number r, number g, number b},&lt;br /&gt;
    minColor = {number r, number g, number b},&lt;br /&gt;
    surfaceColor = {number r, number g, number b},&lt;br /&gt;
    diffuseColor = {number r, number g, number b},&lt;br /&gt;
    specularColor = {number r, number g, number b},&lt;br /&gt;
    planeColor = {number r, number g, number b},&lt;br /&gt;
    texture = string file,&lt;br /&gt;
    foamTexture = string file,&lt;br /&gt;
    normalTexture = string file,&lt;br /&gt;
    damage = number value,&lt;br /&gt;
    repeatX = number value,&lt;br /&gt;
    repeatY = number value,&lt;br /&gt;
    surfaceAlpha = number value,&lt;br /&gt;
    ambientFactor = number value,&lt;br /&gt;
    diffuseFactor = number value,&lt;br /&gt;
    specularFactor = number value,&lt;br /&gt;
    specularPower = number value,&lt;br /&gt;
    fresnelMin = number value,&lt;br /&gt;
    fresnelMax = number value,&lt;br /&gt;
    fresnelPower = number value,&lt;br /&gt;
    reflectionDistortion = number value,&lt;br /&gt;
    blurBase = number value,&lt;br /&gt;
    blurExponent = number value,&lt;br /&gt;
    perlinStartFreq = number value,&lt;br /&gt;
    perlinLacunarity = number value,&lt;br /&gt;
    perlinAmplitude = number value,&lt;br /&gt;
    numTiles = number value,&lt;br /&gt;
    shoreWaves = boolean value,&lt;br /&gt;
    forceRendering = boolean value,&lt;br /&gt;
    hasWaterPlane = boolean value,&lt;br /&gt;
  }&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapRenderingParams&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Allows to change map rendering params at runtime.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`params` table may contain:&lt;br /&gt;
  params = {&lt;br /&gt;
    splatTexMults = {number r, number g, number b, number a},&lt;br /&gt;
    splatTexScales = {number r, number g, number b, number a},&lt;br /&gt;
    voidWater = boolean value,&lt;br /&gt;
    voidGround = boolean value,&lt;br /&gt;
    splatDetailNormalDiffuseAlpha = boolean value,&lt;br /&gt;
  }&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLogSectionFilterLevel&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   ( string sectionName, string|number logLevel )&lt;br /&gt;
see [[infolog.txt]] for possible log sections (?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawGroundDeferred&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
    ( boolean drawGroundDeferred [, boolean drawGroundForward] ) -&amp;gt; nil&lt;br /&gt;
{{new|101.0}} {{var|drawGroundForward}} allows disabling of the forward pass&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawModelsDeferred&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
    (     boolean drawUnitsDeferred,&lt;br /&gt;
          boolean drawFeaturesDeferred&lt;br /&gt;
       [, boolean drawUnitsForward&lt;br /&gt;
       [, boolean drawFeaturesForward ]]&lt;br /&gt;
     ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
{{new|101.0}} {{var|drawFeaturesForward}}, {{var|drawUnitsForward}} allows disabling of the respective forward passes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetVideoCapturingMode&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
   ( boolean allowCaptureMode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t actually record the game in any way, it just regulates the framerate and interpolations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetVideoCapturingTimeOffset&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
   ( number timeOffset ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
&#039;&#039;&#039;Spring.DrawUnitCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
  ( { [1] = unitID, ... } [, false ] ) -&amp;gt; nil&lt;br /&gt;
  ( { [unitID] = anything, ... }, true  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number r, number g, number b ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AssignMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;changes/creates the cursor of a single CursorCmd&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;cmdName&amp;quot;, string &amp;quot;iconFileName&amp;quot;&lt;br /&gt;
    [, boolean overwrite = true [, boolean hotSpotTopLeft = false] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font class=note&amp;gt;Note, that iconFileName is not the full filename instead it is like this:&amp;lt;br/&amp;gt;&lt;br /&gt;
wanted filename: Anims/cursorattack_0.bmp&amp;lt;br/&amp;gt;&lt;br /&gt;
=&amp;gt; iconFileName: cursorattack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ReplaceMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;mass replace all occurrence of the cursor in all CursorCmds&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;oldFileName&amp;quot;, string &amp;quot;newFileName&amp;quot; [, boolean hotSpotTopLeft = false] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCustomCommandDrawData&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;register your custom cmd so it gets visible in the unit&#039;s cmd queue&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number cmdID,&lt;br /&gt;
    number cmdID_cloneIcon | string iconname,&lt;br /&gt;
    { number r, number g, number b, number a } [, boolean showArea ] ) -&amp;gt; nil&lt;br /&gt;
  ( number cmdID, nil) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sharing =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetShareLevel&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: shareLevel is 0&amp;lt;= x &amp;lt;= 1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number shareLevel ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.ShareResources&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number teamID, string &amp;quot;units&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= UnitDef RadarIcons &amp;amp; BuildPics =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName, string texFile [, number size [, number dist [, boolean radAdjust ]]] )&lt;br /&gt;
  -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FreeUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefIcon&#039;&#039;&#039;  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(RadarIcon)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, string iconName ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefImage&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(BuildPic)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, luaTexture | string texFile ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Camera =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;camState has the same format as the output of Spring.GetCameraState(). See [[Lua_camState]] for details about camState. &lt;br /&gt;
&lt;br /&gt;
The camState&#039;s mode/name must fit the rest of the state. Getting a state, changing its mode/name and then passing it to SetCameraState will have undesired results. [https://springrts.com/mantis/view.php?id=5028#c15491 Also see #5028]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [,number transTime] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;For Spring Engine XZ represents horizontal, from north west corner of map and Y vertical, from water level and rising.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraOffset&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( [number px = 0 [, number py = 0 [, number pz = 0&lt;br /&gt;
     [, number tx = 0 [, number ty = 0 [, number tz = 0]]]]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= (Virtual-)FileSystem =&lt;br /&gt;
&#039;&#039;&#039;Spring.ExtractModArchiveFile&#039;&#039;&#039;&lt;br /&gt;
  ( string modfile ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateDir&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string path ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
The full VFS API is available at [[Lua_VFS|link]].&lt;br /&gt;
&lt;br /&gt;
= Engine Config =&lt;br /&gt;
The following functions read the engine configs saved in [[Springsettings.cfg]], a version-ed instance of these or a custom file supplied on the command line.&lt;br /&gt;
If &#039;&#039;*Overlay&#039;&#039; is &#039;&#039;true&#039;&#039;, the value will only be set in memory, and not be restored for the next game&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigInt&#039;&#039;&#039;&lt;br /&gt;
  ( string name, number value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigFloat&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( string name, number value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigString&#039;&#039;&#039;&lt;br /&gt;
  ( string name, string value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= World Primitives =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;outdated! use opengl api instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldText&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot;, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID,&lt;br /&gt;
    number x, number y, number z,&lt;br /&gt;
    number team, number facing) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sun  =&lt;br /&gt;
The dynamic Sun must be invoked via /dynamicsun (Dynamic sun was removed in 104.0, use SetSunDirection, SetSunLighting &amp;amp; SetAtmosphere instead).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunManualControl&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
  ( boolean setManualControl ) - &amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunParameters&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
  ( number dirX, number dirY, number dirZ, number dist, number startTime, number orbitTime ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number dirX, number dirY, number dirZ ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunLighting&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;It can be used to modify the following sun lighting parameters: &lt;br /&gt;
     {ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent&lt;br /&gt;
     All Colourvalues have to in the Range from 0.0 to 1.0 for all colors and the alpha&lt;br /&gt;
     Example usage: Spring.SetSunLighting({groundAmbientColor = {1, 0.1, 1}, groundDiffuseColor = {1, 0.1, 1} })&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetAtmosphere&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;It can be used to modify the following atmosphere parameters:&lt;br /&gt;
     fog{Start,End}, {sun,sky,cloud}Color&lt;br /&gt;
     Example usage: Spring.SetAtmosphere({ fogStart = 0, fogEnd   = 0.5, fogColor = { 0.7, 0.2, 0.2, 1 }})&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Reload&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( string startscript )&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Restart&#039;&#039;&#039; {{new|0.79}}&lt;br /&gt;
  ( string commandline_args, string startscript )&lt;br /&gt;
    -&amp;gt; if this call returns, something went wrong&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;commandline_args&#039;&#039; are commandline arguments passed to spring executable&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Start&#039;&#039;&#039; {{new|102.0}}&lt;br /&gt;
  ( string commandline_args, string startscript )&lt;br /&gt;
    -&amp;gt; if this call returns, something went wrong&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Launches a new Spring instance without terminating the existing one&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start (if empty, no start-script is added, you can still point spring to your custom script.txt when you add the file-path to &#039;&#039;commandline_args&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMIcon&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( string iconFileName ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the icon for the process which is seen in the OS task-bar and other places (default: spring-logo).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: has to be 24bit or 32bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: on windows, it has to be 32x32 pixels in size (recommended for cross-platform)&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.bmp&#039;&#039; images have to be in BGR format (default for m$ ones).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.ico&#039;&#039; images are not supported.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMCaption&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( string title [, string titleShort = title ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the window &#039;&#039;title&#039;&#039; for the process (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;The &#039;&#039;shortTitle&#039;&#039; is displayed in the OS task-bar (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; &#039;&#039;shortTitle&#039;&#039; is only ever possibly used under X11 (Linux &amp;amp; OS X), but not with QT (KDE) and never under Windows. See [http://www.gpwiki.org/index.php/SDL:Tutorials:Initializing_SDL_Libraries#About_the_icon_.28.22Icon_Title.22.29_parameter_on_different_window-managers this site] for more details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ClearWatchDogTimer&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( [ string threadName = main ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetClipboard&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string text) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Rendering =&lt;br /&gt;
== Preload ==&lt;br /&gt;
Allow the engine to load the unit&#039;s model (and texture) in a background thread. Wreckages and buildOptions of a unit are automatically preloaded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PreloadUnitDefModel&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PreloadFetureDefModel&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureDefID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;NOTE: these (0.83+) lighting callouts only work when called from unsynced gadgets!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddMapLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicMapLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&#039;&#039;&#039;Spring.AddModelLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicModelLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateMapLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateModelLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.SetModelLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;lightParams&#039;&#039;&#039; is a table that should contain at least one of the following recognized key/value pairs:&lt;br /&gt;
&lt;br /&gt;
    lightParams = {&lt;br /&gt;
        position = {px, py, pz},&lt;br /&gt;
        direction = {dx, dy, dz},&lt;br /&gt;
        ambientColor = {red, green, blue},&lt;br /&gt;
        diffuseColor = {red, green, blue},&lt;br /&gt;
        specularColor = {red, green, blue},&lt;br /&gt;
        intensityWeight = {ambientWeight, diffuseWeight, specularWeight},&lt;br /&gt;
&lt;br /&gt;
        -- per-frame decay of ambientColor (spread over TTL frames)&lt;br /&gt;
        ambientDecayRate = {ambientRedDecay, ambientGreenDecay, ambientBlueDecay},&lt;br /&gt;
        -- per-frame decay of diffuseColor (spread over TTL frames)&lt;br /&gt;
        diffuseDecayRate = {diffuseRedDecay, diffuseGreenDecay, diffuseBlueDecay},&lt;br /&gt;
        -- per-frame decay of specularColor (spread over TTL frames)&lt;br /&gt;
        specularDecayRate = {specularRedDecay, specularGreenDecay, specularBlueDecay},&lt;br /&gt;
        -- *DecayType = 0.0 -&amp;gt; interpret *DecayRate values as linear, else as exponential&lt;br /&gt;
        decayFunctionType = {ambientDecayType, diffuseDecayType, specularDecayType},&lt;br /&gt;
&lt;br /&gt;
        radius = number elmos,&lt;br /&gt;
        fov = number degrees,&lt;br /&gt;
        ttl = number frames,&lt;br /&gt;
        priority = number,&lt;br /&gt;
        ignoreLOS = boolean,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSkyBoxTexture&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string texName ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapShadingTexture&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string texType, string texName ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Example usage: Spring.SetMapShadingTexture(&amp;quot;$ssmf_specular&amp;quot;, &amp;quot;name_of_my_shiny_texture&amp;quot;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  ( number texSqrX, number texSqrY, string luaTexName ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapShader&#039;&#039;&#039; {{101.0}}&lt;br /&gt;
  ( number standardShaderID, number deferredShaderID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;The ID&#039;s must refer to valid programs returned by gl.CreateShader. Passing in a value of 0 will cause the respective shader to revert back to its engine default. Custom map shaders that declare a uniform ivec2 named &amp;quot;texSquare&amp;quot; can sample from the default diffuse texture(s), which are always bound to TU 0.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20968</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20968"/>
		<updated>2021-04-07T21:57:32Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Prior to 102.0, entries below marked &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt; require the setting ModUICtrl to be enabled in the users [[springrc]], if you want to use them in unsynced LuaRules/LuaGaia. It is enabled by default in previous versions and removed in 102.0 so you generally don&#039;t need to care.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= UI =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetLastMessagePosition&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLastMessagePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Ingame Console =&lt;br /&gt;
&#039;&#039;&#039;Spring.Echo&#039;&#039;&#039;&lt;br /&gt;
  ( arg1 [, arg2 [, ... ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Useful for debugging.&amp;lt;br&amp;gt; Prints values in the spring chat console.&amp;lt;br&amp;gt; Hint: the default print() writes to STDOUT.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Log&#039;&#039;&#039;&lt;br /&gt;
  ( string section, int logLevel | string logLevel,&lt;br /&gt;
    arg2 [, arg3 [, ... ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Possible values for logLevel are:&lt;br /&gt;
    &amp;quot;debug&amp;quot;   | LOG.DEBUG&lt;br /&gt;
    &amp;quot;info&amp;quot;    | LOG.INFO&lt;br /&gt;
    &amp;quot;notice&amp;quot;  | LOG.NOTICE (engine default) {{new|97}}&lt;br /&gt;
    &amp;quot;warning&amp;quot; | LOG.WARNING&lt;br /&gt;
    &amp;quot;error&amp;quot;   | LOG.ERROR&lt;br /&gt;
    &amp;quot;fatal&amp;quot;   | LOG.FATAL&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SendCommands&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string command1 [, string command2 [ ... ] ] ) -&amp;gt; nil&lt;br /&gt;
  ( {string command1, string command2, ...} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetActiveCommand&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string action [, string actionExtra ] ) -&amp;gt; nil | boolean&lt;br /&gt;
  ( number cmdIndex [, number button = 1&lt;br /&gt;
    [, boolean leftClick, boolean rightClick,&lt;br /&gt;
     boolean alt, boolean ctrl, boolean meta, boolean shift]] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.LoadCmdColorsConfig&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string config ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.LoadCtrlPanelConfig&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string config ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.ForceLayoutUpdate&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;disables the &amp;quot;Selected Units x&amp;quot; box in the GUI&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Mouse ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMouseCursor&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string cursorName [, number scale ] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.WarpMouse&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== LOS Colors ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLosViewColors&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;New arguments since 100.0 (radar2 is the inside of radar edge):&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( always = {r,g,b}, LOS = {r,g,b}, radar = {r,g,b}, jam = {r,g,b}, radar2 = {r,g,b}) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;Arguments for 99.0 and before:&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( table reds = { number always, number LOS, number radar, number jam }, &lt;br /&gt;
    table greens = { number always, number LOS, number radar, number jam },&lt;br /&gt;
    table blues = { number always, number LOS, number radar, number jam } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== SendMessage ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessage&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToPlayer&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToSpectators&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
Funfact:&lt;br /&gt;
&amp;lt;PLAYER#&amp;gt; (with # being a playerid) inside the string will be replaced with the players name.&lt;br /&gt;
ie&lt;br /&gt;
Spring.SendMessage (&amp;quot;&amp;lt;PLAYER1&amp;gt; did something&amp;quot;)&lt;br /&gt;
might display as &amp;quot;ProRusher did something&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerAddPoint&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, string text = &amp;quot;&amp;quot; [, bool localOnly] ] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerAddLine&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number y1, number z1, number x2, number y2, number z2 ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerErasePosition&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
&#039;&#039;&#039;Spring.LoadSoundDef&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;soundfile&amp;quot; ) -&amp;gt; nil | boolean success&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Loads a SoundDefs file, the format is the same as in `gamedata/sounds.lua`.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PlaySoundFile&#039;&#039;&#039;  &amp;lt;span class=note&amp;gt;Plays WAV or OGG sounds.&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;soundfile&amp;quot; [, number volume = 1.0&lt;br /&gt;
    [, number posx, number posy, number posz &lt;br /&gt;
    [, number speedx, number speedy, number speedz ] ] ], [string/number &amp;lt;span class=note&amp;gt;channel&amp;lt;/span&amp;gt; ] ) -&amp;gt; nil | boolean&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`channel` is new in Spring0.83, and can be one of those:&lt;br /&gt;
    &amp;quot;general&amp;quot; || 0 || nil (default)&lt;br /&gt;
    &amp;quot;battle&amp;quot; || &amp;quot;sfx&amp;quot; | 1&lt;br /&gt;
    &amp;quot;unitreply&amp;quot; || &amp;quot;voice&amp;quot; || 2&lt;br /&gt;
    &amp;quot;userinterface&amp;quot; || &amp;quot;ui&amp;quot; || 3&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PlaySoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;oggfile&amp;quot; [, number volume = 1.0&lt;br /&gt;
    [, bool enqueue ]] ) -&amp;gt; nil | boolean true&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Allow you to play an Ogg Vorbis (.OGG) compressed sound file.&amp;lt;br&amp;gt; In 83.0 and up multiple sound streams may be played at once &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.StopSoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Terminates any SoundStream currently running.&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.PauseSoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSoundStreamVolume&#039;&#039;&#039;&lt;br /&gt;
  ( number volume ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= SendLuaMessage =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Very important! (allows synced inter-lua-enviroment communications)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaUIMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message, string mode ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible modes are:&amp;lt;br&amp;gt;&amp;quot;s&amp;quot;/&amp;quot;specs&amp;quot; &amp;amp; &amp;quot;a&amp;quot;/&amp;quot;allies&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaGaiaMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaRulesMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
&#039;&#039;&#039;Spring.SendSkirmishAIMessage&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number aiTeam, string message )&lt;br /&gt;
  -&amp;gt; nil | boolean ai_processed, { [1] = string response1, etc... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note there is nothing in this table due to &amp;quot;limitations&amp;quot; of the AI interface.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Units =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLeaveTracks&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number unitID, boolean leavetracks ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSelectionVolumeData&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Selection ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( { [unitID] = anything, ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( { [1] = unitID1 , [2] = unitID2 , ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSelectionInfo&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSelectionInfo ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Group ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitGroup&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number groupID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Give Order ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrder&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;gives order to all selected units&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        params = {number, etc...},&lt;br /&gt;
        options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        params = {number, etc...},&lt;br /&gt;
        options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    },&lt;br /&gt;
    [boolean pairwise]&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;pairwise param ({{new|89.0}}) is used to send multiple units a single individual command&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Facing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Spacing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit NoDraw,NoSelect,NoMinimap ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoDraw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noDraw ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoSelect&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoMinimap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noMinimap ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureFade&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( int featureID, bool allow ) -&amp;gt; nil&lt;br /&gt;
Control whether a feature will fade or not when zoomed out.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoDraw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, boolean noDraw ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureSelectionVolumeData&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSky&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSky ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawWater&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawWater ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawGround&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawGround ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWaterParams&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;As of 104.0 no longer needs cheating enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Allows to change water params (mostly BumpWater ones) at runtime. You may want to set BumpWaterUseUniforms in your [[springrc]] to 1, then you don&#039;t even need to restart BumpWater via `/water 4`.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`params` table may contain:&lt;br /&gt;
  params = {&lt;br /&gt;
    absorb = {number r, number g, number b},&lt;br /&gt;
    baseColor = {number r, number g, number b},&lt;br /&gt;
    minColor = {number r, number g, number b},&lt;br /&gt;
    surfaceColor = {number r, number g, number b},&lt;br /&gt;
    diffuseColor = {number r, number g, number b},&lt;br /&gt;
    specularColor = {number r, number g, number b},&lt;br /&gt;
    planeColor = {number r, number g, number b},&lt;br /&gt;
    texture = string file,&lt;br /&gt;
    foamTexture = string file,&lt;br /&gt;
    normalTexture = string file,&lt;br /&gt;
    damage = number value,&lt;br /&gt;
    repeatX = number value,&lt;br /&gt;
    repeatY = number value,&lt;br /&gt;
    surfaceAlpha = number value,&lt;br /&gt;
    ambientFactor = number value,&lt;br /&gt;
    diffuseFactor = number value,&lt;br /&gt;
    specularFactor = number value,&lt;br /&gt;
    specularPower = number value,&lt;br /&gt;
    fresnelMin = number value,&lt;br /&gt;
    fresnelMax = number value,&lt;br /&gt;
    fresnelPower = number value,&lt;br /&gt;
    reflectionDistortion = number value,&lt;br /&gt;
    blurBase = number value,&lt;br /&gt;
    blurExponent = number value,&lt;br /&gt;
    perlinStartFreq = number value,&lt;br /&gt;
    perlinLacunarity = number value,&lt;br /&gt;
    perlinAmplitude = number value,&lt;br /&gt;
    numTiles = number value,&lt;br /&gt;
    shoreWaves = boolean value,&lt;br /&gt;
    forceRendering = boolean value,&lt;br /&gt;
    hasWaterPlane = boolean value,&lt;br /&gt;
  }&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapRenderingParams&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Allows to change map rendering params at runtime.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`params` table may contain:&lt;br /&gt;
  params = {&lt;br /&gt;
    splatTexMults = {number r, number g, number b, number a},&lt;br /&gt;
    splatTexScales = {number r, number g, number b, number a},&lt;br /&gt;
    voidWater = boolean value,&lt;br /&gt;
    voidGround = boolean value,&lt;br /&gt;
    splatDetailNormalDiffuseAlpha = boolean value,&lt;br /&gt;
  }&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLogSectionFilterLevel&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   ( string sectionName, string|number logLevel )&lt;br /&gt;
see [[infolog.txt]] for possible log sections (?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawGroundDeferred&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
    ( boolean drawGroundDeferred [, boolean drawGroundForward] ) -&amp;gt; nil&lt;br /&gt;
{{new|101.0}} {{var|drawGroundForward}} allows disabling of the forward pass&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawModelsDeferred&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
    (     boolean drawUnitsDeferred,&lt;br /&gt;
          boolean drawFeaturesDeferred&lt;br /&gt;
       [, boolean drawUnitsForward&lt;br /&gt;
       [, boolean drawFeaturesForward ]]&lt;br /&gt;
     ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
{{new|101.0}} {{var|drawFeaturesForward}}, {{var|drawUnitsForward}} allows disabling of the respective forward passes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetVideoCapturingMode&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
   ( boolean allowCaptureMode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t actually record the game in any way, it just regulates the framerate and interpolations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetVideoCapturingTimeOffset&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
   ( number timeOffset ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
&#039;&#039;&#039;Spring.DrawUnitCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
  ( { [1] = unitID, ... } [, false ] ) -&amp;gt; nil&lt;br /&gt;
  ( { [unitID] = anything, ... }, true  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number r, number g, number b ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AssignMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;changes/creates the cursor of a single CursorCmd&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;cmdName&amp;quot;, string &amp;quot;iconFileName&amp;quot;&lt;br /&gt;
    [, boolean overwrite = true [, boolean hotSpotTopLeft = false] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font class=note&amp;gt;Note, that iconFileName is not the full filename instead it is like this:&amp;lt;br/&amp;gt;&lt;br /&gt;
wanted filename: Anims/cursorattack_0.bmp&amp;lt;br/&amp;gt;&lt;br /&gt;
=&amp;gt; iconFileName: cursorattack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ReplaceMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;mass replace all occurrence of the cursor in all CursorCmds&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;oldFileName&amp;quot;, string &amp;quot;newFileName&amp;quot; [, boolean hotSpotTopLeft = false] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCustomCommandDrawData&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;register your custom cmd so it gets visible in the unit&#039;s cmd queue&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number cmdID,&lt;br /&gt;
    number cmdID_cloneIcon | string iconname,&lt;br /&gt;
    { number r, number g, number b, number a } [, boolean showArea ] ) -&amp;gt; nil&lt;br /&gt;
  ( number cmdID, nil) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sharing =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetShareLevel&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: shareLevel is 0&amp;lt;= x &amp;lt;= 1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number shareLevel ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.ShareResources&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number teamID, string &amp;quot;units&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= UnitDef RadarIcons &amp;amp; BuildPics =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName, string texFile [, number size [, number dist [, boolean radAdjust ]]] )&lt;br /&gt;
  -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FreeUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefIcon&#039;&#039;&#039;  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(RadarIcon)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, string iconName ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefImage&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(BuildPic)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, luaTexture | string texFile ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Camera =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;camState has the same format as the output of Spring.GetCameraState(). See [[Lua_camState]] for details about camState. &lt;br /&gt;
&lt;br /&gt;
The camState&#039;s mode/name must fit the rest of the state. Getting a state, changing its mode/name and then passing it to SetCameraState will have undesired results. [https://springrts.com/mantis/view.php?id=5028#c15491 Also see #5028]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [,number transTime] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;For Spring Engine XZ represents horizontal, from north west corner of map and Y vertical, from water level and rising.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraOffset&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( [number px = 0 [, number py = 0 [, number pz = 0&lt;br /&gt;
     [, number tx = 0 [, number ty = 0 [, number tz = 0]]]]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= (Virtual-)FileSystem =&lt;br /&gt;
&#039;&#039;&#039;Spring.ExtractModArchiveFile&#039;&#039;&#039;&lt;br /&gt;
  ( string modfile ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateDir&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string path ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
The full VFS API is available at [[Lua_VFS|link]].&lt;br /&gt;
&lt;br /&gt;
= Engine Config =&lt;br /&gt;
The following functions read the engine configs saved in [[Springsettings.cfg]], a version-ed instance of these or a custom file supplied on the command line.&lt;br /&gt;
If &#039;&#039;*Overlay&#039;&#039; is &#039;&#039;true&#039;&#039;, the value will only be set in memory, and not be restored for the next game&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigInt&#039;&#039;&#039;&lt;br /&gt;
  ( string name, number value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigFloat&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( string name, number value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigString&#039;&#039;&#039;&lt;br /&gt;
  ( string name, string value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= World Primitives =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;outdated! use opengl api instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldText&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot;, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID,&lt;br /&gt;
    number x, number y, number z,&lt;br /&gt;
    number team, number facing) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sun  =&lt;br /&gt;
The dynamic Sun must be invoked via /dynamicsun (Dynamic sun was removed in 104.0, use SetSunDirection, SetSunLighting &amp;amp; SetAtmosphere instead).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunManualControl&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
  ( boolean setManualControl ) - &amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunParameters&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
  ( number dirX, number dirY, number dirZ, number dist, number startTime, number orbitTime ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number dirX, number dirY, number dirZ ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunLighting&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;It can be used to modify the following sun lighting parameters: &lt;br /&gt;
     {ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent&lt;br /&gt;
     All Colourvalues have to in the Range from 0.0 to 1.0 for all colors and the alpha&lt;br /&gt;
     Example usage: Spring.SetSunLighting({groundAmbientColor = {1, 0.1, 1}, groundDiffuseColor = {1, 0.1, 1} })&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetAtmosphere&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;It can be used to modify the following atmosphere parameters:&lt;br /&gt;
     fog{Start,End}, {sun,sky,cloud}Color&lt;br /&gt;
     Example usage: Spring.SetAtmosphere({ fogStart = 0, fogEnd   = 0.5, fogColor = { 0.7, 0.2, 0.2, 1 }})&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Reload&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( string startscript )&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Restart&#039;&#039;&#039; {{new|0.79}}&lt;br /&gt;
  ( string commandline_args, string startscript )&lt;br /&gt;
    -&amp;gt; if this call returns, something went wrong&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;commandline_args&#039;&#039; are commandline arguments passed to spring executable&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Start&#039;&#039;&#039; {{new|102.0}}&lt;br /&gt;
  ( string commandline_args, string startscript )&lt;br /&gt;
    -&amp;gt; if this call returns, something went wrong&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Launches a new Spring instance without terminating the existing one&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start (if empty, no start-script is added, you can still point spring to your custom script.txt when you add the file-path to &#039;&#039;commandline_args&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMIcon&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( string iconFileName ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the icon for the process which is seen in the OS task-bar and other places (default: spring-logo).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: has to be 24bit or 32bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: on windows, it has to be 32x32 pixels in size (recommended for cross-platform)&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.bmp&#039;&#039; images have to be in BGR format (default for m$ ones).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.ico&#039;&#039; images are not supported.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMCaption&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( string title [, string titleShort = title ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the window &#039;&#039;title&#039;&#039; for the process (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;The &#039;&#039;shortTitle&#039;&#039; is displayed in the OS task-bar (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; &#039;&#039;shortTitle&#039;&#039; is only ever possibly used under X11 (Linux &amp;amp; OS X), but not with QT (KDE) and never under Windows. See [http://www.gpwiki.org/index.php/SDL:Tutorials:Initializing_SDL_Libraries#About_the_icon_.28.22Icon_Title.22.29_parameter_on_different_window-managers this site] for more details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ClearWatchDogTimer&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( [ string threadName = main ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetClipboard&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string text) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Rendering =&lt;br /&gt;
== Preload ==&lt;br /&gt;
Allow the engine to load the unit&#039;s model (and texture) in a background thread. Wreckages and buildOptions of a unit are automatically preloaded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PreloadUnitDefModel&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PreloadFetureDefModel&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureDefID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;NOTE: these (0.83+) lighting callouts only work when called from unsynced gadgets!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddMapLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicMapLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&#039;&#039;&#039;Spring.AddModelLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicModelLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateMapLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateModelLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.SetModelLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;lightParams&#039;&#039;&#039; is a table that should contain at least one of the following recognized key/value pairs:&lt;br /&gt;
&lt;br /&gt;
    lightParams = {&lt;br /&gt;
        position = {px, py, pz},&lt;br /&gt;
        direction = {dx, dy, dz},&lt;br /&gt;
        ambientColor = {red, green, blue},&lt;br /&gt;
        diffuseColor = {red, green, blue},&lt;br /&gt;
        specularColor = {red, green, blue},&lt;br /&gt;
        intensityWeight = {ambientWeight, diffuseWeight, specularWeight},&lt;br /&gt;
&lt;br /&gt;
        -- per-frame decay of ambientColor (spread over TTL frames)&lt;br /&gt;
        ambientDecayRate = {ambientRedDecay, ambientGreenDecay, ambientBlueDecay},&lt;br /&gt;
        -- per-frame decay of diffuseColor (spread over TTL frames)&lt;br /&gt;
        diffuseDecayRate = {diffuseRedDecay, diffuseGreenDecay, diffuseBlueDecay},&lt;br /&gt;
        -- per-frame decay of specularColor (spread over TTL frames)&lt;br /&gt;
        specularDecayRate = {specularRedDecay, specularGreenDecay, specularBlueDecay},&lt;br /&gt;
        -- *DecayType = 0.0 -&amp;gt; interpret *DecayRate values as linear, else as exponential&lt;br /&gt;
        decayFunctionType = {ambientDecayType, diffuseDecayType, specularDecayType},&lt;br /&gt;
&lt;br /&gt;
        radius = number elmos,&lt;br /&gt;
        fov = number degrees,&lt;br /&gt;
        ttl = number frames,&lt;br /&gt;
        priority = number,&lt;br /&gt;
        ignoreLOS = boolean,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSkyBoxTexture&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string texName ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapShadingTexture&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string texType, string texName ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Example usage: Spring.SetMapShadingTexture(&amp;quot;$ssmf_specular&amp;quot;, &amp;quot;name_of_my_shiny_texture&amp;quot;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  ( number texSqrX, number texSqrY, string luaTexName ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapShader&#039;&#039;&#039; {{101.0}}&lt;br /&gt;
  ( number standardShaderID, number deferredShaderID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;The ID&#039;s must refer to valid programs returned by gl.CreateShader. Passing in a value of 0 will cause the respective shader to revert back to its engine default. Custom map shaders that declare a uniform ivec2 named &amp;quot;texSquare&amp;quot; can sample from the default diffuse texture(s), which are always bound to TU 0.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11816</id>
		<title>Lua SyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11816"/>
		<updated>2021-04-07T21:54:57Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: /* Unit Control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateFeature&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} heading {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} AllyTeamID {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} featureID&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} health&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = {{type|number}} energy {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimTime {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureReclaim&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} reclaimLeft&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} &amp;quot;facing&amp;quot; {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} snapToGround {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMoveCtrl&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is true:&amp;lt;br&amp;gt;{{bracket}}, velVector(x,y,z) -- initial velocity for feature&amp;lt;br&amp;gt;{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is false:&amp;lt;br&amp;gt;{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} primaryAxis {{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}} &lt;br /&gt;
|arg4 = {{type|bool}} relative&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mass&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt; Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CallCOBScript&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} funcID {{pipe}} {{type|string}} funcName&lt;br /&gt;
|arg3 = {{type|number}} retArgs&lt;br /&gt;
|arg4 = COBArg1&lt;br /&gt;
|arg5 = COBArg2&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} returnValue, {{type|number}} retArg1, {{type|number}} retArg2, ...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBScriptID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} funcName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} funcID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} splitData=false {{rbracket}}&lt;br /&gt;
|arg3 = {{type|number}} COBValue {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} param2 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} param3 {{bracket}}&lt;br /&gt;
|arg7 =  {{type|number}} param4 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} result {{pipe}} {{type|number}} result1, {{type|number}} result2&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} COBValue&lt;br /&gt;
|arg3 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param2 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&lt;br /&gt;
Options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
See [[Lua CMDs]] for relevant constants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}{{type|number}} unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = (heightmap[x][z] += height;)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMapFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
Example code:&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc(). The terraform argument is a scaling factor:&amp;lt;br&amp;gt;&lt;br /&gt;
If =0 nothing will be changed (the terraform starts) and if =1 the terraform will be finished.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMeshFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapSquareTerrainType&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} newType&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} oldType&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} typeIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speedTanks = nil {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} speedKBOts = nil {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} speedHovers = nil {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} speedShips = nil {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSquareBuildingMask&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|103.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} metalAmount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;x &amp;amp; z coords are in worldspace/16. metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = EditUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = InsertUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetNoPause&lt;br /&gt;
|arg1 = {{type|bool}} noPause &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitToFeature&lt;br /&gt;
|arg1 = {{type|bool}} tofeature &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = An ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag) [http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetExperienceGrade&lt;br /&gt;
|arg1 = {{type|number}} expGrade {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} ExpPowerScale {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} ExpHealthScale {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} ExpReloadScale {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = expGrade defines how often UnitExperience() will be called.&amp;lt;br&amp;gt;Prior to 104.0 it is based on the following equation:&amp;lt;br&amp;gt;(int) {{bracket}}exp/(exp+1){{rbracket}} / expGrade&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Post 104.0 it is the raw change.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnExplosion&lt;br /&gt;
|arg1 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg2 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg3 = {{type|table}} explosionParams&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean&lt;br /&gt;
&lt;br /&gt;
Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnCEG&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;cegname&amp;quot; | {{type|number}} cegID&lt;br /&gt;
|arg2 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg3 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg4 = {{type|number}} radius = 0&lt;br /&gt;
|arg5 = {{type|number}} damage = 0&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success, {{type|number}} cegID&lt;br /&gt;
|info = cegID new in 95.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnSFX&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} sfxID&lt;br /&gt;
|arg3 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg4 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg5 = {{type|number}} radius = 0&lt;br /&gt;
|arg6 = {{type|number}} damage = 0 {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} absolute {{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnProjectile&lt;br /&gt;
|arg1 = {{type|number}} weaponDefID&lt;br /&gt;
|arg2 = {{type|table}} projectileParams &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} projectileID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DeleteProjectile&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Silently removes projectiles (no explosion).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|string}} targetTypeStr {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|number}} targetType {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIgnoreTrackingError&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} ignore &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIsIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileMoveControl&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Disables engine movecontrol, so lua can fully control the physics.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} posX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} velX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} velY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} velZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCollision&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} grav = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinAngle = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speed = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCEG&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|string}} ceg_name &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} explosionFlags {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinAngle {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} spinVector.x {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} spinVector.y {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} spinVector.z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11815</id>
		<title>Lua SyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11815"/>
		<updated>2021-04-06T08:08:01Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: /* Projectiles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateFeature&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} heading {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} AllyTeamID {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} featureID&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} health&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = {{type|number}} energy {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimTime {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureReclaim&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} reclaimLeft&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} &amp;quot;facing&amp;quot; {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} snapToGround {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMoveCtrl&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is true:&amp;lt;br&amp;gt;{{bracket}}, velVector(x,y,z) -- initial velocity for feature&amp;lt;br&amp;gt;{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is false:&amp;lt;br&amp;gt;{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} primaryAxis {{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}} &lt;br /&gt;
|arg4 = {{type|bool}} relative&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mass&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt; Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CallCOBScript&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} funcID {{pipe}} {{type|string}} funcName&lt;br /&gt;
|arg3 = {{type|number}} retArgs&lt;br /&gt;
|arg4 = COBArg1&lt;br /&gt;
|arg5 = COBArg2&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} returnValue, {{type|number}} retArg1, {{type|number}} retArg2, ...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBScriptID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} funcName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} funcID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} splitData=false {{rbracket}}&lt;br /&gt;
|arg3 = {{type|number}} COBValue {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} param2 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} param3 {{bracket}}&lt;br /&gt;
|arg7 =  {{type|number}} param4 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} result {{pipe}} {{type|number}} result1, {{type|number}} result2&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} COBValue&lt;br /&gt;
|arg3 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param2 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&lt;br /&gt;
Options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
See [[Lua CMDs]] for relevant constants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}{{type|number}} unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = (heightmap[x][z] += height;)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMapFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
Example code:&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc(). The terraform argument is a scaling factor:&amp;lt;br&amp;gt;&lt;br /&gt;
If =0 nothing will be changed (the terraform starts) and if =1 the terraform will be finished.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMeshFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapSquareTerrainType&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} newType&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} oldType&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} typeIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speedTanks = nil {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} speedKBOts = nil {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} speedHovers = nil {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} speedShips = nil {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSquareBuildingMask&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|103.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} metalAmount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;x &amp;amp; z coords are in worldspace/16. metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = EditUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = InsertUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetNoPause&lt;br /&gt;
|arg1 = {{type|bool}} noPause &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitToFeature&lt;br /&gt;
|arg1 = {{type|bool}} tofeature &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = An ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag) [http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetExperienceGrade&lt;br /&gt;
|arg1 = {{type|number}} expGrade {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} ExpPowerScale {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} ExpHealthScale {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} ExpReloadScale {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = expGrade defines how often UnitExperience() will be called.&amp;lt;br&amp;gt;Prior to 104.0 it is based on the following equation:&amp;lt;br&amp;gt;(int) {{bracket}}exp/(exp+1){{rbracket}} / expGrade&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Post 104.0 it is the raw change.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnExplosion&lt;br /&gt;
|arg1 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg2 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg3 = {{type|table}} explosionParams&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean&lt;br /&gt;
&lt;br /&gt;
Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnCEG&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;cegname&amp;quot; | {{type|number}} cegID&lt;br /&gt;
|arg2 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg3 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg4 = {{type|number}} radius = 0&lt;br /&gt;
|arg5 = {{type|number}} damage = 0&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success, {{type|number}} cegID&lt;br /&gt;
|info = cegID new in 95.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnSFX&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} sfxID&lt;br /&gt;
|arg3 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg4 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg5 = {{type|number}} radius = 0&lt;br /&gt;
|arg6 = {{type|number}} damage = 0 {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} absolute {{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnProjectile&lt;br /&gt;
|arg1 = {{type|number}} weaponDefID&lt;br /&gt;
|arg2 = {{type|table}} projectileParams &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} projectileID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DeleteProjectile&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Silently removes projectiles (no explosion).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|string}} targetTypeStr {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|number}} targetType {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIgnoreTrackingError&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} ignore &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIsIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileMoveControl&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Disables engine movecontrol, so lua can fully control the physics.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} posX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} velX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} velY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} velZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCollision&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} grav = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinAngle = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speed = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCEG&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|string}} ceg_name &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} explosionFlags {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinAngle {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} spinVector.x {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} spinVector.y {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} spinVector.z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20967</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20967"/>
		<updated>2021-04-04T20:01:26Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;&lt;br /&gt;
NOTE: Prior to 102.0, entries below marked &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt; require the setting ModUICtrl to be enabled in the users [[springrc]], if you want to use them in unsynced LuaRules/LuaGaia. It is enabled by default in previous versions and removed in 102.0 so you generally don&#039;t need to care.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= UI =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLastMessagePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Ingame Console =&lt;br /&gt;
&#039;&#039;&#039;Spring.Echo&#039;&#039;&#039;&lt;br /&gt;
  ( arg1 [, arg2 [, ... ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Useful for debugging.&amp;lt;br&amp;gt; Prints values in the spring chat console.&amp;lt;br&amp;gt; Hint: the default print() writes to STDOUT.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Log&#039;&#039;&#039;&lt;br /&gt;
  ( string section, int logLevel | string logLevel,&lt;br /&gt;
    arg2 [, arg3 [, ... ] ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Possible values for logLevel are:&lt;br /&gt;
    &amp;quot;debug&amp;quot;   | LOG.DEBUG&lt;br /&gt;
    &amp;quot;info&amp;quot;    | LOG.INFO&lt;br /&gt;
    &amp;quot;notice&amp;quot;  | LOG.NOTICE (engine default) {{new|97}}&lt;br /&gt;
    &amp;quot;warning&amp;quot; | LOG.WARNING&lt;br /&gt;
    &amp;quot;error&amp;quot;   | LOG.ERROR&lt;br /&gt;
    &amp;quot;fatal&amp;quot;   | LOG.FATAL&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SendCommands&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string command1 [, string command2 [ ... ] ] ) -&amp;gt; nil&lt;br /&gt;
  ( {string command1, string command2, ...} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== GUI ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetActiveCommand&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string action [, string actionExtra ] ) -&amp;gt; nil | boolean&lt;br /&gt;
  ( number cmdIndex [, number button = 1&lt;br /&gt;
    [, boolean leftClick, boolean rightClick,&lt;br /&gt;
     boolean alt, boolean ctrl, boolean meta, boolean shift]] ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.LoadCmdColorsConfig&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string config ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.LoadCtrlPanelConfig&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string config ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.ForceLayoutUpdate&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSelectionInfo&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;disables the &amp;quot;Selected Units x&amp;quot; box in the GUI&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Mouse ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMouseCursor&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string cursorName [, number scale ] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.WarpMouse&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== LOS Colors ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLosViewColors&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;New arguments since 100.0 (radar2 is the inside of radar edge):&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( always = {r,g,b}, LOS = {r,g,b}, radar = {r,g,b}, jam = {r,g,b}, radar2 = {r,g,b}) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;Arguments for 99.0 and before:&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( table reds = { number always, number LOS, number radar, number jam }, &lt;br /&gt;
    table greens = { number always, number LOS, number radar, number jam },&lt;br /&gt;
    table blues = { number always, number LOS, number radar, number jam } ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== SendMessage ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessage&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToPlayer&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendMessageToSpectators&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;message&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
Funfact:&lt;br /&gt;
&amp;lt;PLAYER#&amp;gt; (with # being a playerid) inside the string will be replaced with the players name.&lt;br /&gt;
ie&lt;br /&gt;
Spring.SendMessage (&amp;quot;&amp;lt;PLAYER1&amp;gt; did something&amp;quot;)&lt;br /&gt;
might display as &amp;quot;ProRusher did something&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Markers ==&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerAddPoint&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, string text = &amp;quot;&amp;quot; [, bool localOnly] ] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerAddLine&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x1, number y1, number z1, number x2, number y2, number z2 ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.MarkerErasePosition&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sounds =&lt;br /&gt;
&#039;&#039;&#039;Spring.LoadSoundDef&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;soundfile&amp;quot; ) -&amp;gt; nil | boolean success&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Loads a SoundDefs file, the format is the same as in `gamedata/sounds.lua`.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PlaySoundFile&#039;&#039;&#039;  &amp;lt;span class=note&amp;gt;Plays WAV or OGG sounds.&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;soundfile&amp;quot; [, number volume = 1.0&lt;br /&gt;
    [, number posx, number posy, number posz &lt;br /&gt;
    [, number speedx, number speedy, number speedz ] ] ], [string/number &amp;lt;span class=note&amp;gt;channel&amp;lt;/span&amp;gt; ] ) -&amp;gt; nil | boolean&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`channel` is new in Spring0.83, and can be one of those:&lt;br /&gt;
    &amp;quot;general&amp;quot; || 0 || nil (default)&lt;br /&gt;
    &amp;quot;battle&amp;quot; || &amp;quot;sfx&amp;quot; | 1&lt;br /&gt;
    &amp;quot;unitreply&amp;quot; || &amp;quot;voice&amp;quot; || 2&lt;br /&gt;
    &amp;quot;userinterface&amp;quot; || &amp;quot;ui&amp;quot; || 3&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PlaySoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;oggfile&amp;quot; [, number volume = 1.0&lt;br /&gt;
    [, bool enqueue ]] ) -&amp;gt; nil | boolean true&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Allow you to play an Ogg Vorbis (.OGG) compressed sound file.&amp;lt;br&amp;gt; In 83.0 and up multiple sound streams may be played at once &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.StopSoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Terminates any SoundStream currently running.&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.PauseSoundStream&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSoundStreamVolume&#039;&#039;&#039;&lt;br /&gt;
  ( number volume ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= SendLuaMessage =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Very important! (allows synced inter-lua-enviroment communications)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaUIMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message, string mode ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible modes are:&amp;lt;br&amp;gt;&amp;quot;s&amp;quot;/&amp;quot;specs&amp;quot; &amp;amp; &amp;quot;a&amp;quot;/&amp;quot;allies&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaGaiaMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SendLuaRulesMsg&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string message ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= AI =&lt;br /&gt;
&#039;&#039;&#039;Spring.SendSkirmishAIMessage&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number aiTeam, string message )&lt;br /&gt;
  -&amp;gt; nil | boolean ai_processed, { [1] = string response1, etc... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note there is nothing in this table due to &amp;quot;limitations&amp;quot; of the AI interface.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Units =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLeaveTracks&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number unitID, boolean leavetracks ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSelectionVolumeData&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Selection ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( { [unitID] = anything, ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SelectUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( { [1] = unitID1 , [2] = unitID2 , ...} [,boolean append] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSelectionInfo&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSelectionInfo ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Group ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitGroup&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number groupID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Give Order ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrder&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;gives order to all selected units&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        params = {number, etc...},&lt;br /&gt;
        options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        params = {number, etc...},&lt;br /&gt;
        options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
      }, ..&lt;br /&gt;
    },&lt;br /&gt;
    [boolean pairwise]&lt;br /&gt;
  ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;pairwise param ({{new|89.0}}) is used to send multiple units a single individual command&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Facing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetBuildSpacing&#039;&#039;&#039;&lt;br /&gt;
  ( int Spacing ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit NoDraw,NoSelect,NoMinimap ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoDraw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noDraw ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoSelect&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitNoMinimap&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, boolean noMinimap ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureFade&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( int featureID, bool allow ) -&amp;gt; nil&lt;br /&gt;
Control whether a feature will fade or not when zoomed out.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoDraw&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;LuaGadgets only!&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number featureID, boolean noDraw ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureSelectionVolumeData&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawSky&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawSky ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawWater&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawWater ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawGround&#039;&#039;&#039;&lt;br /&gt;
  ( boolean drawGround ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWaterParams&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;As of 104.0 no longer needs cheating enabled&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Allows to change water params (mostly BumpWater ones) at runtime. You may want to set BumpWaterUseUniforms in your [[springrc]] to 1, then you don&#039;t even need to restart BumpWater via `/water 4`.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`params` table may contain:&lt;br /&gt;
  params = {&lt;br /&gt;
    absorb = {number r, number g, number b},&lt;br /&gt;
    baseColor = {number r, number g, number b},&lt;br /&gt;
    minColor = {number r, number g, number b},&lt;br /&gt;
    surfaceColor = {number r, number g, number b},&lt;br /&gt;
    diffuseColor = {number r, number g, number b},&lt;br /&gt;
    specularColor = {number r, number g, number b},&lt;br /&gt;
    planeColor = {number r, number g, number b},&lt;br /&gt;
    texture = string file,&lt;br /&gt;
    foamTexture = string file,&lt;br /&gt;
    normalTexture = string file,&lt;br /&gt;
    damage = number value,&lt;br /&gt;
    repeatX = number value,&lt;br /&gt;
    repeatY = number value,&lt;br /&gt;
    surfaceAlpha = number value,&lt;br /&gt;
    ambientFactor = number value,&lt;br /&gt;
    diffuseFactor = number value,&lt;br /&gt;
    specularFactor = number value,&lt;br /&gt;
    specularPower = number value,&lt;br /&gt;
    fresnelMin = number value,&lt;br /&gt;
    fresnelMax = number value,&lt;br /&gt;
    fresnelPower = number value,&lt;br /&gt;
    reflectionDistortion = number value,&lt;br /&gt;
    blurBase = number value,&lt;br /&gt;
    blurExponent = number value,&lt;br /&gt;
    perlinStartFreq = number value,&lt;br /&gt;
    perlinLacunarity = number value,&lt;br /&gt;
    perlinAmplitude = number value,&lt;br /&gt;
    numTiles = number value,&lt;br /&gt;
    shoreWaves = boolean value,&lt;br /&gt;
    forceRendering = boolean value,&lt;br /&gt;
    hasWaterPlane = boolean value,&lt;br /&gt;
  }&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapRenderingParams&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Allows to change map rendering params at runtime.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`params` table may contain:&lt;br /&gt;
  params = {&lt;br /&gt;
    splatTexMults = {number r, number g, number b, number a},&lt;br /&gt;
    splatTexScales = {number r, number g, number b, number a},&lt;br /&gt;
    voidWater = boolean value,&lt;br /&gt;
    voidGround = boolean value,&lt;br /&gt;
    splatDetailNormalDiffuseAlpha = boolean value,&lt;br /&gt;
  }&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetLogSectionFilterLevel&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   ( string sectionName, string|number logLevel )&lt;br /&gt;
see [[infolog.txt]] for possible log sections (?)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawGroundDeferred&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
    ( boolean drawGroundDeferred [, boolean drawGroundForward] ) -&amp;gt; nil&lt;br /&gt;
{{new|101.0}} {{var|drawGroundForward}} allows disabling of the forward pass&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetDrawModelsDeferred&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
    (     boolean drawUnitsDeferred,&lt;br /&gt;
          boolean drawFeaturesDeferred&lt;br /&gt;
       [, boolean drawUnitsForward&lt;br /&gt;
       [, boolean drawFeaturesForward ]]&lt;br /&gt;
     ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
{{new|101.0}} {{var|drawFeaturesForward}}, {{var|drawUnitsForward}} allows disabling of the respective forward passes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetVideoCapturingMode&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
   ( boolean allowCaptureMode ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t actually record the game in any way, it just regulates the framerate and interpolations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetVideoCapturingTimeOffset&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
   ( number timeOffset ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= GUI =&lt;br /&gt;
&#039;&#039;&#039;Spring.DrawUnitCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil&lt;br /&gt;
  ( { [1] = unitID, ... } [, false ] ) -&amp;gt; nil&lt;br /&gt;
  ( { [unitID] = anything, ... }, true  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTeamColor&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number r, number g, number b ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AssignMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;changes/creates the cursor of a single CursorCmd&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;cmdName&amp;quot;, string &amp;quot;iconFileName&amp;quot;&lt;br /&gt;
    [, boolean overwrite = true [, boolean hotSpotTopLeft = false] ] ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font class=note&amp;gt;Note, that iconFileName is not the full filename instead it is like this:&amp;lt;br/&amp;gt;&lt;br /&gt;
wanted filename: Anims/cursorattack_0.bmp&amp;lt;br/&amp;gt;&lt;br /&gt;
=&amp;gt; iconFileName: cursorattack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ReplaceMouseCursor&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;mass replace all occurrence of the cursor in all CursorCmds&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;oldFileName&amp;quot;, string &amp;quot;newFileName&amp;quot; [, boolean hotSpotTopLeft = false] ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCustomCommandDrawData&#039;&#039;&#039; &amp;lt;font class=note&amp;gt;register your custom cmd so it gets visible in the unit&#039;s cmd queue&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number cmdID,&lt;br /&gt;
    number cmdID_cloneIcon | string iconname,&lt;br /&gt;
    { number r, number g, number b, number a } [, boolean showArea ] ) -&amp;gt; nil&lt;br /&gt;
  ( number cmdID, nil) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sharing =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetShareLevel&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;note: shareLevel is 0&amp;lt;= x &amp;lt;= 1&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number shareLevel ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.ShareResources&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number teamID, string &amp;quot;units&amp;quot; ) -&amp;gt; nil&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= UnitDef RadarIcons &amp;amp; BuildPics =&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName, string texFile [, number size [, number dist [, boolean radAdjust ]]] )&lt;br /&gt;
  -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FreeUnitIcon&#039;&#039;&#039;&lt;br /&gt;
  ( string iconName ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefIcon&#039;&#039;&#039;  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(RadarIcon)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, string iconName ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitDefImage&#039;&#039;&#039;   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(BuildPic)&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, luaTexture | string texFile ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Camera =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraState&#039;&#039;&#039;&lt;br /&gt;
  ( table camState, number camTime) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;camState has the same format as the output of Spring.GetCameraState(). See [[Lua_camState]] for details about camState. &lt;br /&gt;
&lt;br /&gt;
The camState&#039;s mode/name must fit the rest of the state. Getting a state, changing its mode/name and then passing it to SetCameraState will have undesired results. [https://springrts.com/mantis/view.php?id=5028#c15491 Also see #5028]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z [,number transTime] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;For Spring Engine XZ represents horizontal, from north west corner of map and Y vertical, from water level and rising.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetCameraOffset&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( [number px = 0 [, number py = 0 [, number pz = 0&lt;br /&gt;
     [, number tx = 0 [, number ty = 0 [, number tz = 0]]]]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= (Virtual-)FileSystem =&lt;br /&gt;
&#039;&#039;&#039;Spring.ExtractModArchiveFile&#039;&#039;&#039;&lt;br /&gt;
  ( string modfile ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateDir&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(needs ModUICtrl)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( string path ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
The full VFS API is available at [[Lua_VFS|link]].&lt;br /&gt;
&lt;br /&gt;
= Engine Config =&lt;br /&gt;
The following functions read the engine configs saved in [[Springsettings.cfg]], a version-ed instance of these or a custom file supplied on the command line.&lt;br /&gt;
If &#039;&#039;*Overlay&#039;&#039; is &#039;&#039;true&#039;&#039;, the value will only be set in memory, and not be restored for the next game&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigInt&#039;&#039;&#039;&lt;br /&gt;
  ( string name, number value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigFloat&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( string name, number value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetConfigString&#039;&#039;&#039;&lt;br /&gt;
  ( string name, string value [, boolean useOverlay = false] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= World Primitives =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;outdated! use opengl api instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldIcon&#039;&#039;&#039;&lt;br /&gt;
  ( number cmdID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldText&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;text&amp;quot;, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AddWorldUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID,&lt;br /&gt;
    number x, number y, number z,&lt;br /&gt;
    number team, number facing) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Sun  =&lt;br /&gt;
The dynamic Sun must be invoked via /dynamicsun (Dynamic sun was removed in 104.0, use SetSunDirection, SetSunLighting &amp;amp; SetAtmosphere instead).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunManualControl&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
  ( boolean setManualControl ) - &amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunParameters&#039;&#039;&#039; {{removed|104.0}}&lt;br /&gt;
  ( number dirX, number dirY, number dirZ, number dist, number startTime, number orbitTime ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number dirX, number dirY, number dirZ ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSunLighting&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;It can be used to modify the following sun lighting parameters: &lt;br /&gt;
     {ground,unit}{Ambient,Diffuse,Specular}Color and specularExponent&lt;br /&gt;
     All Colourvalues have to in the Range from 0.0 to 1.0 for all colors and the alpha&lt;br /&gt;
     Example usage: Spring.SetSunLighting({groundAmbientColor = {1, 0.1, 1}, groundDiffuseColor = {1, 0.1, 1} })&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetAtmosphere&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( table params ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;It can be used to modify the following atmosphere parameters:&lt;br /&gt;
     fog{Start,End}, {sun,sky,cloud}Color&lt;br /&gt;
     Example usage: Spring.SetAtmosphere({ fogStart = 0, fogEnd   = 0.5, fogColor = { 0.7, 0.2, 0.2, 1 }})&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Reload&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( string startscript )&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Restart&#039;&#039;&#039; {{new|0.79}}&lt;br /&gt;
  ( string commandline_args, string startscript )&lt;br /&gt;
    -&amp;gt; if this call returns, something went wrong&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;commandline_args&#039;&#039; are commandline arguments passed to spring executable&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.Start&#039;&#039;&#039; {{new|102.0}}&lt;br /&gt;
  ( string commandline_args, string startscript )&lt;br /&gt;
    -&amp;gt; if this call returns, something went wrong&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Launches a new Spring instance without terminating the existing one&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;start-script is the CONTENT of the [[script.txt]] spring should use to start (if empty, no start-script is added, you can still point spring to your custom script.txt when you add the file-path to &#039;&#039;commandline_args&#039;&#039;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMIcon&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( string iconFileName ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the icon for the process which is seen in the OS task-bar and other places (default: spring-logo).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: has to be 24bit or 32bit&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: on windows, it has to be 32x32 pixels in size (recommended for cross-platform)&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.bmp&#039;&#039; images have to be in BGR format (default for m$ ones).&amp;lt;br/&amp;gt;&lt;br /&gt;
Note: &#039;&#039;*.ico&#039;&#039; images are not supported.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetWMCaption&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( string title [, string titleShort = title ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Sets the window &#039;&#039;title&#039;&#039; for the process (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;The &#039;&#039;shortTitle&#039;&#039; is displayed in the OS task-bar (default: &amp;quot;Spring &amp;lt;version&amp;gt;&amp;quot;).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; &#039;&#039;shortTitle&#039;&#039; is only ever possibly used under X11 (Linux &amp;amp; OS X), but not with QT (KDE) and never under Windows. See [http://www.gpwiki.org/index.php/SDL:Tutorials:Initializing_SDL_Libraries#About_the_icon_.28.22Icon_Title.22.29_parameter_on_different_window-managers this site] for more details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.ClearWatchDogTimer&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( [ string threadName = main ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetClipboard&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string text) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Rendering =&lt;br /&gt;
== Preload ==&lt;br /&gt;
Allow the engine to load the unit&#039;s model (and texture) in a background thread. Wreckages and buildOptions of a unit are automatically preloaded.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PreloadUnitDefModel&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.PreloadFetureDefModel&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureDefID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;NOTE: these (0.83+) lighting callouts only work when called from unsynced gadgets!&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddMapLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicMapLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&#039;&#039;&#039;Spring.AddModelLight&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(requires MaxDynamicModelLights &amp;amp;gt; 0)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (table lightParams) -&amp;gt; number lightHandle&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateMapLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.UpdateModelLight&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, table lightParams) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&#039;&#039;&#039;Spring.SetModelLightTrackingState&#039;&#039;&#039;&lt;br /&gt;
  (number lightHandle, number unitOrProjectileID,&lt;br /&gt;
   boolean enableTracking, boolean unitOrProjectile) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;lightParams&#039;&#039;&#039; is a table that should contain at least one of the following recognized key/value pairs:&lt;br /&gt;
&lt;br /&gt;
    lightParams = {&lt;br /&gt;
        position = {px, py, pz},&lt;br /&gt;
        direction = {dx, dy, dz},&lt;br /&gt;
        ambientColor = {red, green, blue},&lt;br /&gt;
        diffuseColor = {red, green, blue},&lt;br /&gt;
        specularColor = {red, green, blue},&lt;br /&gt;
        intensityWeight = {ambientWeight, diffuseWeight, specularWeight},&lt;br /&gt;
&lt;br /&gt;
        -- per-frame decay of ambientColor (spread over TTL frames)&lt;br /&gt;
        ambientDecayRate = {ambientRedDecay, ambientGreenDecay, ambientBlueDecay},&lt;br /&gt;
        -- per-frame decay of diffuseColor (spread over TTL frames)&lt;br /&gt;
        diffuseDecayRate = {diffuseRedDecay, diffuseGreenDecay, diffuseBlueDecay},&lt;br /&gt;
        -- per-frame decay of specularColor (spread over TTL frames)&lt;br /&gt;
        specularDecayRate = {specularRedDecay, specularGreenDecay, specularBlueDecay},&lt;br /&gt;
        -- *DecayType = 0.0 -&amp;gt; interpret *DecayRate values as linear, else as exponential&lt;br /&gt;
        decayFunctionType = {ambientDecayType, diffuseDecayType, specularDecayType},&lt;br /&gt;
&lt;br /&gt;
        radius = number elmos,&lt;br /&gt;
        fov = number degrees,&lt;br /&gt;
        ttl = number frames,&lt;br /&gt;
        priority = number,&lt;br /&gt;
        ignoreLOS = boolean,&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
= Map =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSkyBoxTexture&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string texName ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapShadingTexture&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string texType, string texName ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Example usage: Spring.SetMapShadingTexture(&amp;quot;$ssmf_specular&amp;quot;, &amp;quot;name_of_my_shiny_texture&amp;quot;)&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTexture&#039;&#039;&#039;&lt;br /&gt;
  ( number texSqrX, number texSqrY, string luaTexName ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapShader&#039;&#039;&#039; {{101.0}}&lt;br /&gt;
  ( number standardShaderID, number deferredShaderID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;The ID&#039;s must refer to valid programs returned by gl.CreateShader. Passing in a value of 0 will cause the respective shader to revert back to its engine default. Custom map shaders that declare a uniform ivec2 named &amp;quot;texSquare&amp;quot; can sample from the default diffuse texture(s), which are always bound to TU 0.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12067</id>
		<title>Lua SyncedRead</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12067"/>
		<updated>2021-04-04T01:59:05Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: Updated page with new anchorable templates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1&lt;br /&gt;
|info = With x &amp;amp; z in worldspace coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestMoveOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} pos.x {{bracket}}, {{type|number}} pos.y {{bracket}}, {{type|number}} pos.z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} dir.x {{bracket}}, {{type|number}} dir.y {{bracket}}, {{type|number}} dir.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} testTerrain {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} testObjects {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} centerOnly {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} validMove&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestBuildOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} facing&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} blocking {{bracket}}, {{type|number}} featureID {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Pos2BuildPos&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} facing {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitEstimatedPath&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} waypoints, {{type|table}} waypointIndices&lt;br /&gt;
|info =  The table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;table waypoints = {&lt;br /&gt;
   [1] = { x,y,z }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
table waypointIndices= {&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
  GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInRadar&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInRadar&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInAirLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInAirLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPositionLosState&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} allyID {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} LosOrRadar, {{type|bool}} inLos, {{type|bool}} inRadar, {{type|bool}} jammed&lt;br /&gt;
|info = Jammed new in 95.0, indicates if a position is actively being radar- or sonar-jammed by ANY allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetClosestValidPosition&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} r&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = CURRENTLY UNFINISHED! Always returns nil!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} excludeWeaponProjectiles {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} excludePieceProjectiles {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} projectileTable = { {{bracket|1}} = {{type|number}} projectileID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileOwnerID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTeamID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDefID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} weaponDefID&lt;br /&gt;
|info = Using this to get a weaponDefID is HIGHLY preferred to indexing WeaponDefNames via GetProjectileName.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileName&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} name&lt;br /&gt;
|info = It is recommended to rather use GetProjectileDefID for indexing purposes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileType&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} weapon, {{type|bool}} piece&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} targetTypeInt, {{type|number}} targetID {{pipe}} {{type|table}} targetPos = {x, y, z}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Pre version 95.0 return arguments: -&amp;gt; nil | number targetID, string targetTypeStr&lt;br /&gt;
&lt;br /&gt;
  targetTypeStr could be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
&lt;br /&gt;
  while targetTypeInt was one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBeingIntercepted&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|info = {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} gravity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} explosionFlags, {{type|number}} spinAngle, {{type|number}} spinSpeed, {{type|number}} spinVectorX, {{type|number}} spinVectorY, {{type|number}} spinVectorZ&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;ExplosionFlags use binary flags with the following integer equivalents (more info [http://springrts.com/wiki/Animation-CobConstants#explode here] ):&amp;lt;br&amp;gt;SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16, NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTimeToLive&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} ttl&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDirection&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} angle&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} spinSpeed&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} damage&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The string tag can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20966</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20966"/>
		<updated>2021-04-04T01:57:00Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: /* Feature Pieces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1&lt;br /&gt;
|info = With x &amp;amp; z in worldspace coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestMoveOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} pos.x {{bracket}}, {{type|number}} pos.y {{bracket}}, {{type|number}} pos.z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} dir.x {{bracket}}, {{type|number}} dir.y {{bracket}}, {{type|number}} dir.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} testTerrain {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} testObjects {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} centerOnly {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} validMove&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestBuildOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} facing&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} blocking {{bracket}}, {{type|number}} featureID {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Pos2BuildPos&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} facing {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitEstimatedPath&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} waypoints, {{type|table}} waypointIndices&lt;br /&gt;
|info =  The table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;table waypoints = {&lt;br /&gt;
   [1] = { x,y,z }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
table waypointIndices= {&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
  GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInRadar&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInRadar&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInAirLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInAirLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPositionLosState&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} allyID {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} LosOrRadar, {{type|bool}} inLos, {{type|bool}} inRadar, {{type|bool}} jammed&lt;br /&gt;
|info = Jammed new in 95.0, indicates if a position is actively being radar- or sonar-jammed by ANY allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetClosestValidPosition&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} r&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = CURRENTLY UNFINISHED! Always returns nil!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} excludeWeaponProjectiles {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} excludePieceProjectiles {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} projectileTable = { {{bracket|1}} = {{type|number}} projectileID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileOwnerID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTeamID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDefID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} weaponDefID&lt;br /&gt;
|info = Using this to get a weaponDefID is HIGHLY preferred to indexing WeaponDefNames via GetProjectileName.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileName&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} name&lt;br /&gt;
|info = It is recommended to rather use GetProjectileDefID for indexing purposes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileType&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} weapon, {{type|bool}} piece&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} targetTypeInt, {{type|number}} targetID {{pipe}} {{type|table}} targetPos = {x, y, z}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Pre version 95.0 return arguments: -&amp;gt; nil | number targetID, string targetTypeStr&lt;br /&gt;
&lt;br /&gt;
  targetTypeStr could be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
&lt;br /&gt;
  while targetTypeInt was one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBeingIntercepted&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|info = {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} gravity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} explosionFlags, {{type|number}} spinAngle, {{type|number}} spinSpeed, {{type|number}} spinVectorX, {{type|number}} spinVectorY, {{type|number}} spinVectorZ&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;ExplosionFlags use binary flags with the following integer equivalents (more info [http://springrts.com/wiki/Animation-CobConstants#explode here] ):&amp;lt;br&amp;gt;SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16, NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTimeToLive&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} ttl&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDirection&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} angle&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} spinSpeed&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} damage&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The string tag can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20965</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20965"/>
		<updated>2021-04-04T01:55:21Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: /* Unit Pieces */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1&lt;br /&gt;
|info = With x &amp;amp; z in worldspace coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestMoveOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} pos.x {{bracket}}, {{type|number}} pos.y {{bracket}}, {{type|number}} pos.z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} dir.x {{bracket}}, {{type|number}} dir.y {{bracket}}, {{type|number}} dir.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} testTerrain {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} testObjects {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} centerOnly {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} validMove&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestBuildOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} facing&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} blocking {{bracket}}, {{type|number}} featureID {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Pos2BuildPos&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} facing {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitEstimatedPath&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} waypoints, {{type|table}} waypointIndices&lt;br /&gt;
|info =  The table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;table waypoints = {&lt;br /&gt;
   [1] = { x,y,z }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
table waypointIndices= {&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
  GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInRadar&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInRadar&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInAirLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInAirLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPositionLosState&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} allyID {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} LosOrRadar, {{type|bool}} inLos, {{type|bool}} inRadar, {{type|bool}} jammed&lt;br /&gt;
|info = Jammed new in 95.0, indicates if a position is actively being radar- or sonar-jammed by ANY allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetClosestValidPosition&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} r&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = CURRENTLY UNFINISHED! Always returns nil!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} excludeWeaponProjectiles {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} excludePieceProjectiles {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} projectileTable = { {{bracket|1}} = {{type|number}} projectileID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileOwnerID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTeamID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDefID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} weaponDefID&lt;br /&gt;
|info = Using this to get a weaponDefID is HIGHLY preferred to indexing WeaponDefNames via GetProjectileName.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileName&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} name&lt;br /&gt;
|info = It is recommended to rather use GetProjectileDefID for indexing purposes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileType&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} weapon, {{type|bool}} piece&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} targetTypeInt, {{type|number}} targetID {{pipe}} {{type|table}} targetPos = {x, y, z}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Pre version 95.0 return arguments: -&amp;gt; nil | number targetID, string targetTypeStr&lt;br /&gt;
&lt;br /&gt;
  targetTypeStr could be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
&lt;br /&gt;
  while targetTypeInt was one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBeingIntercepted&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|info = {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} gravity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} explosionFlags, {{type|number}} spinAngle, {{type|number}} spinSpeed, {{type|number}} spinVectorX, {{type|number}} spinVectorY, {{type|number}} spinVectorZ&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;ExplosionFlags use binary flags with the following integer equivalents (more info [http://springrts.com/wiki/Animation-CobConstants#explode here] ):&amp;lt;br&amp;gt;SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16, NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTimeToLive&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} ttl&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDirection&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} angle&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} spinSpeed&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} damage&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The string tag can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20964</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20964"/>
		<updated>2021-04-04T01:50:45Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: /* Mod-/Map-Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1&lt;br /&gt;
|info = With x &amp;amp; z in worldspace coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestMoveOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} pos.x {{bracket}}, {{type|number}} pos.y {{bracket}}, {{type|number}} pos.z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} dir.x {{bracket}}, {{type|number}} dir.y {{bracket}}, {{type|number}} dir.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} testTerrain {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} testObjects {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} centerOnly {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} validMove&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestBuildOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} facing&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} blocking {{bracket}}, {{type|number}} featureID {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Pos2BuildPos&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} facing {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitEstimatedPath&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} waypoints, {{type|table}} waypointIndices&lt;br /&gt;
|info =  The table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;table waypoints = {&lt;br /&gt;
   [1] = { x,y,z }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
table waypointIndices= {&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
  GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInRadar&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInRadar&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInAirLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInAirLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPositionLosState&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} allyID {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} LosOrRadar, {{type|bool}} inLos, {{type|bool}} inRadar, {{type|bool}} jammed&lt;br /&gt;
|info = Jammed new in 95.0, indicates if a position is actively being radar- or sonar-jammed by ANY allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetClosestValidPosition&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} r&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = CURRENTLY UNFINISHED! Always returns nil!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} excludeWeaponProjectiles {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} excludePieceProjectiles {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} projectileTable = { {{bracket|1}} = {{type|number}} projectileID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileOwnerID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTeamID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDefID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} weaponDefID&lt;br /&gt;
|info = Using this to get a weaponDefID is HIGHLY preferred to indexing WeaponDefNames via GetProjectileName.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileName&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} name&lt;br /&gt;
|info = It is recommended to rather use GetProjectileDefID for indexing purposes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileType&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} weapon, {{type|bool}} piece&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} targetTypeInt, {{type|number}} targetID {{pipe}} {{type|table}} targetPos = {x, y, z}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Pre version 95.0 return arguments: -&amp;gt; nil | number targetID, string targetTypeStr&lt;br /&gt;
&lt;br /&gt;
  targetTypeStr could be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
&lt;br /&gt;
  while targetTypeInt was one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBeingIntercepted&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|info = {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} gravity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} explosionFlags, {{type|number}} spinAngle, {{type|number}} spinSpeed, {{type|number}} spinVectorX, {{type|number}} spinVectorY, {{type|number}} spinVectorZ&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;ExplosionFlags use binary flags with the following integer equivalents (more info [http://springrts.com/wiki/Animation-CobConstants#explode here] ):&amp;lt;br&amp;gt;SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16, NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTimeToLive&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} ttl&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDirection&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} angle&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} spinSpeed&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} damage&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The string tag can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20963</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20963"/>
		<updated>2021-04-04T01:46:14Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1&lt;br /&gt;
|info = With x &amp;amp; z in worldspace coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestMoveOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} pos.x {{bracket}}, {{type|number}} pos.y {{bracket}}, {{type|number}} pos.z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} dir.x {{bracket}}, {{type|number}} dir.y {{bracket}}, {{type|number}} dir.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} testTerrain {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} testObjects {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} centerOnly {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} validMove&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TestBuildOrder&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} facing&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} blocking {{bracket}}, {{type|number}} featureID {{rbracket}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = Pos2BuildPos&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} facing {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitEstimatedPath&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} waypoints, {{type|table}} waypointIndices&lt;br /&gt;
|info =  The table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;table waypoints = {&lt;br /&gt;
   [1] = { x,y,z }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
table waypointIndices= {&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
  GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInRadar&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInRadar&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsPosInAirLos&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} allyID &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isInAirLos&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPositionLosState&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} allyID {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} LosOrRadar, {{type|bool}} inLos, {{type|bool}} inRadar, {{type|bool}} jammed&lt;br /&gt;
|info = Jammed new in 95.0, indicates if a position is actively being radar- or sonar-jammed by ANY allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetClosestValidPosition&lt;br /&gt;
|arg1 = {{type|number}} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|number}} r&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = CURRENTLY UNFINISHED! Always returns nil!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} excludeWeaponProjectiles {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} excludePieceProjectiles {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} projectileTable = { {{bracket|1}} = {{type|number}} projectileID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileOwnerID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTeamID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDefID&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} weaponDefID&lt;br /&gt;
|info = Using this to get a weaponDefID is HIGHLY preferred to indexing WeaponDefNames via GetProjectileName.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileName&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} name&lt;br /&gt;
|info = It is recommended to rather use GetProjectileDefID for indexing purposes.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileType&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} weapon, {{type|bool}} piece&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} targetTypeInt, {{type|number}} targetID {{pipe}} {{type|table}} targetPos = {x, y, z}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Pre version 95.0 return arguments: -&amp;gt; nil | number targetID, string targetTypeStr&lt;br /&gt;
&lt;br /&gt;
  targetTypeStr could be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
&lt;br /&gt;
  while targetTypeInt was one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBeingIntercepted&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|info = {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} gravity&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} explosionFlags, {{type|number}} spinAngle, {{type|number}} spinSpeed, {{type|number}} spinVectorX, {{type|number}} spinVectorY, {{type|number}} spinVectorZ&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;ExplosionFlags use binary flags with the following integer equivalents (more info [http://springrts.com/wiki/Animation-CobConstants#explode here] ):&amp;lt;br&amp;gt;SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16, NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileTimeToLive&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} ttl&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDirection&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} angle&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} spinSpeed&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;Deprecated in 95.0 - use GetPieceProjectileParams instead!&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} damage&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;The string tag can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20962</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20962"/>
		<updated>2021-04-04T00:44:45Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1&lt;br /&gt;
|info = With x &amp;amp; z in worldspace coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20961</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20961"/>
		<updated>2021-03-27T21:18:08Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20960</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20960"/>
		<updated>2021-03-27T20:43:16Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20959</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20959"/>
		<updated>2021-03-18T00:01:58Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20958</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20958"/>
		<updated>2021-03-16T22:55:53Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20957</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20957"/>
		<updated>2021-03-15T22:54:46Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20956</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20956"/>
		<updated>2021-03-13T13:34:54Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20955</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20955"/>
		<updated>2021-03-11T18:41:04Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsBuilding&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Returns what unit a constructor/factory is currently building.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCurrentBuildPower&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} buildPower&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} piece1, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTransporter&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsTransporting&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} unitID, etc ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} isEnabled, {{type|number}} curPower&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} travel, {{type|number}} travelPeriod&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} fuel&lt;br /&gt;
|info = Marked as deprecated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot; {{pipe}} {{type|string}} &amp;quot;dir&amp;quot; {{pipe}} {{type|string}} &amp;quot;moveFactor&amp;quot; {{pipe}} {{type|string}} &amp;quot;minDamage&amp;quot; {{pipe}} {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} flankingBonusMode {{pipe}} {{type|number}} flankingBonusDir.x, {{type|number}} flankingBonusDir.y, {{type|number}} flankingBonusDir.z {{pipe}} {{type|number}} flankingBonusMobilityAdd {{pipe}} {{type|number}} minDamage {{pipe}} {{type|number}} maxDamage&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mode, {{type|number}} modilityAdd, {{type|number}} minDamage, {{type|number}} maxDamage, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} type&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = Possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer, sonarJammer&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} raw {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} raw {{pipe}} {{bracket}} {{type|string}} &amp;quot;los&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;radar&amp;quot; = true {{bracket}}, {{type|string}} &amp;quot;typed&amp;quot; = true {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Raw is only available in gadgets.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20954</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20954"/>
		<updated>2021-03-10T19:27:47Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} tooltip&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} lineage {{pipe}} {{type|number}} lineage, {{type|bool}} lineageIsRoot&lt;br /&gt;
|info = {{Removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} neutral&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} paralyzeDamage, {{type|number}} captureProgress, {{type|number}} buildProgress&lt;br /&gt;
|info = Build progress is returned as floating point number between 0.0 and 1.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} armored, {{type|number}} armorMultiple&lt;br /&gt;
|info = armorMultiple new in version 0.83.x.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsStunned&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} stunned_or_inbuild, {{type|bool}} stunned, {{type|bool}} inbuild&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} maxEngagementRange&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitResources&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalMake, {{type|number}} metalUse, {{type|number}} energyMake, {{type|number}} energyUse&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metal&lt;br /&gt;
|info = See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} metalExtraction&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} experience&lt;br /&gt;
|info = 0.82+ and later&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStates&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitStates&lt;br /&gt;
|info = The unitStates table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;unitStates = {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsActive&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} active&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsCloaked&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isCloaked&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSelfDTime&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} time&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} numStockpiled, {{type|number}} numStockpileQued, {{type|number}} buildPercent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Additional output arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} basePointX, {{type|number}} basePointY, {{type|number}} basePointZ {{bracket}}, {{type|number}} midPointX, {{type|number}} midPointY, {{type|number}} midPointZ {{bracket}}, {{type|number}} aimPointX, {{type|number}} aimPointY, {{type|number}} aimPointZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBasePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = {{Removed|89.0}} Use GetUnitPosition instead. Returned the bottom of the unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns the direction vector.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitHeading&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = Returns heading directions used in COB scripts.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = VelLength new in 95.0, it returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitBuildFacing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} facing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns what unit a constructor/factory is currently building&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCurrentBuildPower&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number buildPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNanoPieces&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number piece1, etc ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil | number raw |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number featureID [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20953</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20953"/>
		<updated>2021-03-09T19:45:07Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise&amp;lt;br/&amp;gt;&lt;br /&gt;
keep this in mind when using (not Spring.GetUnitIsDead())&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
build Progress is returned as floating Point between 0.0 and 1.0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean armored, number armorMultiple&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number maxEngagementRange&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHarvestStorage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metal&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBlocking&#039;&#039;&#039; {{new|85.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean blocking, boolean crushable&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number bpx, number bpy, number bpz&lt;br /&gt;
    [, number mpx, number mpy, number mpz ]&lt;br /&gt;
    [, number apx, number apy, number apz ]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 89.0, use GetUnitPosition&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns the direction vector&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns heading directions used in COB scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRotation&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   (number unitID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Marked as (WIP) in changelog&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;velw new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;velw returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns what unit a constructor/factory is currently building&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCurrentBuildPower&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number buildPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNanoPieces&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number piece1, etc ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil | number raw |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number featureID [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20952</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20952"/>
		<updated>2021-03-09T19:43:57Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}{{rbracket}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise&amp;lt;br/&amp;gt;&lt;br /&gt;
keep this in mind when using (not Spring.GetUnitIsDead())&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
build Progress is returned as floating Point between 0.0 and 1.0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean armored, number armorMultiple&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number maxEngagementRange&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHarvestStorage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metal&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBlocking&#039;&#039;&#039; {{new|85.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean blocking, boolean crushable&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number bpx, number bpy, number bpz&lt;br /&gt;
    [, number mpx, number mpy, number mpz ]&lt;br /&gt;
    [, number apx, number apy, number apz ]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 89.0, use GetUnitPosition&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns the direction vector&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns heading directions used in COB scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRotation&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   (number unitID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Marked as (WIP) in changelog&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;velw new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;velw returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns what unit a constructor/factory is currently building&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCurrentBuildPower&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number buildPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNanoPieces&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number piece1, etc ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil | number raw |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number featureID [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20951</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20951"/>
		<updated>2021-03-09T00:29:49Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&#039;&#039;&#039;Spring.AreTeamsAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID1, number teamID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ArePlayersAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID1, number playerID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil |&lt;br /&gt;
    unitDefTable = {&lt;br /&gt;
      [number unitDefID] = { [1] = [number unitID], etc... },&lt;br /&gt;
      etc...&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | countTable = { [number unitDefID] = count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsByDefs&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID | { number unitDefID1, ... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitDefCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID ) -&amp;gt; nil | number count&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) &lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInBox&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number ymin, number zmin,&lt;br /&gt;
    number xmax, number ymax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInPlanes&#039;&#039;&#039;&lt;br /&gt;
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  plane normals point towards accepted space,&lt;br /&gt;
  so the acceptance criteria for each plane is:&lt;br /&gt;
    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestAlly&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range ] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestEnemy&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range [, bool useLOS]] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Post 95.0 this no longer returns neutral units&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise&amp;lt;br/&amp;gt;&lt;br /&gt;
keep this in mind when using (not Spring.GetUnitIsDead())&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
build Progress is returned as floating Point between 0.0 and 1.0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean armored, number armorMultiple&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number maxEngagementRange&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHarvestStorage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metal&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBlocking&#039;&#039;&#039; {{new|85.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean blocking, boolean crushable&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number bpx, number bpy, number bpz&lt;br /&gt;
    [, number mpx, number mpy, number mpz ]&lt;br /&gt;
    [, number apx, number apy, number apz ]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 89.0, use GetUnitPosition&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns the direction vector&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns heading directions used in COB scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRotation&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   (number unitID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Marked as (WIP) in changelog&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;velw new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;velw returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns what unit a constructor/factory is currently building&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCurrentBuildPower&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number buildPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNanoPieces&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number piece1, etc ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil | number raw |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number featureID [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20950</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20950"/>
		<updated>2021-03-06T14:58:12Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! bool values are not transfered from C to Lua correctly, so in IF theres needed to use this condition:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&amp;quot;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
not only:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;quot;if (Spring.GetModOptions.exampleOption) then...end&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number frameNum%dayFrames, number frameNum/dayFrames&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWind&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number dirX, number dirY, number dirZ, &lt;br /&gt;
         number strength,  number normDirX, number normDirY, number normDirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHeadingFromVector&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVectorFromHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number heading ) -&amp;gt; number x, number z&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSideData&#039;&#039;&#039;&lt;br /&gt;
  ( string sideName ) -&amp;gt; nil | string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( number sideID ) -&amp;gt; nil | string sideName, string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( ) -&amp;gt; { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamStartBox&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID ) -&amp;gt; nil | number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerList&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])&lt;br /&gt;
  -&amp;gt; nil | { [1] = number playerID, etc... }&lt;br /&gt;
From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1] ) -&amp;gt; nil | { [1] = number teamID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number allyTeamID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; &lt;br /&gt;
    nil | string  &amp;quot;name&amp;quot;,  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(PRE-83.0: in synced code this is &amp;quot;SYNCED_NONAME&amp;quot;!)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean active,&lt;br /&gt;
          boolean spectator,&lt;br /&gt;
          number  teamID,&lt;br /&gt;
          number  allyTeamID,&lt;br /&gt;
          number  pingTime,&lt;br /&gt;
          number  cpuUsage,&lt;br /&gt;
          string  country,&lt;br /&gt;
          number  rank&lt;br /&gt;
          table   customPlayerKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerControlledUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAIInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; &lt;br /&gt;
          number  skirmishAIID,&lt;br /&gt;
          string  name,&lt;br /&gt;
          number  hostingPlayerID,&lt;br /&gt;
          string  shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          string  version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          table   options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number allyteamID ) -&amp;gt; nil | table   customTeamKeys&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number  teamID,&lt;br /&gt;
          number  leader, &amp;lt;span class=note&amp;gt;(:= a player id)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean isDead,&lt;br /&gt;
          boolean isAiTeam,&lt;br /&gt;
          string  &amp;quot;side&amp;quot;,&lt;br /&gt;
          number  allyTeam,&lt;br /&gt;
          number  incomeMultiplier,&lt;br /&gt;
          table   customTeamKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResources&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number currentLevel,&lt;br /&gt;
          number storage,&lt;br /&gt;
          number pull,&lt;br /&gt;
          number income,&lt;br /&gt;
          number expense,&lt;br /&gt;
          number share,&lt;br /&gt;
          number sent,&lt;br /&gt;
          number received&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitStats&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number killed,&lt;br /&gt;
          number died,&lt;br /&gt;
          number capturedBy,&lt;br /&gt;
          number capturedFrom,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResourceStats&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID,  string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number used,&lt;br /&gt;
          number produced,&lt;br /&gt;
          number excessed,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStatsHistory&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID [, number startIndex [, number endIndex = startIndex ]]) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number cur_max_index |&lt;br /&gt;
    {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamLuaAI&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; string &amp;quot;luaAI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, so maybe depends, but in my LuaAI.lua name is on first position...&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&#039;&#039;&#039;Spring.AreTeamsAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID1, number teamID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ArePlayersAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID1, number playerID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil |&lt;br /&gt;
    unitDefTable = {&lt;br /&gt;
      [number unitDefID] = { [1] = [number unitID], etc... },&lt;br /&gt;
      etc...&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | countTable = { [number unitDefID] = count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsByDefs&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID | { number unitDefID1, ... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitDefCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID ) -&amp;gt; nil | number count&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) &lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInBox&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number ymin, number zmin,&lt;br /&gt;
    number xmax, number ymax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInPlanes&#039;&#039;&#039;&lt;br /&gt;
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  plane normals point towards accepted space,&lt;br /&gt;
  so the acceptance criteria for each plane is:&lt;br /&gt;
    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestAlly&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range ] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestEnemy&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range [, bool useLOS]] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Post 95.0 this no longer returns neutral units&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise&amp;lt;br/&amp;gt;&lt;br /&gt;
keep this in mind when using (not Spring.GetUnitIsDead())&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
build Progress is returned as floating Point between 0.0 and 1.0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean armored, number armorMultiple&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number maxEngagementRange&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHarvestStorage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metal&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBlocking&#039;&#039;&#039; {{new|85.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean blocking, boolean crushable&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number bpx, number bpy, number bpz&lt;br /&gt;
    [, number mpx, number mpy, number mpz ]&lt;br /&gt;
    [, number apx, number apy, number apz ]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 89.0, use GetUnitPosition&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns the direction vector&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns heading directions used in COB scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRotation&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   (number unitID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Marked as (WIP) in changelog&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;velw new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;velw returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns what unit a constructor/factory is currently building&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCurrentBuildPower&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number buildPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNanoPieces&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number piece1, etc ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil | number raw |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number featureID [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20949</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20949"/>
		<updated>2021-03-06T14:31:34Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;(those special TeamIDs are not supported by all functions)&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALL_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.MY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ALLY_UNITS&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.ENEMY_UNITS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID()&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGaiaTeamID&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number teamID&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGodModeEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsCheatingEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsDevLuaEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsEditDefsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.AreHelperAIsEnabled&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.FixedAllies&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.IsGameOver&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Those functions allow to save data per Game,Team and Unit.&amp;lt;br&amp;gt;The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;string values are new since 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRulesInfoMap&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;REMOVED in 0.82!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; { [key1] = string value1, [key2] = string value2, ... }&lt;br /&gt;
  ( string &amp;quot;key&amp;quot; ) -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number ruleIndex | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | { [ruleName1] = number | string value1, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number index | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | { [ruleName1] = number | string value1, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number index | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [ruleName1] = number | string value1, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRulesParam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number index | string ruleName ) -&amp;gt; nil | number value | string value&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRulesParams&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | { [ruleName1] = number | string value1, ... }&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetModOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMapOptions&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; {} | { &amp;quot;keyName1&amp;quot; = string &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = string &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
! bool values are not transfered from C to Lua correctly, so in IF theres needed to use this condition:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&amp;quot;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;quot;&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
not only:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;quot;if (Spring.GetModOptions.exampleOption) then...end&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( ) -&amp;gt; number userSpeedFactor, number speedFactor, boolean paused&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameFrame&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number frameNum%dayFrames, number frameNum/dayFrames&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGameSeconds&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number seconds&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetWind&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number dirX, number dirY, number dirZ, &lt;br /&gt;
         number strength,  number normDirX, number normDirY, number normDirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetHeadingFromVector&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetVectorFromHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number heading ) -&amp;gt; number x, number z&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSideData&#039;&#039;&#039;&lt;br /&gt;
  ( string sideName ) -&amp;gt; nil | string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( number sideID ) -&amp;gt; nil | string sideName, string startUnit, string caseSensitiveSideName&lt;br /&gt;
  ( ) -&amp;gt; { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamStartBox&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID ) -&amp;gt; nil | number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStartPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerList&#039;&#039;&#039;&lt;br /&gt;
  ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])&lt;br /&gt;
  -&amp;gt; nil | { [1] = number playerID, etc... }&lt;br /&gt;
From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( [number allyTeamID = -1] ) -&amp;gt; nil | { [1] = number teamID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamList&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number allyTeamID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; &lt;br /&gt;
    nil | string  &amp;quot;name&amp;quot;,  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(PRE-83.0: in synced code this is &amp;quot;SYNCED_NONAME&amp;quot;!)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean active,&lt;br /&gt;
          boolean spectator,&lt;br /&gt;
          number  teamID,&lt;br /&gt;
          number  allyTeamID,&lt;br /&gt;
          number  pingTime,&lt;br /&gt;
          number  cpuUsage,&lt;br /&gt;
          string  country,&lt;br /&gt;
          number  rank&lt;br /&gt;
          table   customPlayerKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPlayerControlledUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAIInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; &lt;br /&gt;
          number  skirmishAIID,&lt;br /&gt;
          string  name,&lt;br /&gt;
          number  hostingPlayerID,&lt;br /&gt;
          string  shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          string  version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&lt;br /&gt;
          table   options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllyTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number allyteamID ) -&amp;gt; nil | table   customTeamKeys&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number  teamID,&lt;br /&gt;
          number  leader, &amp;lt;span class=note&amp;gt;(:= a player id)&amp;lt;/span&amp;gt;&lt;br /&gt;
          boolean isDead,&lt;br /&gt;
          boolean isAiTeam,&lt;br /&gt;
          string  &amp;quot;side&amp;quot;,&lt;br /&gt;
          number  allyTeam,&lt;br /&gt;
          number  incomeMultiplier,&lt;br /&gt;
          table   customTeamKeys&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResources&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number currentLevel,&lt;br /&gt;
          number storage,&lt;br /&gt;
          number pull,&lt;br /&gt;
          number income,&lt;br /&gt;
          number expense,&lt;br /&gt;
          number share,&lt;br /&gt;
          number sent,&lt;br /&gt;
          number received&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitStats&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt;&lt;br /&gt;
    nil | number killed,&lt;br /&gt;
          number died,&lt;br /&gt;
          number capturedBy,&lt;br /&gt;
          number capturedFrom,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamResourceStats&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82 and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number teamID,  string &amp;quot;metal&amp;quot; | &amp;quot;energy&amp;quot; ) -&amp;gt;&lt;br /&gt;
    nil | number used,&lt;br /&gt;
          number produced,&lt;br /&gt;
          number excessed,&lt;br /&gt;
          number received,&lt;br /&gt;
          number sent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamStatsHistory&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID [, number startIndex [, number endIndex = startIndex ]]) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number cur_max_index |&lt;br /&gt;
    {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamLuaAI&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; string &amp;quot;luaAI&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, so maybe depends, but in my LuaAI.lua name is on first position...&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&#039;&#039;&#039;Spring.AreTeamsAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID1, number teamID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.ArePlayersAllied&#039;&#039;&#039;&lt;br /&gt;
  ( number playerID1, number playerID2 ) -&amp;gt; nil | boolean&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllUnits&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | unitTable = { [1] = number unitID, ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnits&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsSorted&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil |&lt;br /&gt;
    unitDefTable = {&lt;br /&gt;
      [number unitDefID] = { [1] = [number unitID], etc... },&lt;br /&gt;
      etc...&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsCounts&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | countTable = { [number unitDefID] = count, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitsByDefs&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID | { number unitDefID1, ... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitDefCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, number unitDefID ) -&amp;gt; nil | number count&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTeamUnitCount&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID ) -&amp;gt; nil | number count&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) &lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInBox&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number ymin, number zmin,&lt;br /&gt;
    number xmax, number ymax, number zmax [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius [,number teamID] )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitsInPlanes&#039;&#039;&#039;&lt;br /&gt;
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )&lt;br /&gt;
    -&amp;gt; nil | unitTable = { [1] = number unitID, etc... }&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  plane normals point towards accepted space,&lt;br /&gt;
  so the acceptance criteria for each plane is:&lt;br /&gt;
    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestAlly&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range ] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNearestEnemy&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number range [, bool useLOS]] ) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Post 95.0 this no longer returns neutral units&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidUnitID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsDead&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise&amp;lt;br/&amp;gt;&lt;br /&gt;
keep this in mind when using (not Spring.GetUnitIsDead())&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTooltip&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string tooltip&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLineage&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt; Removed from version 0.83.x&amp;lt;/span&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number lineage | number lineage, boolean lineageIsRoot&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNeutral&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean neutral&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number health, number maxHealth, number paralyzeDamage,&lt;br /&gt;
                             number captureProgress, number buildProgress&lt;br /&gt;
build Progress is returned as floating Point between 0.0 and 1.0&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitArmored&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean armored, number armorMultiple&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsStunned&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMaxRange&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number maxEngagementRange&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitResources&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metalMake, number metalUse,&lt;br /&gt;
                             number energyMake, number energyUse&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHarvestStorage&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number metal&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMetalExtraction&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;0.82+ and later&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitExperience&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number experience&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStates&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
    &amp;quot;firestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;movestate&amp;quot; = number,&lt;br /&gt;
    &amp;quot;repeat&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;cloak&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;active&amp;quot; = boolean,&lt;br /&gt;
    &amp;quot;trajectory&amp;quot; = boolean,&lt;br /&gt;
    [&amp;quot;autoland&amp;quot; = boolean,]&lt;br /&gt;
    [&amp;quot;autorepairlevel&amp;quot; = number,]&lt;br /&gt;
    [&amp;quot;loopbackattack&amp;quot; = boolean]&lt;br /&gt;
  } &lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsActive&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsCloaked&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSelfDTime&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitStockpile&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number numStockpiled, number numStockpileQued,&lt;br /&gt;
                             number buildPercent&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBlocking&#039;&#039;&#039; {{new|85.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | boolean blocking, boolean crushable&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
    nil |&lt;br /&gt;
    number bpx, number bpy, number bpz&lt;br /&gt;
    [, number mpx, number mpy, number mpz ]&lt;br /&gt;
    [, number apx, number apy, number apz ]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBasePosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 89.0, use GetUnitPosition&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the bottom of the unit.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number dx, number dy, number dz&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns the direction vector&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitHeading&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number heading&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;returns heading directions used in COB scripts&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitRotation&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
   (number unitID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Marked as (WIP) in changelog&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVelocity&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;velw new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;velw returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitBuildFacing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsBuilding&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns what unit a constructor/factory is currently building&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCurrentBuildPower&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number buildPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitNanoPieces&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number piece1, etc ... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTransporter&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitIsTransporting&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { [1] = number unitID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitShieldState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number weaponID = -1] ) -&amp;gt; nil | number isEnabled, number curPower&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitTravel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number travel, number travelPeriod&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFuel&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFlanking&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;dir&amp;quot; ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
  ( number unitID, string &amp;quot;mode&amp;quot; | &amp;quot;moveFactor&amp;quot; | &amp;quot;minDamage&amp;quot; | &amp;quot;maxDamage&amp;quot; ) -&amp;gt; nil | number&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number mode, number modilityAdd,&lt;br /&gt;
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type ) -&amp;gt; nil | number radius&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;possible types are:&amp;lt;br&amp;gt;los, airLos, radar, sonar, seismic, radarJammer &amp;amp; sonarJammer&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLosState&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;raw is only available in gadgets&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -&amp;gt; nil | number raw |&lt;br /&gt;
  { [&amp;quot;los&amp;quot; = true] [, &amp;quot;radar&amp;quot; = true] [, &amp;quot;typed&amp;quot; = true] }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitSeparation&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;surfaceDist new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -&amp;gt; nil | number distance&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number featureID [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitDefDimensions&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID ) -&amp;gt; nil |&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttacker&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitLastAttackedPiece&#039;&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | string pieceName, number gameframe&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitMoveTypeData&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;new in version 0.80+&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | { movetype data }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum | &amp;quot;selfDestruct&amp;quot; | &amp;quot;explode&amp;quot;, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirY, number dirZ&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTryTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;For a position just checks if the weapon can attackGround. For a unit checks that it exists, category, death status, crashing status, LOS status, neutral status, ally status and transport status.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestTarget&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTestRange&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Checks target is in range including height modifiers and cylinder targeting if set.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponHaveFreeLineOfFire&#039;&#039;&#039; {{new|94.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, &lt;br /&gt;
    number targetID | number posX, number posY, number posZ ) -&amp;gt; nil | boolean success&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From 104.0 onwards the param list changes so that source firing position can also be passed:&lt;br /&gt;
&lt;br /&gt;
  ( unitID, weaponNum, &lt;br /&gt;
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponCanFire&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil | boolean canFire&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitWeaponTarget&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number unitID, number weaponNum ) -&amp;gt; nil |&lt;br /&gt;
  number 0 | number 1, bool isUserTarget, number unitID | &lt;br /&gt;
  number 2, bool isUserTarget, { number posX, number posY, number posZ } | &lt;br /&gt;
  number 3, bool isUserTarget, number ProjectileID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;returned number of args is always 3 if targetType != None&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID) --&amp;gt; nil | &lt;br /&gt;
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID) --&amp;gt; nil |&lt;br /&gt;
       number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
       number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,&lt;br /&gt;
       number nextPosErrorUpdate&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInAirLos&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInRadar&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsUnitInJammer&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitVectors&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number posx, number posy, number posz&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want  move a piece to another piece.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceDirection&#039;&#039;&#039; &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPiecePosDir&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceNum ) -&amp;gt; nil | number posX, number posY, number posZ,&lt;br /&gt;
    number dirX, number dirZ, number dirY&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; { [1] = number, ... , [16] = number }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceList&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { [1] = string &amp;quot;piecename&amp;quot;, ... , [pieceNumN] = string &amp;quot;piecename&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceMap&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; { &amp;quot;piecename1&amp;quot; = pieceNum1, ... , &amp;quot;piecenameN&amp;quot; = pieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number piece ) -&amp;gt; {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&lt;br /&gt;
{{new|95.0}} &amp;quot;parent&amp;quot; field&lt;br /&gt;
{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptPiece&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number scriptPiece ] )&lt;br /&gt;
   -&amp;gt; nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get via Cob2Lua a pieceID you have to translate it with this function. Btw the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitScriptNames&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID )&lt;br /&gt;
   -&amp;gt; { &amp;quot;cobpiecename1&amp;quot; = ScriptPieceNum1, ... , &amp;quot;cobpiecenameN&amp;quot; = ScriptPieceNumN }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitPieceCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCommands&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCommandQueue&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(Alias)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996]&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFullBuildQueue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetRealBuildQueue&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;(cleans the buildqueue of things the unit can&#039;t build itself)&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID ) -&amp;gt;&lt;br /&gt;
  nil | buildOrders = {&lt;br /&gt;
          [1] = { [number unitDefID] = number count },  etc...&lt;br /&gt;
        }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCommands&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number count = 0 ) -&amp;gt; nil | number commandQueueSize {{new|96}}&lt;br /&gt;
  ( number unitID [, number count = -1 ] ) &lt;br /&gt;
  -&amp;gt; nil | table commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFactoryCounts&#039;&#039;&#039; (used to get the buildqueue of a factory, seems screwed o_O)&lt;br /&gt;
  ( number unitID [, number count [, boolean addCMDs ] ] ) -&amp;gt; nil | commandQueueTable = {&lt;br /&gt;
     [2] = { [number unitDefID | number -cmdID] = number count }, ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCmdDescs&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number startIndex [, number endIndex ] ] ) -&amp;gt; nil | {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&lt;br /&gt;
&#039;&#039;&#039;Spring.FindUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdID ) -&amp;gt; nil | number index&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInRectangle&#039;&#039;&#039;&lt;br /&gt;
  ( number xmin, number zmin, number xmax, number zmax )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInSphere&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturesInCylinder&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, number radius )&lt;br /&gt;
    -&amp;gt; featureTable = { [1] = number featureID, etc... }&lt;br /&gt;
&#039;&#039;&#039;Spring.GetAllFeatures&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; { [1] = number featureID, ... }&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&#039;&#039;&#039;Spring.ValidFeatureID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDefID&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number featureDefID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number teamID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureAllyTeam&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number allyID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number health, number maxHealth, number resurrectProgress&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureSeparation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID1, number featureID2 [, boolean 2D] ) -&amp;gt; nil | number distance&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) -&amp;gt;&lt;br /&gt;
  nil |&lt;br /&gt;
  number bpx, number bpy, number bpz [,&lt;br /&gt;
  number mpx, number mpy, number mpz [,&lt;br /&gt;
  number apx, number apy, number apz ]]&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;since 89.0, returns the base (default), middle or aim position of the feature.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureVelocity&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number featureID [, boolean norm] )&lt;br /&gt;
  -&amp;gt; nil | number velx, number vely, number velz, number velLength&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number dirx, number diry, number dirz&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureRotation&#039;&#039;&#039; {{New|101.0}}&lt;br /&gt;
   (number featureID) --&amp;gt; nil | number pitch, number yaw, number roll &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureHeading&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number heading&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResources&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;reclaimTime&amp;lt;/span&amp;gt; {{new|105.0}}&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | number RemainingMetal, number maxMetal,&lt;br /&gt;
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | boolean noSelect&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil | string UnitDefName, number buildFacing&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featuerID, number pieceID )&lt;br /&gt;
  -&amp;gt; number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
  number offsetX, number offsetY, number offsetZ,&lt;br /&gt;
  number volumeType, number testType, number primaryAxis, boolean disabled&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID) --&amp;gt; boolean collidable, boolean crushable, boolean blocking&lt;br /&gt;
{{new|95.0}} Now return values are: &lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
See #Unit_Pieces for full details.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeatureLastAttackedPiece&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceList&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceInfo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosition&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceDirection&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePiecePosDir&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetFeaturePieceMatrix&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBUnitVar&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number teamID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBAllyTeamVar&#039;&#039;&#039;&lt;br /&gt;
  ( number allyID, integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBGlobalVar&#039;&#039;&#039;&lt;br /&gt;
  ( integer varID [, boolean unpack = false ] )&lt;br /&gt;
   -&amp;gt; nil | number value | number unpackedX, number unpackedY&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundOrigHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&#039;&#039;This returns the ground original (before terraforming) height at a given x,z position&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundNormal&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z [, smoothedNormal] ) -&amp;gt; number x, number y, number z, number slope &lt;br /&gt;
{{new|100.0}}&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;: smoothedNormal and slope&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundInfo&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; string &amp;quot;Type&amp;quot;, number metal, number hardness,&lt;br /&gt;
                            number tankSpeed, number kbotSpeed, number hoverSpeed,&lt;br /&gt;
                            number shipSpeed, boolean receiveTracks&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundBlocked&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z |&lt;br /&gt;
    number x1, number z1, number x2, number z2 )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;feature&amp;quot;, number featureID  |  string &amp;quot;unit&amp;quot;, number unitID&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGroundExtremes&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; nil | number minHeight, number maxHeight&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetSmoothMeshHeight&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number y&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalMapSize&#039;&#039;&#039;&lt;br /&gt;
  ( ) -&amp;gt; number sizeX, number sizeY&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalAmount&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number metalAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetMetalExtraction&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number extractionAmount &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in metal map coordinates (worldspace/16)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetTerrainTypeData&#039;&#039;&#039; {{new|92.0}}&lt;br /&gt;
  ( number i )&lt;br /&gt;
    -&amp;gt; nil |  string &amp;quot;name&amp;quot;, number hardness,&lt;br /&gt;
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,&lt;br /&gt;
              boolean receiveTracks&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; number 0 | 1 &lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;where x &amp;amp; z are in worldspace coordinates&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test Orders ===&lt;br /&gt;
&#039;&#039;&#039;Spring.TestMoveOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z) -&amp;gt; boolean validMove&lt;br /&gt;
{{New|95.0}} parameters now are:&lt;br /&gt;
    number unitDefID,&lt;br /&gt;
    number pos.x, number pos.y, number pos.z&lt;br /&gt;
    [, number dir.x&lt;br /&gt;
    [, number dir.y&lt;br /&gt;
    [, number dir.z&lt;br /&gt;
    [, boolean testTerrain&lt;br /&gt;
    [, boolean testObjects&lt;br /&gt;
    [, boolean centerOnly ]]]]]]&lt;br /&gt;
    ) --&amp;gt; boolean &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TestBuildOrder&#039;&#039;&#039;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z, number facing)&lt;br /&gt;
    -&amp;gt; number blocking [,number featureID]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;blocking can be:&lt;br /&gt;
    0 - blocked&lt;br /&gt;
    1 - mobile unit in the way&lt;br /&gt;
    2 - free  (or if featureID is != nil then with a blocking feature that can be reclaimed)&lt;br /&gt;
  facing can be:&lt;br /&gt;
    0, &amp;quot;s&amp;quot;, &amp;quot;south&amp;quot;&lt;br /&gt;
    1, &amp;quot;e&amp;quot;, &amp;quot;east&amp;quot;&lt;br /&gt;
    2, &amp;quot;n&amp;quot;, &amp;quot;north&amp;quot;&lt;br /&gt;
    3, &amp;quot;w&amp;quot;, &amp;quot;west&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.Pos2BuildPos&#039;&#039;&#039; &amp;lt;font color=&amp;quot;#FF0000&amp;quot;&amp;gt;optional param &#039;&#039;facing&#039;&#039; supported in 0.83 and later&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number y, number z[, number facing] ) &lt;br /&gt;
    -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
=== PathFinding ===&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitEstimatedPath&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID ) -&amp;gt; nil | {&lt;br /&gt;
     [1] = { x,y,z }, ...&lt;br /&gt;
   },{&lt;br /&gt;
     [1] = startIdxOfDetailedPath,&lt;br /&gt;
     [2] = startIdxOfDetailedEstimatedPath1,&lt;br /&gt;
     [3] = startIdxOfDetailedEstimatedPath2,&lt;br /&gt;
   }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;GetUnitEstimatedPath() returns 2 tables:&lt;br /&gt;
    1 table the waypoints and 1 table with indices (in the waypoint table)&lt;br /&gt;
    when a new (more lazy) pathfinding algorithm  begins.&lt;br /&gt;
    So the waypoint table contains 3 different levels of details.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== LOS ===&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInRadar&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.IsPosInAirLos&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number y, number z, number allyID ) -&amp;gt; boolean&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPositionLosState&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;jammed new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number y, number z [, number allyID] )&lt;br /&gt;
    -&amp;gt; boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;jammed indicates if a position is actively being radar- or sonar-jammed by &#039;&#039;&#039;any&#039;&#039;&#039; allyteam&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetClosestValidPosition&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;//NOT FINISHED YET&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number unitDefID, number x, number z, number r ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Projectiles ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilesInRectangle&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 ( number xmin, number zmin, number xmax, number zmax&lt;br /&gt;
   [, boolean excludeWeaponProjectiles&lt;br /&gt;
   [, boolean excludePieceProjectiles] ] )&lt;br /&gt;
   -&amp;gt; nil | projectileTable = { [1] = number projectileID, etc... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileOwnerID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number unitID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTeamID&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number teamID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDefID&#039;&#039;&#039;&lt;br /&gt;
   (number projectileID) -&amp;gt; nil | number weaponDefID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;using this to get a weaponDefID is HIGHLY preferred &amp;lt;br/&amp;gt; to indexing WeaponDefNames via GetProjectileName&amp;lt;span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileName&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | string name&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileType&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean weapon, boolean piece&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID )&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  -&amp;gt; nil | number targetID, string &amp;lt;span class=note&amp;gt;targetTypeStr&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt; -&amp;gt; nil | [number &amp;lt;span class=note&amp;gt;targetTypeInt&amp;lt;/span&amp;gt;, number targetID | table targetPos = {x, y, z}]&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | boolean isBeingIntercepted&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number px, number py, number pz&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number vx, number vy, number vz&lt;br /&gt;
  {{new|95.0}}: returns (targetPos - startPos) for Beamlasers and similar weapons&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileGravity&#039;&#039;&#039;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number gravity&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil |  number explosionFlags, number spinAngle, &lt;br /&gt;
  number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;Where explosionFlags use binary flags with the following integer equivalents: &lt;br /&gt;
   more info [http://springrts.com/wiki/Animation-CobConstants#explode here]&lt;br /&gt;
   SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16&lt;br /&gt;
   NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileTimeToLive&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number ttl&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDirection&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number dir.x, number dir.y, number dir.z&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinAngle&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number angle&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinSpeed&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number spinSpeed&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileSpinVec&#039;&#039;&#039;  &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Deprecated in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projectileID ) -&amp;gt; nil | number x, number y, number z&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, string tag ) -&amp;gt; nil | number&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;`tag` can be:&lt;br /&gt;
  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11814</id>
		<title>Lua SyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11814"/>
		<updated>2021-03-05T16:26:59Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: Finished updating page with new anchorable templates, minor fixes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateFeature&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} heading {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} AllyTeamID {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} featureID&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} health&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = {{type|number}} energy {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimTime {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureReclaim&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} reclaimLeft&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} &amp;quot;facing&amp;quot; {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} snapToGround {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMoveCtrl&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is true:&amp;lt;br&amp;gt;{{bracket}}, velVector(x,y,z) -- initial velocity for feature&amp;lt;br&amp;gt;{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is false:&amp;lt;br&amp;gt;{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} primaryAxis {{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}} &lt;br /&gt;
|arg4 = {{type|bool}} relative&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mass&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt; Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CallCOBScript&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} funcID {{pipe}} {{type|string}} funcName&lt;br /&gt;
|arg3 = {{type|number}} retArgs&lt;br /&gt;
|arg4 = COBArg1&lt;br /&gt;
|arg5 = COBArg2&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} returnValue, {{type|number}} retArg1, {{type|number}} retArg2, ...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBScriptID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} funcName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} funcID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} splitData=false {{rbracket}}&lt;br /&gt;
|arg3 = {{type|number}} COBValue {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} param2 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} param3 {{bracket}}&lt;br /&gt;
|arg7 =  {{type|number}} param4 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} result {{pipe}} {{type|number}} result1, {{type|number}} result2&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} COBValue&lt;br /&gt;
|arg3 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param2 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&lt;br /&gt;
Options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
See [[Lua CMDs]] for relevant constants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}{{type|number}} unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = (heightmap[x][z] += height;)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMapFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
Example code:&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc(). The terraform argument is a scaling factor:&amp;lt;br&amp;gt;&lt;br /&gt;
If =0 nothing will be changed (the terraform starts) and if =1 the terraform will be finished.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMeshFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapSquareTerrainType&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} newType&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} oldType&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} typeIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speedTanks = nil {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} speedKBOts = nil {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} speedHovers = nil {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} speedShips = nil {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSquareBuildingMask&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|103.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} metalAmount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;x &amp;amp; z coords are in worldspace/16. metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = EditUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = InsertUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetNoPause&lt;br /&gt;
|arg1 = {{type|bool}} noPause &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitToFeature&lt;br /&gt;
|arg1 = {{type|bool}} tofeature &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = An ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag) [http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetExperienceGrade&lt;br /&gt;
|arg1 = {{type|number}} expGrade {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} ExpPowerScale {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} ExpHealthScale {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} ExpReloadScale {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = expGrade defines how often UnitExperience() will be called.&amp;lt;br&amp;gt;Prior to 104.0 it is based on the following equation:&amp;lt;br&amp;gt;(int) {{bracket}}exp/(exp+1){{rbracket}} / expGrade&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Post 104.0 it is the raw change.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnExplosion&lt;br /&gt;
|arg1 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg2 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg3 = {{type|table}} explosionParams&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean&lt;br /&gt;
&lt;br /&gt;
Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnCEG&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;cegname&amp;quot; | {{type|number}} cegID&lt;br /&gt;
|arg2 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg3 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg4 = {{type|number}} radius = 0&lt;br /&gt;
|arg5 = {{type|number}} damage = 0&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success, {{type|number}} cegID&lt;br /&gt;
|info = cegID new in 95.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnSFX&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} sfxID&lt;br /&gt;
|arg3 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg4 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg5 = {{type|number}} radius = 0&lt;br /&gt;
|arg6 = {{type|number}} damage = 0 {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} absolute {{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnProjectile&lt;br /&gt;
|arg1 = {{type|number}} weaponDefID&lt;br /&gt;
|arg2 = {{type|table}} projectileParams &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} projectileID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DeleteProjectile&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Silently removes projectiles (no explosion).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|string}} targetTypeStr {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|number}} targetType {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIgnoreTrackingError&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} ignore &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIsIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileMoveControl&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Disables engine movecontrol, so lua can fully control the physics.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} posX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} velX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} velY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} velZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCollision&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} grav = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinAngle = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speed = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCEG&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|string}} ceg_name &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} explosionFlags {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinAngle {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} spinVector.x {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} spinVector.y {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} spinVector.z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20948</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20948"/>
		<updated>2021-03-05T16:25:02Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateFeature&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} heading {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} AllyTeamID {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} featureID&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} health&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = {{type|number}} energy {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimTime {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureReclaim&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} reclaimLeft&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} &amp;quot;facing&amp;quot; {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} snapToGround {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMoveCtrl&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is true:&amp;lt;br&amp;gt;{{bracket}}, velVector(x,y,z) -- initial velocity for feature&amp;lt;br&amp;gt;{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is false:&amp;lt;br&amp;gt;{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} primaryAxis {{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}} &lt;br /&gt;
|arg4 = {{type|bool}} relative&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mass&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt; Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CallCOBScript&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} funcID {{pipe}} {{type|string}} funcName&lt;br /&gt;
|arg3 = {{type|number}} retArgs&lt;br /&gt;
|arg4 = COBArg1&lt;br /&gt;
|arg5 = COBArg2&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} returnValue, {{type|number}} retArg1, {{type|number}} retArg2, ...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBScriptID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} funcName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} funcID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} splitData=false {{rbracket}}&lt;br /&gt;
|arg3 = {{type|number}} COBValue {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} param2 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} param3 {{bracket}}&lt;br /&gt;
|arg7 =  {{type|number}} param4 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} result {{pipe}} {{type|number}} result1, {{type|number}} result2&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} COBValue&lt;br /&gt;
|arg3 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param2 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&lt;br /&gt;
Options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
See [[Lua CMDs]] for relevant constants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}{{type|number}} unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = (heightmap[x][z] += height;)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMapFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
Example code:&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc(). The terraform argument is a scaling factor:&amp;lt;br&amp;gt;&lt;br /&gt;
If =0 nothing will be changed (the terraform starts) and if =1 the terraform will be finished.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMeshFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetSmoothMeshFunc().&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMapSquareTerrainType&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} newType&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} oldType&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} typeIndex {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speedTanks = nil {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} speedKBOts = nil {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} speedHovers = nil {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} speedShips = nil {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} true&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSquareBuildingMask&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} mask &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|103.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} metalAmount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt;x &amp;amp; z coords are in worldspace/16. metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = EditUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = InsertUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = {{type|table}} cmdArray &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} cmdDescID {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetNoPause&lt;br /&gt;
|arg1 = {{type|bool}} noPause &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitToFeature&lt;br /&gt;
|arg1 = {{type|bool}} tofeature &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = An ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag) [http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetExperienceGrade&lt;br /&gt;
|arg1 = {{type|number}} expGrade {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} ExpPowerScale {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} ExpHealthScale {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} ExpReloadScale {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = expGrade defines how often UnitExperience() will be called.&amp;lt;br&amp;gt;Prior to 104.0 it is based on the following equation:&amp;lt;br&amp;gt;(int) {{bracket}}exp/(exp+1){{rbracket}} / expGrade&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Post 104.0 it is the raw change.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnExplosion&lt;br /&gt;
|arg1 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg2 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg3 = {{type|table}} explosionParams&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean&lt;br /&gt;
&lt;br /&gt;
Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnCEG&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;cegname&amp;quot; | {{type|number}} cegID&lt;br /&gt;
|arg2 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg3 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg4 = {{type|number}} radius = 0&lt;br /&gt;
|arg5 = {{type|number}} damage = 0&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success, {{type|number}} cegID&lt;br /&gt;
|info = cegID new in 95.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnSFX&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} sfxID&lt;br /&gt;
|arg3 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0&lt;br /&gt;
|arg4 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0&lt;br /&gt;
|arg5 = {{type|number}} radius = 0&lt;br /&gt;
|arg6 = {{type|number}} damage = 0 {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} absolute {{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SpawnProjectile&lt;br /&gt;
|arg1 = {{type|number}} weaponDefID&lt;br /&gt;
|arg2 = {{type|table}} projectileParams &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} projectileID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;Possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DeleteProjectile&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Silently removes projectiles (no explosion).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|string}} targetTypeStr {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileTarget&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{bracket}} {{type|number}} targetID, {{type|number}} targetType {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;pre&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIgnoreTrackingError&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} ignore &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileIsIntercepted&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileMoveControl&lt;br /&gt;
|arg1 = {{type|number}} projectileID &lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Disables engine movecontrol, so lua can fully control the physics.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectilePosition&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} posX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} posY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} posZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileVelocity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} velX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} velY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} velZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCollision&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileGravity&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} grav = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinAngle&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinAngle = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinSpeed&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} speed = 0 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileSpinVec&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} spinX = 0 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinY = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileCEG&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|string}} ceg_name &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetPieceProjectileParams&lt;br /&gt;
|arg1 = {{type|number}} projectileID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} explosionFlags {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} spinAngle {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} spinSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} spinVector.x {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} spinVector.y {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} spinVector.z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} projectileID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}} &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetProjectileDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20947</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20947"/>
		<updated>2021-03-04T20:23:37Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateFeature&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} heading {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} AllyTeamID {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} featureID&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} health&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = {{type|number}} energy {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimTime {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureReclaim&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} reclaimLeft&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} &amp;quot;facing&amp;quot; {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} snapToGround {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMoveCtrl&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is true:&amp;lt;br&amp;gt;{{bracket}}, velVector(x,y,z) -- initial velocity for feature&amp;lt;br&amp;gt;{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is false:&amp;lt;br&amp;gt;{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} primaryAxis {{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}} &lt;br /&gt;
|arg4 = {{type|bool}} relative&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mass&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt; Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CallCOBScript&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} funcID {{pipe}} {{type|string}} funcName&lt;br /&gt;
|arg3 = {{type|number}} retArgs&lt;br /&gt;
|arg4 = COBArg1&lt;br /&gt;
|arg5 = COBArg2&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} returnValue, {{type|number}} retArg1, {{type|number}} retArg2, ...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBScriptID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} funcName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} funcID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} splitData=false {{rbracket}}&lt;br /&gt;
|arg3 = {{type|number}} COBValue {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} param2 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} param3 {{bracket}}&lt;br /&gt;
|arg7 =  {{type|number}} param4 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} result {{pipe}} {{type|number}} result1, {{type|number}} result2&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} COBValue&lt;br /&gt;
|arg3 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param2 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&lt;br /&gt;
Options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
See [[Lua CMDs]] for relevant constants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}{{type|number}} unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = (heightmap[x][z] += height;)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMapFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
Example code:&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc()&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetHeightMap&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} height {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} terraform = 1 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff&lt;br /&gt;
|info = Can only be called in SetHeightMapFunc(). The terraform argument is a scaling factor:&amp;lt;br&amp;gt;&lt;br /&gt;
If =0 nothing will be changed (the terraform starts) and if =1 the terraform will be finished.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = LevelSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AdjustSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} height &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RevertSmoothMesh&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} x2 &lt;br /&gt;
|arg4 = {{type|number}} z2 {{rbracket}}&lt;br /&gt;
|arg5 = {{type|number}} origFactor &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetSmoothMeshFunc&lt;br /&gt;
|arg1 = lua_function {{bracket}}&lt;br /&gt;
|arg2 = arg1 {{bracket}}&lt;br /&gt;
|arg3 = arg2 {{bracket}}&lt;br /&gt;
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSquareBuildingMask&#039;&#039;&#039; {{new|103.0}}&lt;br /&gt;
  ( number x, number z, int mask ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
an ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade [, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
  Prior to 104.0 it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
  Post 104.0 it is the raw change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnExplosion&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    table explosionParams&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot; | number cegID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnSFX&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number unitID, number sfxID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
    [, boolean absolute ]&lt;br /&gt;
  ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DeleteProjectile&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
Silently removes projectiles (no explosion).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number targetType]]  |  [number posX, number posY, number posZ]) &lt;br /&gt;
    --&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIgnoreTrackingError&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID, bool ignore ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039; &lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20946</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20946"/>
		<updated>2021-03-04T13:52:12Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateFeature&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} heading {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} AllyTeamID {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} featureID&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} health&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = {{type|number}} energy {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimTime {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureReclaim&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} reclaimLeft&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} &amp;quot;facing&amp;quot; {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} snapToGround {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMoveCtrl&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is true:&amp;lt;br&amp;gt;{{bracket}}, velVector(x,y,z) -- initial velocity for feature&amp;lt;br&amp;gt;{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is false:&amp;lt;br&amp;gt;{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} primaryAxis {{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}} &lt;br /&gt;
|arg4 = {{type|bool}} relative&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mass&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt; Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CallCOBScript&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} funcID {{pipe}} {{type|string}} funcName&lt;br /&gt;
|arg3 = {{type|number}} retArgs&lt;br /&gt;
|arg4 = COBArg1&lt;br /&gt;
|arg5 = COBArg2&lt;br /&gt;
|arg6 = ...&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} returnValue, {{type|number}} retArg1, {{type|number}} retArg2, ...&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBScriptID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} funcName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} funcID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} splitData=false {{rbracket}}&lt;br /&gt;
|arg3 = {{type|number}} COBValue {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} param2 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} param3 {{bracket}}&lt;br /&gt;
|arg7 =  {{type|number}} param4 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} result {{pipe}} {{type|number}} result1, {{type|number}} result2&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCOBValue&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} COBValue&lt;br /&gt;
|arg3 = {{type|number}} param1 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} param2 {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Note: Don&#039;t use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!&amp;lt;br&amp;gt;You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&lt;br /&gt;
Options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
See [[Lua CMDs]] for relevant constants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = unitID, etc... }&lt;br /&gt;
|arg2 = {{type|number}} cmdID&lt;br /&gt;
|arg3 = params = { number, etc...}&lt;br /&gt;
|arg4 = options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitMap&lt;br /&gt;
|arg1 = unitMap = { {{bracket}}{{type|number}} unitID{{rbracket}} = example, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GiveOrderArrayToUnitArray&lt;br /&gt;
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} } }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Example code:&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSquareBuildingMask&#039;&#039;&#039; {{new|103.0}}&lt;br /&gt;
  ( number x, number z, int mask ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
an ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade [, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
  Prior to 104.0 it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
  Post 104.0 it is the raw change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnExplosion&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    table explosionParams&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot; | number cegID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnSFX&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number unitID, number sfxID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
    [, boolean absolute ]&lt;br /&gt;
  ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DeleteProjectile&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
Silently removes projectiles (no explosion).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number targetType]]  |  [number posX, number posY, number posZ]) &lt;br /&gt;
    --&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIgnoreTrackingError&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID, bool ignore ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039; &lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20945</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20945"/>
		<updated>2021-03-03T23:24:06Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateFeature&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} heading {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} AllyTeamID {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} featureID&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferFeature&lt;br /&gt;
|arg1 = {{type|number}} featureDefID&lt;br /&gt;
|arg2 = {{type|number}} teamID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} health&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = {{type|number}} energy {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimTime {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureReclaim&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} reclaimLeft&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} &amp;quot;facing&amp;quot; {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} snapToGround {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{New|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMoveCtrl&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} enable {{bracket}}&lt;br /&gt;
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is true:&amp;lt;br&amp;gt;{{bracket}}, velVector(x,y,z) -- initial velocity for feature&amp;lt;br&amp;gt;{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If enable is false:&amp;lt;br&amp;gt;{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&amp;lt;br&amp;gt;{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} noSelect &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|bool}} enable&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} primaryAxis {{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}} &lt;br /&gt;
|arg4 = {{type|bool}} relative&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} mass&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt; Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
see [[Lua CMDs]] for relevant constants&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Example code:&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSquareBuildingMask&#039;&#039;&#039; {{new|103.0}}&lt;br /&gt;
  ( number x, number z, int mask ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
an ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade [, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
  Prior to 104.0 it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
  Post 104.0 it is the raw change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnExplosion&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    table explosionParams&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot; | number cegID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnSFX&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number unitID, number sfxID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
    [, boolean absolute ]&lt;br /&gt;
  ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DeleteProjectile&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
Silently removes projectiles (no explosion).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number targetType]]  |  [number posX, number posY, number posZ]) &lt;br /&gt;
    --&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIgnoreTrackingError&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID, bool ignore ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039; &lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20944</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20944"/>
		<updated>2021-03-03T20:33:36Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: /* Unit Resourcing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} blocking {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} collide {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} crushable {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Old callout (see below), crushable new in version 85.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = {{type|number}} amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateFeature&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number featureDefID, &lt;br /&gt;
    number x, number y, number z&lt;br /&gt;
    [, number heading &lt;br /&gt;
    [, number AllyTeamID &lt;br /&gt;
    [, number featureID ]]] ) -&amp;gt; number featureID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number health) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResources&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number metal, number energy [, number reclaimTime [, number reclaimLeft ]] )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureReclaim&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number reclaimLeft) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number unitDefID | string unitDefName [, number facing | string &amp;quot;facing&amp;quot; [, number progress ]] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z [, boolean snapToGround]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRotation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureVelocity&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePhysics&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
(like their feature counterparts at [[Lua_SyncedCtrl#Unit_Control]])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMoveCtrl&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID [, boolean enable [, number* args]]) to control feature movement&lt;br /&gt;
   the number* arguments are parsed as follows and all optional&lt;br /&gt;
   if enable is true:&lt;br /&gt;
     [, velVector(x,y,z) -- initial velocity for feature&lt;br /&gt;
     [, accVector(x,y,z) -- acceleration added every frame&lt;br /&gt;
     ]]&lt;br /&gt;
   if enable is false:&lt;br /&gt;
     [, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&lt;br /&gt;
     [,  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&lt;br /&gt;
     [, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl&lt;br /&gt;
     ]]]&lt;br /&gt;
&lt;br /&gt;
As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitCollisionVolumeData for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number pieceIndex, boolean enable, &lt;br /&gt;
    number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetZ&lt;br /&gt;
    [, number volumeType [, number primaryAxis]]&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMidAndAimPos&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, &lt;br /&gt;
    number mpx, number mpy, number mpz, &lt;br /&gt;
    number apx, number apy, number apz, &lt;br /&gt;
    [, boolean relative] ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitMidAndAimPos for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRadiusAndHeight&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, number radius, number height ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number mass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID, boolean blocking, boolean collidable) --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number featureID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
see [[Lua CMDs]] for relevant constants&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Example code:&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSquareBuildingMask&#039;&#039;&#039; {{new|103.0}}&lt;br /&gt;
  ( number x, number z, int mask ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
an ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade [, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
  Prior to 104.0 it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
  Post 104.0 it is the raw change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnExplosion&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    table explosionParams&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot; | number cegID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnSFX&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number unitID, number sfxID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
    [, boolean absolute ]&lt;br /&gt;
  ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DeleteProjectile&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
Silently removes projectiles (no explosion).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number targetType]]  |  [number posX, number posY, number posZ]) &lt;br /&gt;
    --&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIgnoreTrackingError&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID, bool ignore ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039; &lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20943</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20943"/>
		<updated>2021-03-03T20:32:18Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} blocking {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} collide {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} crushable {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Old callout (see below), crushable new in version 85.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {{type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = number amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateFeature&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number featureDefID, &lt;br /&gt;
    number x, number y, number z&lt;br /&gt;
    [, number heading &lt;br /&gt;
    [, number AllyTeamID &lt;br /&gt;
    [, number featureID ]]] ) -&amp;gt; number featureID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number health) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResources&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number metal, number energy [, number reclaimTime [, number reclaimLeft ]] )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureReclaim&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number reclaimLeft) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number unitDefID | string unitDefName [, number facing | string &amp;quot;facing&amp;quot; [, number progress ]] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z [, boolean snapToGround]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRotation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureVelocity&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePhysics&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
(like their feature counterparts at [[Lua_SyncedCtrl#Unit_Control]])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMoveCtrl&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID [, boolean enable [, number* args]]) to control feature movement&lt;br /&gt;
   the number* arguments are parsed as follows and all optional&lt;br /&gt;
   if enable is true:&lt;br /&gt;
     [, velVector(x,y,z) -- initial velocity for feature&lt;br /&gt;
     [, accVector(x,y,z) -- acceleration added every frame&lt;br /&gt;
     ]]&lt;br /&gt;
   if enable is false:&lt;br /&gt;
     [, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&lt;br /&gt;
     [,  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&lt;br /&gt;
     [, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl&lt;br /&gt;
     ]]]&lt;br /&gt;
&lt;br /&gt;
As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitCollisionVolumeData for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number pieceIndex, boolean enable, &lt;br /&gt;
    number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetZ&lt;br /&gt;
    [, number volumeType [, number primaryAxis]]&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMidAndAimPos&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, &lt;br /&gt;
    number mpx, number mpy, number mpz, &lt;br /&gt;
    number apx, number apy, number apz, &lt;br /&gt;
    [, boolean relative] ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitMidAndAimPos for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRadiusAndHeight&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, number radius, number height ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number mass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID, boolean blocking, boolean collidable) --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number featureID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
see [[Lua CMDs]] for relevant constants&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Example code:&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSquareBuildingMask&#039;&#039;&#039; {{new|103.0}}&lt;br /&gt;
  ( number x, number z, int mask ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
an ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade [, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
  Prior to 104.0 it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
  Post 104.0 it is the raw change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnExplosion&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    table explosionParams&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot; | number cegID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnSFX&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number unitID, number sfxID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
    [, boolean absolute ]&lt;br /&gt;
  ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DeleteProjectile&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
Silently removes projectiles (no explosion).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number targetType]]  |  [number posX, number posY, number posZ]) &lt;br /&gt;
    --&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIgnoreTrackingError&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID, bool ignore ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039; &lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20942</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20942"/>
		<updated>2021-03-03T20:28:36Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} blocking {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} collide {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} crushable {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Old callout (see below), crushable new in version 85.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for more info on the arguments.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSensorRadius&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} type&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius&lt;br /&gt;
|info = Type can be:&amp;lt;br&amp;gt;&amp;quot;los&amp;quot;, &amp;quot;airLos&amp;quot;, &amp;quot;radar&amp;quot;, &amp;quot;sonar&amp;quot;, &amp;quot;seismic&amp;quot;, &amp;quot;radarJammer&amp;quot;, &amp;quot;sonarJammer&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} baseErrorSize {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,&lt;br /&gt;
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitResourcing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { res = number amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  Possible values for res are: &amp;quot;[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]&amp;quot;&amp;lt;br&amp;gt;unconditional {{pipe}} conditional&amp;lt;br&amp;gt;use {{pipe}} make&amp;lt;br&amp;gt;metal {{pipe}} energy&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string }} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;e&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseUnitResource&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = { {{bracket}} &amp;quot;m&amp;quot; {{pipe}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;e&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; {{rbracket}} = amount, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} okay&lt;br /&gt;
|info =  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHarvestStorage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} metal&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info =  {{new|97.0}}&amp;lt;br&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateFeature&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number featureDefID, &lt;br /&gt;
    number x, number y, number z&lt;br /&gt;
    [, number heading &lt;br /&gt;
    [, number AllyTeamID &lt;br /&gt;
    [, number featureID ]]] ) -&amp;gt; number featureID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number health) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResources&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number metal, number energy [, number reclaimTime [, number reclaimLeft ]] )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureReclaim&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number reclaimLeft) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number unitDefID | string unitDefName [, number facing | string &amp;quot;facing&amp;quot; [, number progress ]] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z [, boolean snapToGround]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRotation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureVelocity&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePhysics&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
(like their feature counterparts at [[Lua_SyncedCtrl#Unit_Control]])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMoveCtrl&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID [, boolean enable [, number* args]]) to control feature movement&lt;br /&gt;
   the number* arguments are parsed as follows and all optional&lt;br /&gt;
   if enable is true:&lt;br /&gt;
     [, velVector(x,y,z) -- initial velocity for feature&lt;br /&gt;
     [, accVector(x,y,z) -- acceleration added every frame&lt;br /&gt;
     ]]&lt;br /&gt;
   if enable is false:&lt;br /&gt;
     [, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&lt;br /&gt;
     [,  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&lt;br /&gt;
     [, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl&lt;br /&gt;
     ]]]&lt;br /&gt;
&lt;br /&gt;
As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitCollisionVolumeData for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number pieceIndex, boolean enable, &lt;br /&gt;
    number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetZ&lt;br /&gt;
    [, number volumeType [, number primaryAxis]]&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMidAndAimPos&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, &lt;br /&gt;
    number mpx, number mpy, number mpz, &lt;br /&gt;
    number apx, number apy, number apz, &lt;br /&gt;
    [, boolean relative] ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitMidAndAimPos for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRadiusAndHeight&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, number radius, number height ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number mass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID, boolean blocking, boolean collidable) --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number featureID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
see [[Lua CMDs]] for relevant constants&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Example code:&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSquareBuildingMask&#039;&#039;&#039; {{new|103.0}}&lt;br /&gt;
  ( number x, number z, int mask ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
an ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade [, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
  Prior to 104.0 it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
  Post 104.0 it is the raw change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnExplosion&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    table explosionParams&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot; | number cegID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnSFX&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number unitID, number sfxID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
    [, boolean absolute ]&lt;br /&gt;
  ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DeleteProjectile&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
Silently removes projectiles (no explosion).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number targetType]]  |  [number posX, number posY, number posZ]) &lt;br /&gt;
    --&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIgnoreTrackingError&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID, bool ignore ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039; &lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20941</id>
		<title>User:Master-athmos</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=User:Master-athmos&amp;diff=20941"/>
		<updated>2021-03-03T03:25:34Z</updated>

		<summary type="html">&lt;p&gt;Master-athmos: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|boolean}} isBlocking&lt;br /&gt;
|arg3 = {{type|boolean}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|boolean}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|boolean}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|boolean}} crushable&lt;br /&gt;
|arg7 = {{type|boolean}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|boolean}} blockHeightChanges&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket|{{type|number}} repairSpeed}}&lt;br /&gt;
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}&lt;br /&gt;
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}&lt;br /&gt;
|arg6 = {{bracket|{{type|number}} captureSpeed}}&lt;br /&gt;
|arg7 = {{bracket|{{type|number}} terraformSpeed}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed&lt;br /&gt;
|arg3 = {{bracket}}{{type|number}} repairSpeed&lt;br /&gt;
|arg4 = {{bracket}}{{type|number}} reclaimSpeed&lt;br /&gt;
|arg5 = {{bracket}}{{type|number}} resurrectSpeed&lt;br /&gt;
|arg6 = {{bracket}}{{type|number}} captureSpeed&lt;br /&gt;
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;font color=&amp;quot;maroon&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;No description available&amp;lt;/font&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
= Game End =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = KillTeam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare a team to be dead ( no further orders can be assigned to such teams&#039;s units ), Gaia team cannot be killed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID1&lt;br /&gt;
|arg2 = {{type|number}} allyTeamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|83.0}}&amp;lt;br&amp;gt; Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= RulesParams =&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=note&amp;gt;Possible keys for the losAccess table are:&lt;br /&gt;
    `private` : only readable by the ally (default)&lt;br /&gt;
    `allied`  : readable by ally + ingame allied&lt;br /&gt;
    `inlos`   : readable if the unit is in LOS&lt;br /&gt;
    `inradar` : readable if the unit is in AirLOS&lt;br /&gt;
    `public`  : readable by all&lt;br /&gt;
   note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it&amp;lt;br/&amp;gt;     can read params with `inradar=true` even if the param has `inlos=false`)&lt;br /&gt;
   note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`&amp;lt;br/&amp;gt;     and/or `public`&lt;br /&gt;
   note3: You can read RulesParams from &#039;&#039;&#039;any&#039;&#039;&#039; Lua enviroments! With those losAccess&amp;lt;br/&amp;gt;     policies you can limit their access.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=warning&amp;gt;New since 102.0.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} paramName&lt;br /&gt;
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg4 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGameRulesParam&lt;br /&gt;
|arg1 = {{type|string}} paramName&lt;br /&gt;
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}} &lt;br /&gt;
|arg3 = {{type|table}} losAccess {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = See above for further documentation of losAccess.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Resources =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Adds metal or energy resources to the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UseTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough&lt;br /&gt;
|info = Consumes metal and/or energy resources of the specified team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} res&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Possible values for res are:&amp;lt;br&amp;gt;&amp;quot;m&amp;quot;  = metal&amp;lt;br&amp;gt;&amp;quot;e&amp;quot;  = energy&amp;lt;br&amp;gt;&amp;quot;ms&amp;quot;  = metal storage&amp;lt;br&amp;gt;&amp;quot;es&amp;quot;  = energy storage&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetTeamShareLevel&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg3 = {{type|number}} amount&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Changes the resource amount for a team beyond which resources aren&#039;t stored but transferred to other allied teams if possible.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ShareTeamResource&lt;br /&gt;
|arg1 = {{type|number}} teamID_src&lt;br /&gt;
|arg2 = {{type|number}} teamID_recv&lt;br /&gt;
|arg3 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot;&lt;br /&gt;
|arg4 = {{type|number}} amount&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Transfers resources between two teams.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Teams =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetAlly&lt;br /&gt;
|arg1 = {{type|number}} firstAllyTeamID&lt;br /&gt;
|arg2 = {{type|number}} secondAllyTeamID&lt;br /&gt;
|arg3 = {{type|bool}} ally&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Changes the value of the (one-sided) alliance between: firstAllyTeamID -&amp;gt; secondAllyTeamID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AssignPlayerToTeam&lt;br /&gt;
|arg1 = {{type|number}} playerID&lt;br /&gt;
|arg2 = {{type|number}} teamID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|98.0}}&amp;lt;br&amp;gt;Assigns a player to a team.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetGlobalLos&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = {{type|bool}} globallos &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes access to global line of sight for a team and its allies.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Unit Handling =&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = CreateUnit&lt;br /&gt;
|arg1 = {{type|string}} &amp;quot;defName&amp;quot; {{pipe}} {{type|number }} unitDefID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = {{type|string}} &amp;quot;facing&amp;quot; {{pipe}} {{type|number }} facing &lt;br /&gt;
|arg6 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg7 = {{type|bool}} build = false {{bracket}} &lt;br /&gt;
|arg8 = {{type|bool}} flattenGround = true {{bracket}} &lt;br /&gt;
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)&lt;br /&gt;
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.&amp;lt;br&amp;gt;Possible values for facing are:&amp;lt;br&amp;gt;&amp;quot;south&amp;quot; {{pipe}} &amp;quot;s&amp;quot; {{pipe}} 0&amp;lt;br&amp;gt;&amp;quot;east&amp;quot;  {{pipe}} &amp;quot;e&amp;quot; {{pipe}} 1&amp;lt;br&amp;gt;&amp;quot;north&amp;quot; {{pipe}} &amp;quot;n&amp;quot; {{pipe}} 2&amp;lt;br&amp;gt;&amp;quot;west&amp;quot;  {{pipe}} &amp;quot;w&amp;quot; {{pipe}} 3&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;If build is true, the unit is created in &amp;quot;being built&amp;quot; state with buildProgress = 0&amp;lt;br&amp;gt;unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = DestroyUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}} &lt;br /&gt;
|arg2 = {{type|bool}} selfd = false {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} reclaimed = false {{bracket}} &lt;br /&gt;
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}} &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = selfd := Makes the unit act like it self-destructed.&amp;lt;br&amp;gt;reclaimed := Don&#039;t show any DeathSequences, don&#039;t leave a wreckage. This does not give back the resources to the team!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = TransferUnit&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} newTeamID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} given = true {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If given=false, the unit is captured.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit Control ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCosts&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTooltip&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;tooltip&amp;quot;&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}&lt;br /&gt;
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}&lt;br /&gt;
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}&lt;br /&gt;
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxHealth&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} maxHealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitDamage&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} damage {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} paralyze = 0 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} attackerID = -1 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} impulse_x {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} impulse_y {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStockpile&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} stockpile {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitExperience&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} experience &lt;br /&gt;
|arg3 = {{type|number}} buildPercent&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFuel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} fuel &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCrashing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} crashing &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLineage&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} teamID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} isRoot {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNeutral&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} neutral&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{removed|83.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x {{pipe}} {{type|nil}} &lt;br /&gt;
|arg3 = {{type|number}} y &lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg6 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} dgun = false {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} userTarget = false {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = Defines a unit&#039;s target. Nil as 2nd argument drops the unit&#039;s current target.&amp;lt;br&amp;gt;&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;UserTarget &amp;amp; success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMaxRange&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} maxRange&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMass&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mass &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} blocking {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} collide {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} crushable {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Old callout (see below), crushable new in version 85.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBlocking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} isblocking&lt;br /&gt;
|arg3 = {{type|bool}} isSolidObjectCollidable&lt;br /&gt;
|arg4 = {{type|bool}} isProjectileCollidable&lt;br /&gt;
|arg5 = {{type|bool}} isRaySegmentCollidable&lt;br /&gt;
|arg6 = {{type|bool}} crushable&lt;br /&gt;
|arg7 = {{type|bool}} blockEnemyPushing&lt;br /&gt;
|arg8 = {{type|bool}} blockHeightChanges&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Changed parameters.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} depth {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Parameter &amp;quot;depth&amp;quot; corresponds to metal extraction rate. Range value is similar to &amp;quot;extractsMetal&amp;quot; in unitDefs.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitBuildSpeed&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|number}} buildSpeed {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} repairSpeed {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} reclaimSpeed{{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} resurrectSpeed {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} captureSpeed {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitNanoPieces&lt;br /&gt;
|arg1 = {{type|number}} builderID&lt;br /&gt;
|arg2 = {{type|table}} pieces {{bracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|92.0}}&amp;lt;br&amp;gt;This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end&amp;lt;br&amp;gt;Use it!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitAttach&lt;br /&gt;
|arg1 = {{type|number}} transporterID&lt;br /&gt;
|arg2 = {{type|number}} passengerID&lt;br /&gt;
|arg3 = {{type|number}} pieceNum &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetach&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitDetachFromAir&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLoadingTransport&lt;br /&gt;
|arg1 = {{type|number}} passengerID &lt;br /&gt;
|arg2 = {{type|number}} transportID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Disables collisions between the two units to allow colvol intersection during the approach.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceParent&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} AlteredPiece&lt;br /&gt;
|arg3 = {{type|number}} ParentPiece &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Changes the pieces hierarchy of a unit by attaching a piece to a new parent.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum&lt;br /&gt;
|arg3 = {{type|table }} matrix &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitArmored&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} armored {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} armorMultiple {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;armorMultiple new in version 0.83.x&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitShieldState&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} weaponID = -1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} enabled {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;mode&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} mode &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;moveFactor&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} factor&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;minDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} minDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;maxDamage&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} maxDamage &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitFlanking&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;dir&amp;quot;&lt;br /&gt;
|arg3 = {{type|number }} x&lt;br /&gt;
|arg4 = {{type|number }} y&lt;br /&gt;
|arg5 = {{type|number }} z&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|table }} states &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string }} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the states table:&lt;br /&gt;
    {&lt;br /&gt;
      [&amp;quot;reloadState&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;reloadFrame&amp;quot;     = number value,] (synonym for reloadState!)&lt;br /&gt;
      [&amp;quot;reloadTime&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;accuracy&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;sprayAngle&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;range&amp;quot;           = number value,] (*)&lt;br /&gt;
      [&amp;quot;projectileSpeed&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;burst&amp;quot;           = number value,]&lt;br /&gt;
      [&amp;quot;burstRate&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;projectiles&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;salvoLeft&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;nextSalvo&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;aimReady&amp;quot;        = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
    }&lt;br /&gt;
  (*) if you change the range of a weapon with dynamic damage&lt;br /&gt;
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|table}} damages &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} key&lt;br /&gt;
|arg4 = {{type|number}} value&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ&lt;br /&gt;
|arg4 = {{type|number}} vType&lt;br /&gt;
|arg5 = {{type|number}} tType&lt;br /&gt;
|arg6 = {{type|number}} Axis&lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;enum COLVOL_TYPES {&lt;br /&gt;
      COLVOL_TYPE_DISABLED = -1,&lt;br /&gt;
      COLVOL_TYPE_ELLIPSOID = 0,&lt;br /&gt;
      COLVOL_TYPE_CYLINDER,&lt;br /&gt;
      COLVOL_TYPE_BOX,&lt;br /&gt;
      COLVOL_TYPE_SPHERE,&lt;br /&gt;
      COLVOL_NUM_TYPES       // number of non-disabled collision volume types&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_TESTS {&lt;br /&gt;
      COLVOL_TEST_DISC = 0,&lt;br /&gt;
      COLVOL_TEST_CONT = 1,&lt;br /&gt;
      COLVOL_NUM_TESTS = 2   // number of tests&lt;br /&gt;
    };&lt;br /&gt;
    enum COLVOL_AXES {&lt;br /&gt;
      COLVOL_AXIS_X   = 0,&lt;br /&gt;
      COLVOL_AXIS_Y   = 1,&lt;br /&gt;
      COLVOL_AXIS_Z   = 2,&lt;br /&gt;
      COLVOL_NUM_AXES = 3    // number of collision volume axes&lt;br /&gt;
    };&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceIndex&lt;br /&gt;
|arg3 = {{type|bool}} enable&lt;br /&gt;
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ&lt;br /&gt;
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} volumeType {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitTravel&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} travel {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} travelPeriod {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMoveGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} moveSpeed {{bracket}}&lt;br /&gt;
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Used by default commands to get in build-, attackrange etc.&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;{{new|98.0}} &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLandGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} goalRadius {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|101.0}}&amp;lt;br&amp;gt;Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase &amp;amp; fuel system in Lua.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ClearUnitGoal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|102.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPhysics&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ&lt;br /&gt;
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ&lt;br /&gt;
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Drag new in version 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitPosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = {{new|90.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitVelocity&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} velX&lt;br /&gt;
|arg3 = {{type|number}} velY&lt;br /&gt;
|arg4 = {{type|number}} velZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRotation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} rotX&lt;br /&gt;
|arg3 = {{type|number}} rotY&lt;br /&gt;
|arg4 = {{type|number}} rotZ&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitImpulse&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} x&lt;br /&gt;
|arg3 = {{type|number}} y&lt;br /&gt;
|arg4 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} decayRate {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AddUnitSeismicPing&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pingSize &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = RemoveBuildingDecal&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitMidAndAimPos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ&lt;br /&gt;
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} relative {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&amp;lt;br&amp;gt;mpx, mpy, mpz: New middle position of unit&amp;lt;br&amp;gt;apx, apy, apz: New position that enemies aim at on this unit&amp;lt;br&amp;gt;relative: Are the new coordinates relative to world or unit coordinates?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitRadiusAndHeight&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} radius&lt;br /&gt;
|arg3 = {type|number}} height&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} success&lt;br /&gt;
|info = {{new|89.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = UnitWeaponHoldFire&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} weaponID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unit LOS ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitCloak&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = If the 2nd argument is a number, the value works like this:&amp;lt;br&amp;gt;1:=normal cloak&amp;lt;br&amp;gt;2:=for free cloak (cost no E)&amp;lt;br&amp;gt;3:=for free + no decloaking (except the unit is stunned)&amp;lt;br&amp;gt;4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;The decloak distance is only changed:&amp;lt;br&amp;gt;- if the 3th argument is a number or a boolean.&amp;lt;br&amp;gt;- if the boolean is false it takes the default decloak distance for that unitdef,&amp;lt;br&amp;gt;- if the boolean is true it takes the absolute value of it.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitSonarStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} sonarStealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitStealth&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} stealth &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitAlwaysVisible&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|bool}} alwaysVisible &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = SetUnitLosMask&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyTeam&lt;br /&gt;
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = The 3rd argument is either the bit-and combination of the following numbers:&amp;lt;br&amp;gt;LOS_INLOS     = 1&amp;lt;br&amp;gt;LOS_INRADAR   = 2&amp;lt;br&amp;gt;LOS_PREVLOS   = 4&amp;lt;br&amp;gt;LOS_CONTRADAR = 8&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;or a table of the following form:&amp;lt;br&amp;gt;losTypes = {&amp;lt;br&amp;gt;[los = boolean,]&amp;lt;br&amp;gt;[radar = boolean,]&amp;lt;br&amp;gt;[prevLos = boolean,]&amp;lt;br&amp;gt;[contRadar = boolean]&amp;lt;br&amp;gt;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitLosState&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number allyTeam, number los | table losTypes ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;see above for more info on the arguments&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitSensorRadius&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string type, number radius ) -&amp;gt; nil | number newRadius&lt;br /&gt;
  &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;type can be:&lt;br /&gt;
  &amp;quot;los&amp;quot;,&amp;quot;airLos&amp;quot;,&amp;quot;radar&amp;quot;,&amp;quot;sonar&amp;quot;,&amp;quot;seismic&amp;quot;,&amp;quot;radarJammer&amp;quot;,&amp;quot;sonarJammer&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetRadarErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number allyTeamID, number allyteamErrorSize &lt;br /&gt;
  [, number baseErrorSize [, number baseErrorMult ]]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitPosErrorParams&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  (number unitID, number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,&lt;br /&gt;
  number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z&lt;br /&gt;
  [ , number nextPosErrorUpdate]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Unit Resourcing ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitResourcing&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    string res, number amount |&lt;br /&gt;
    { res = number amount, ... }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for res are: &amp;quot;[u|c][u|m][m|e]&amp;quot;&lt;br /&gt;
       unconditional | conditional&lt;br /&gt;
                 use | make&lt;br /&gt;
               metal | energy&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AddUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.UseUnitResource&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string &amp;quot;m&amp;quot; | &amp;quot;e&amp;quot;, number amount ) -&amp;gt; nil | boolean okay&lt;br /&gt;
  ( number unitID, { [&amp;quot;m&amp;quot; | &amp;quot;metal&amp;quot; | &amp;quot;e&amp;quot; | &amp;quot;energy&amp;quot;] = amount, ... } ) -&amp;gt; nil | boolean okay&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitHarvestStorage&#039;&#039;&#039; {{new|97.0}}&lt;br /&gt;
  ( number unitid, number metal )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;note&amp;quot;&amp;gt;See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Feature Handling =&lt;br /&gt;
&#039;&#039;&#039;Spring.CreateFeature&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;defName&amp;quot; | number featureDefID, &lt;br /&gt;
    number x, number y, number z&lt;br /&gt;
    [, number heading &lt;br /&gt;
    [, number AllyTeamID &lt;br /&gt;
    [, number featureID ]]] ) -&amp;gt; number featureID&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DestroyFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.TransferFeature&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number teamID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feature Control ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureHealth&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number health) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResources&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number featureID, number metal, number energy [, number reclaimTime [, number reclaimLeft ]] )&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureReclaim&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number reclaimLeft) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureResurrect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number unitDefID | string unitDefName [, number facing | string &amp;quot;facing&amp;quot; [, number progress ]] ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  possible values for facing are:&lt;br /&gt;
    &amp;quot;south&amp;quot; | &amp;quot;s&amp;quot; | 0&lt;br /&gt;
    &amp;quot;east&amp;quot;  | &amp;quot;e&amp;quot; | 1&lt;br /&gt;
    &amp;quot;north&amp;quot; | &amp;quot;n&amp;quot; | 2&lt;br /&gt;
    &amp;quot;west&amp;quot;  | &amp;quot;w&amp;quot; | 3&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z [, boolean snapToGround]) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureDirection&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRotation&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number x, number y, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureVelocity&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePhysics&#039;&#039;&#039; {{New|95.0}}&lt;br /&gt;
&lt;br /&gt;
(like their feature counterparts at [[Lua_SyncedCtrl#Unit_Control]])&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMoveCtrl&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID [, boolean enable [, number* args]]) to control feature movement&lt;br /&gt;
   the number* arguments are parsed as follows and all optional&lt;br /&gt;
   if enable is true:&lt;br /&gt;
     [, velVector(x,y,z) -- initial velocity for feature&lt;br /&gt;
     [, accVector(x,y,z) -- acceleration added every frame&lt;br /&gt;
     ]]&lt;br /&gt;
   if enable is false:&lt;br /&gt;
     [, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl&lt;br /&gt;
     [,  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl&lt;br /&gt;
     [, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl&lt;br /&gt;
     ]]]&lt;br /&gt;
&lt;br /&gt;
As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use &amp;quot;Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)&amp;quot; to unlock all movement prior to making SetFeatureVelocity calls.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureNoSelect&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean noSelect ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureAlwaysVisible&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureCollisionVolumeData&#039;&#039;&#039;&lt;br /&gt;
  ( number featureID, number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetX,&lt;br /&gt;
    number vType, number tType, number Axis&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitCollisionVolumeData for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeaturePieceCollisionVolumeData&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number pieceIndex, boolean enable, &lt;br /&gt;
    number scaleX, number scaleY, number scaleZ,&lt;br /&gt;
    number offsetX, number offsetY, number offsetZ&lt;br /&gt;
    [, number volumeType [, number primaryAxis]]&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMidAndAimPos&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, &lt;br /&gt;
    number mpx, number mpy, number mpz, &lt;br /&gt;
    number apx, number apy, number apz, &lt;br /&gt;
    [, boolean relative] ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;check Spring.SetUnitMidAndAimPos for further explanation of the arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureRadiusAndHeight&#039;&#039;&#039; {{new|89.0}}&lt;br /&gt;
  ( number unitID, number radius, number height ) -&amp;gt; boolean success&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureMass&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number featureID, number mass ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039;&lt;br /&gt;
  (number featureID, boolean blocking, boolean collidable) --&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetFeatureBlocking&#039;&#039;&#039; {{new|95.0}} changed parameters:&lt;br /&gt;
  number featureID,&lt;br /&gt;
  boolean isBlocking,&lt;br /&gt;
  boolean isSolidObjectCollidable,&lt;br /&gt;
  boolean isProjectileCollidable,&lt;br /&gt;
  boolean isRaySegmentCollidable,&lt;br /&gt;
  boolean crushable,&lt;br /&gt;
  boolean blockEnemyPushing,&lt;br /&gt;
  boolean blockHeightChanges&lt;br /&gt;
&lt;br /&gt;
= Lua to COB =&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScript&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.CallCOBScriptCB&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font style=&amp;quot;color:red;font-weight:600&amp;quot;&amp;gt;broken in 0.78.2.1; will be removed with the introduction of Lua as COB replacement&amp;lt;/font&amp;gt;&lt;br /&gt;
  ( number unitID, number funcID | string funcName, number retArgs, COBArg1, COBArg2, ... )&lt;br /&gt;
    -&amp;gt; nil | number returnValue, number CallbackData, number retArg1, number retArg2, ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetCOBScriptID&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, string funcName ) -&amp;gt; nil | number funcID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Note: Don&#039;t use Spring.[Get|Set]UnitCOBValue in LUS just because you are familar with it since bos/cob, use the mighty LuaSpringAPI instead!&amp;lt;/b&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GetUnitCOBValue&#039;&#039;&#039; &lt;br /&gt;
  ( number unitID [, boolean splitData=false], number COBValue&lt;br /&gt;
    [, number param1 [,number param2 [, number param3 [, number param4 ] ] ] ] )&lt;br /&gt;
  -&amp;gt; number result | number result1, number result2&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitCOBValue&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number COBValue, number param1 [,number param2] ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;you find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]&amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span class=note&amp;gt; also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Give Order =&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)&amp;lt;br&amp;gt;&lt;br /&gt;
see [[Lua CMDs]] for relevant constants&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnit&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID,&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [unitID] = dontCare, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = unitID, etc... },&lt;br /&gt;
    number cmdID,&lt;br /&gt;
    params = {number, etc...},&lt;br /&gt;
    options = {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;} ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitMap&#039;&#039;&#039;&lt;br /&gt;
  ( unitMap = { [number unitID] = dontCare, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},     &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.GiveOrderArrayToUnitArray&#039;&#039;&#039;&lt;br /&gt;
  ( unitArray = { [1] = number unitID, etc... },&lt;br /&gt;
    orderArray = {&lt;br /&gt;
      { number cmdID,&lt;br /&gt;
        {number, etc...},    &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;params&amp;lt;/font&amp;gt;&lt;br /&gt;
        {&amp;quot;alt&amp;quot;, &amp;quot;ctrl&amp;quot;, &amp;quot;shift&amp;quot;, &amp;quot;right&amp;quot;}   &amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;options&amp;lt;/font&amp;gt;&lt;br /&gt;
      }, ..&lt;br /&gt;
    }&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
=Ground=&lt;br /&gt;
== Grass ==&lt;br /&gt;
&#039;&#039;&#039;Spring.AddGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveGrass&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
== Heightmap ==&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Note that x &amp;amp; z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(heightmap[x][z] += height;)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertHeightMap&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMapFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Example code:&amp;lt;/span&amp;gt;&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Spring.SetHeightMapFunc(function()&lt;br /&gt;
	for z=0,Game.mapSizeZ, Game.squareSize do&lt;br /&gt;
		for x=0,Game.mapSizeX, Game.squareSize do&lt;br /&gt;
			Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Spring.AddHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetHeightMap&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetHeightMapFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;the terraform argument is a scaling factor:&lt;br /&gt;
so if 0 nothing will be changed (the terraform starts) and if it is 1 the terraform will be finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.LevelSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.AdjustSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number height ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.RevertSmoothMesh&#039;&#039;&#039;&lt;br /&gt;
  ( number x1, number z1 [, number x2, number z2], number origFactor ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMeshFunc&#039;&#039;&#039;&lt;br /&gt;
  ( lua_function [, arg1 ,[ arg2 [, ... ] ] ) -&amp;gt; nil | number absTotalHeightMapAmountChanged&lt;br /&gt;
&#039;&#039;&#039;Spring.AddSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt; &lt;br /&gt;
  ( number x, number z, number height ) -&amp;gt; nil | number newHeight&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSmoothMesh&#039;&#039;&#039; &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;can only be called in SetSmoothMeshFunc()&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number x, number z, number height [,number terraform = 1] ) -&amp;gt; nil | number absHeightDiff&lt;br /&gt;
&lt;br /&gt;
== TerrainTypes ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMapSquareTerrainType&#039;&#039;&#039;&lt;br /&gt;
  ( number x, number z, int newType ) -&amp;gt; nil | int oldType&lt;br /&gt;
&#039;&#039;&#039;Spring.SetTerrainTypeData&#039;&#039;&#039;&lt;br /&gt;
  ( int typeIndex&lt;br /&gt;
  [, number speedTanks = nil ]&lt;br /&gt;
  [, number speedKBOTs = nil ]&lt;br /&gt;
  [, number speedHovers = nil ]&lt;br /&gt;
  [, number speedShips = nil ] ) -&amp;gt; nil | boolean true&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetSquareBuildingMask&#039;&#039;&#039; {{new|103.0}}&lt;br /&gt;
  ( number x, number z, int mask ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.&lt;br /&gt;
&lt;br /&gt;
== MetalAmount ==&lt;br /&gt;
&#039;&#039;&#039;Spring.SetMetalAmount&#039;&#039;&#039; {{new|83.0}}&lt;br /&gt;
  ( number x, number z, number metalAmount)&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;x &amp;amp; z coords are in worldspace/16&amp;lt;br&amp;gt;metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Command Descriptions =&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-size:120%; font-weight:600&amp;quot;&amp;gt;Doesn&#039;t work in unsynced code!&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.EditUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID, number cmdDescID, table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;&lt;br /&gt;
  structure of cmdArray:&lt;br /&gt;
  {&lt;br /&gt;
    [ id          = int ],&lt;br /&gt;
    [ type        = int ],&lt;br /&gt;
    [ name        = string ],&lt;br /&gt;
    [ action      = string ],&lt;br /&gt;
    [ tooltip     = string ],&lt;br /&gt;
    [ texture     = string ],&lt;br /&gt;
    [ cursor      = string ],&lt;br /&gt;
    [ queueing    = boolean ],&lt;br /&gt;
    [ hidden      = boolean ],&lt;br /&gt;
    [ disabled    = boolean ],&lt;br /&gt;
    [ showUnique  = boolean ],&lt;br /&gt;
    [ onlyTexture = boolean ],&lt;br /&gt;
    [ params      = { string = string, ... } ]&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.InsertUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] , table cmdArray ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.RemoveUnitCmdDesc&#039;&#039;&#039;&lt;br /&gt;
  ( number unitID [, number cmdDescID ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
= Other =&lt;br /&gt;
&#039;&#039;&#039;Spring.SetNoPause&#039;&#039;&#039;&lt;br /&gt;
  ( boolean noPause ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetUnitToFeature&#039;&#039;&#039;&lt;br /&gt;
  ( boolean tofeature ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
an ugly global switch that can be used to block units turning into features when they finish being built (like *A DT&#039;s do, which have the isFeature tag)&lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;p=481521 thread]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetExperienceGrade&#039;&#039;&#039;&lt;br /&gt;
  ( number expGrade [, number ExpPowerScale [, number ExpHealthScale [, number ExpReloadScale ]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  expGrade defines how often UnitExperience() will be called,&lt;br /&gt;
  Prior to 104.0 it is based on the following equation:&lt;br /&gt;
     (int) [exp/(exp+1)] / expGrade&lt;br /&gt;
  Post 104.0 it is the raw change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnExplosion&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    table explosionParams&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of explosionParams are:&lt;br /&gt;
    weaponDef = number,&lt;br /&gt;
    owner = number,&lt;br /&gt;
    hitUnit = number,&lt;br /&gt;
    hitFeature = number,&lt;br /&gt;
    craterAreaOfEffect = number,&lt;br /&gt;
    damageAreaOfEffect = number,&lt;br /&gt;
    edgeEffectiveness = number,&lt;br /&gt;
    explosionSpeed = number,&lt;br /&gt;
    gfxMod = number,&lt;br /&gt;
    impactOnly = boolean,&lt;br /&gt;
    ignoreOwner = boolean,&lt;br /&gt;
    damageGround = boolean,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Please note the explosion defaults to 1 damage regardless of what it&#039;s defined in the weaponDef.&lt;br /&gt;
The weapondefID is only used for visuals and for passing into callins like UnitDamaged&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnCEG&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;cegname&amp;quot; | number cegID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
  ) -&amp;gt; nil | boolean success, cegID&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;cegID new in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnSFX&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( number unitID, number sfxID,&lt;br /&gt;
    number posX = 0, number posY = 0, number posZ = 0,&lt;br /&gt;
    number dirX = 0, number dirY = 0, number dirZ = 0,&lt;br /&gt;
    number radius = 0, number damage = 0&lt;br /&gt;
    [, boolean absolute ]&lt;br /&gt;
  ) -&amp;gt; nil | boolean success&lt;br /&gt;
&lt;br /&gt;
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.&lt;br /&gt;
&lt;br /&gt;
= Projectiles =&lt;br /&gt;
&#039;&#039;&#039;Spring.SpawnProjectile&#039;&#039;&#039;&lt;br /&gt;
  ( number weaponDefID, table projectileParams ) -&amp;gt; nil | number projectileID&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;possible keys of projectileParams are:&lt;br /&gt;
    pos = {number x, number y, number z},&lt;br /&gt;
    end = {number x, number y, number z},&lt;br /&gt;
    speed = {number x, number y, number z},&lt;br /&gt;
    spread = {number x, number y, number z},&lt;br /&gt;
    error = {number x, number y, number z},&lt;br /&gt;
    owner = number,&lt;br /&gt;
    team = number,&lt;br /&gt;
    ttl = number,&lt;br /&gt;
    gravity = number,&lt;br /&gt;
    tracking = number,&lt;br /&gt;
    maxRange = number,&lt;br /&gt;
    startAlpha = number,&lt;br /&gt;
    endAlpha = number,&lt;br /&gt;
    model = string,&lt;br /&gt;
    cegTag = string,&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.DeleteProjectile&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
Silently removes projectiles (no explosion).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileTarget&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Pre 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID, string targetTypeStr ] | [ number posX, number posY, number posZ ] ) &lt;br /&gt;
    -&amp;gt; nil | boolean validTarget&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class = &amp;quot;warning&amp;quot;&amp;gt;Post 95.0:&amp;lt;/span&amp;gt;  ( number projectileID, &lt;br /&gt;
    [ number targetID [, number targetType]]  |  [number posX, number posY, number posZ]) &lt;br /&gt;
    --&amp;gt; nil | boolean validTarget&lt;br /&gt;
  &amp;lt;span class=note&amp;gt;targetTypeStr can be one of: &lt;br /&gt;
    &#039;u&#039; - unit&lt;br /&gt;
    &#039;f&#039; - feature&lt;br /&gt;
    &#039;p&#039; - projectile&lt;br /&gt;
  while targetTypeInt is one of:&lt;br /&gt;
    string.byte(&#039;g&#039;) := GROUND&lt;br /&gt;
    string.byte(&#039;u&#039;) := UNIT&lt;br /&gt;
    string.byte(&#039;f&#039;) := FEATURE&lt;br /&gt;
    string.byte(&#039;p&#039;) := PROJECTILE&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIgnoreTrackingError&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number projID, bool ignore ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileIsIntercepted&#039;&#039;&#039; {{new|99.0}}&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileMoveControl&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(disables engine movecontrol, so lua can fully control the physics)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( number projID, boolean enable ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectilePosition&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileVelocity&#039;&#039;&#039;&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0 ]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCollision&#039;&#039;&#039;&lt;br /&gt;
  ( number projID ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileGravity&#039;&#039;&#039; &lt;br /&gt;
  ( number projID [, number grav = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinAngle&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number spinAngle = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinSpeed&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number speed = 0] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileSpinVec&#039;&#039;&#039; {{new|95.0}} Deprecated&lt;br /&gt;
  ( number projID [, number x = 0 [, number y = 0 [, number z = 0]]] ) -&amp;gt; nil&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileCEG&#039;&#039;&#039;&lt;br /&gt;
  ( number projID, string ceg_name ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetPieceProjectileParams&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
  (number projectileID,&lt;br /&gt;
  [ number explosionFlags, [ number spinAngle, [ number spinSpeed,&lt;br /&gt;
  [ number spinVector.x, [ number spinVector.y, [ number spinVector.z ]]]]]]) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileAlwaysVisible&#039;&#039;&#039; {{new|95.0}} &lt;br /&gt;
    (number projectileID, boolean alwaysVisible) --&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Spring.SetProjectileDamages&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( number unitID, number weaponNum, table damages ) -&amp;gt; nil&lt;br /&gt;
  ( number unitID, number weaponNum, string key, number value ) -&amp;gt; nil&lt;br /&gt;
  &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;format of the damages table:&lt;br /&gt;
   {&lt;br /&gt;
      [&amp;quot;paralyzeDamageTime&amp;quot; = number value,]  &lt;br /&gt;
      [&amp;quot;impulseFactor&amp;quot;      = number value,]&lt;br /&gt;
      [&amp;quot;impulseBoost&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;craterMult&amp;quot;         = number value,]&lt;br /&gt;
      [&amp;quot;craterBoost&amp;quot;        = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageExp&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageMin&amp;quot;       = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageRange&amp;quot;     = number value,]&lt;br /&gt;
      [&amp;quot;dynDamageInverted&amp;quot;  = number value,] (&amp;lt;&amp;gt;0.0f := true)&lt;br /&gt;
      [&amp;quot;craterAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;damageAreaOfEffect&amp;quot; = number value,]&lt;br /&gt;
      [&amp;quot;edgeEffectiveness&amp;quot;  = number value,]&lt;br /&gt;
      [&amp;quot;explosionSpeed&amp;quot;     = number value,]&lt;br /&gt;
      [number armorType     = number value,] (changes the damage against this armor type)&lt;br /&gt;
    }&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Master-athmos</name></author>
	</entry>
</feed>