User:Master-athmos: Difference between revisions

From Spring
Jump to navigationJump to search
No edit summary
Replaced content with "Development < Lua Scripting < {{FULLPAGENAME}} <span class="warning">These functions are ONLY available if the graphic board supp..."
 
(19 intermediate revisions by the same user not shown)
Line 1: Line 1:
[[Engine_Development|Development]] < [[Lua_Scripting|Lua Scripting]] < {{FULLPAGENAME}}
[[Engine_Development|Development]] < [[Lua_Scripting|Lua Scripting]] < {{FULLPAGENAME}}


== Game ==
<span class="warning">These functions are ONLY available if the graphic board supports GLSL.<br><br> Please test in your scripts if one of them exists before you use them!</span>


=== Special TeamID Variables ===
<font color="red" style="font-weight:600">The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().</font><br>


'''gl.CreateShader'''
  ({[ vertex  = "glsl code" ,]
    [ tcs      = "glsl code" ,]
    [ tes      = "glsl code" ,]
    [ geometry = "glsl code" ,]
    [ fragment = "glsl code" ,]
    [ uniform      = { uniformName = number value, ...} ,] <span class=note>(specify a Lua array as an argument to uniformName to initialize GLSL arrays)</span>
    [ uniformInt    = { uniformName = number value, ...} ,] <span class=note>(specify a Lua array as an argument to uniformName to initialize GLSL arrays)</span>
    [ uniformFloat  = { uniformName = number value, ...} ,] <span class=note>(specify a Lua array as an argument to uniformName to initialize GLSL arrays)</span>
    [ uniformMatrix = { uniformName = number value, ...} ,]
    [ geoInputType = number inType,]
    [ geoOutputType = number outType,]
    [ geoOutputVerts = number maxVerts,]
    [ definitions = "string of shader #defines", ]
  }) -> number shaderID


{{LuaConstant
* The "Vertex" 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.
|type = number
|name = Spring.ALL_UNITS
* The "Geometry" or Geometry-shader can create new vertices and vertice-stripes from points.  
|info =
}}


* The "TCS" 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 >= 104.0.1-596 (maintenance), it's also available in develop branch of spring.


{{LuaConstant
* The "TES" 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 >= 104.0.1-596 (maintenance), it's also available in develop branch of spring.
|type = number
|name = Spring.MY_UNITS
|info =
}}


* The "Fragment" 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.


{{LuaConstant
* The Uniforms are the values, you send along with the shader-program. To use them in the shader-program declare them like this:
|type = number
<syntaxhighlight lang="c">uniform float frame;</syntaxhighlight>
|name = Spring.ALLY_UNITS
|info =  
}}


* From 101.0 onwards, the engine will automatically fill in an appropriately named uniform for team colour if it is declared;
<syntaxhighlight lang="c">uniform vec4 teamColor;</syntaxhighlight>


{{LuaConstant
'''gl.DeleteShader'''
|type = number
  ( number shaderID ) -> nil
|name = Spring.ENEMY_UNITS
|info =
}}


'''gl.ActiveShader''' <font color="#55ee99">can be used in NON-drawing events (to update uniforms etc.)!</font>
  ( number shaderID, function [, arg1 [, arg2, ..]] ) -> nil


{{LuaCallout
'''gl.UseShader'''
|prefix = Spring.
  ( number shaderID ) -> boolean linked
|name = GetGaiaTeamID
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} teamID
|info =
}}


=== GameStates ===
'''gl.GetShaderLog'''
  ( ) -> string "infoLog"


{{LuaCallout
'''gl.SetShaderParameter'''
|prefix = Spring.
<font color="#ff0000">Renamed to SetGeometryShaderParameter in spring version >= 104.0.1-596 (maintenance).</font>
|name = IsGodModeEnabled
<font color="#55ee99">needed by geometry shader programs (check the opengl GL_ARB_geometry_shader4 extension for glProgramParameteri)</font>
|arg1 =  
  ( number shaderID, number param, number value ) -> nil
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =  
}}


'''gl.SetTesselationShaderParameter'''
<font color="#0000ee">Available for spring versions >= 104.0.1-596 (maintenance).</font>
<font color="#55ee99">needed by tesselation shader programs (check the opengl GL_ARB_tessellation_shader extension for glProgramParameteri)</font>
  ( number param, number value ) -> nil


{{LuaCallout
'''gl.GetActiveUniforms'''
|prefix = Spring.
  ( number shaderID ) -> {  
|name = IsCheatingEnabled
      [1] = { name = "name", type = "type", length = number length, size = number size },
|arg1 =  
      ...
|arg2 =  
    }
|arg3 =  
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =
}}


'''gl.GetUniformLocation'''
  ( number shaderID, name uniformName ) -> number locationID


'''gl.Uniform'''
  ( number locationID, number f1 [,number f2 [,number f3 [,number f4]]] ) -> nil


{{LuaCallout
'''gl.UniformInt'''
|prefix = Spring.
  ( number locationID, number int1 [,number int2 [,number int3 [,number int4]]] ) -> nil
|name = IsDevLuaEnabled
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =
}}


'''gl.UniformArray''' {{new|95.0}}
  ( number locationID, number type, table uniforms ) -> nil
<span class="note">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.</span>


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


[[category: Lua]]
[[category: Lua]]

Latest revision as of 21:51, 21 April 2021

Development < Lua Scripting < User:Master-athmos

These functions are ONLY available if the graphic board supports GLSL.

Please test in your scripts if one of them exists before you use them!


gl.CreateShader

 ({[ vertex   = "glsl code" ,]
   [ tcs      = "glsl code" ,]
   [ tes      = "glsl code" ,]
   [ geometry = "glsl code" ,]
   [ fragment = "glsl code" ,]
   [ uniform       = { uniformName = number value, ...} ,] (specify a Lua array as an argument to uniformName to initialize GLSL arrays)
   [ uniformInt    = { uniformName = number value, ...} ,] (specify a Lua array as an argument to uniformName to initialize GLSL arrays)
   [ uniformFloat  = { uniformName = number value, ...} ,] (specify a Lua array as an argument to uniformName to initialize GLSL arrays)
   [ uniformMatrix = { uniformName = number value, ...} ,]
   [ geoInputType = number inType,]
   [ geoOutputType = number outType,]
   [ geoOutputVerts = number maxVerts,]
   [ definitions = "string of shader #defines", ]
 }) -> number shaderID
  • The "Vertex" 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.
  • The "Geometry" or Geometry-shader can create new vertices and vertice-stripes from points.
  • The "TCS" 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 >= 104.0.1-596 (maintenance), it's also available in develop branch of spring.
  • The "TES" 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 >= 104.0.1-596 (maintenance), it's also available in develop branch of spring.
  • The "Fragment" 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.
  • The Uniforms are the values, you send along with the shader-program. To use them in the shader-program declare them like this:

<syntaxhighlight lang="c">uniform float frame;</syntaxhighlight>

  • From 101.0 onwards, the engine will automatically fill in an appropriately named uniform for team colour if it is declared;

<syntaxhighlight lang="c">uniform vec4 teamColor;</syntaxhighlight>

gl.DeleteShader

 ( number shaderID ) -> nil

gl.ActiveShader can be used in NON-drawing events (to update uniforms etc.)!

 ( number shaderID, function [, arg1 [, arg2, ..]] ) -> nil

gl.UseShader

 ( number shaderID ) -> boolean linked

gl.GetShaderLog

 ( ) -> string "infoLog"

gl.SetShaderParameter Renamed to SetGeometryShaderParameter in spring version >= 104.0.1-596 (maintenance). needed by geometry shader programs (check the opengl GL_ARB_geometry_shader4 extension for glProgramParameteri)

 ( number shaderID, number param, number value ) -> nil

gl.SetTesselationShaderParameter Available for spring versions >= 104.0.1-596 (maintenance). needed by tesselation shader programs (check the opengl GL_ARB_tessellation_shader extension for glProgramParameteri)

 ( number param, number value ) -> nil

gl.GetActiveUniforms

 ( number shaderID ) -> { 
     [1] = { name = "name", type = "type", length = number length, size = number size },
     ...
   }

gl.GetUniformLocation

 ( number shaderID, name uniformName ) -> number locationID

gl.Uniform

 ( number locationID, number f1 [,number f2 [,number f3 [,number f4]]] ) -> nil

gl.UniformInt

 ( number locationID, number int1 [,number int2 [,number int3 [,number int4]]] ) -> nil

gl.UniformArray New in version 95.0

 ( number locationID, number type, table uniforms ) -> nil

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.

gl.UniformMatrix

 ( number locationID, 
   "shadow" |
   "camera" |
   "caminv" |
   "camprj" |
   number m1, number m2, number m3, number m4 |
   number m1, ... , number m9 |
   number m1, ... , number m16
 ) -> nil