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..."
 
(29 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 =
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = IsDevLuaEnabled
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = IsEditDefsEnabled
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|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 ===
'''Spring.ValidUnitID'''
  ( number unitID ) -> boolean
'''Spring.GetUnitIsDead'''
  ( number unitID ) -> nil | boolean
<span class="note">Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise<br/>
keep this in mind when using (not Spring.GetUnitIsDead())</span>
 
'''Spring.GetUnitTooltip'''
  ( number unitID ) -> nil | string tooltip
'''Spring.GetUnitDefID'''
   ( number unitID ) -> nil | number unitDefID
'''Spring.GetUnitTeam'''
  ( number unitID ) -> nil | number teamID
'''Spring.GetUnitAllyTeam'''
  ( number unitID ) -> nil | number allyID
'''Spring.GetUnitLineage''' <span class="warning"> Removed from version 0.83.x</span> <br>
  ( number unitID ) -> nil | number lineage | number lineage, boolean lineageIsRoot
'''Spring.GetUnitNeutral'''
  ( number unitID ) -> nil | boolean neutral
'''Spring.GetUnitHealth'''
  ( number unitID ) -> nil | number health, number maxHealth, number paralyzeDamage,
                            number captureProgress, number buildProgress
build Progress is returned as floating Point between 0.0 and 1.0
 
'''Spring.GetUnitArmored''' <span class="warning">armorMultiple new in version 0.83.x</span>
  ( number unitID ) -> nil | boolean armored, number armorMultiple
'''Spring.GetUnitIsStunned'''
  ( number unitID ) -> nil | boolean stunned_or_inbuild, boolean stunned, boolean inbuild
'''Spring.GetUnitMaxRange'''
  ( number unitID ) -> nil | number maxEngagementRange
'''Spring.GetUnitResources'''
  ( number unitID ) -> nil | number metalMake, number metalUse,
                            number energyMake, number energyUse
'''Spring.GetUnitHarvestStorage'''
  ( number unitID ) -> nil | number metal
<span class = "note">See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.</span>
 
'''Spring.GetUnitMetalExtraction''' <span class="note">0.82+ and later</span>
  ( number unitID ) -> nil | number
'''Spring.GetUnitExperience'''
  ( number unitID ) -> nil | number experience
'''Spring.GetUnitStates'''
  ( number unitID ) -> nil | {
    "firestate" = number,
    "movestate" = number,
    "repeat" = boolean,
    "cloak" = boolean,
    "active" = boolean,
    "trajectory" = boolean,
    ["autoland" = boolean,]
    ["autorepairlevel" = number,]
    ["loopbackattack" = boolean]
  }
'''Spring.GetUnitIsActive'''
  ( number unitID ) -> nil | boolean
'''Spring.GetUnitIsCloaked'''
  ( number unitID ) -> nil | boolean
'''Spring.GetUnitSelfDTime'''
  ( number unitID ) -> nil | number
'''Spring.GetUnitStockpile'''
  ( number unitID ) -> nil | number numStockpiled, number numStockpileQued,
                            number buildPercent
'''Spring.GetUnitHeight'''
  ( number unitID ) -> nil | number
'''Spring.GetUnitRadius'''
  ( number unitID ) -> nil | number
'''Spring.GetUnitMass''' {{new|101.0}}
  ( number unitID ) -> nil | number
'''Spring.GetUnitBlocking''' {{new|85.0}}
  ( number unitID ) -> nil | boolean blocking, boolean crushable
{{new|95.0}} Now return values are:
  boolean isBlocking,
  boolean isSolidObjectCollidable,
  boolean isProjectileCollidable,
  boolean isRaySegmentCollidable,
  boolean crushable,
  boolean blockEnemyPushing,
  boolean blockHeightChanges
 
'''Spring.GetUnitPosition'''
  ( number unitID, [, boolean midPos [, boolean aimPos ] ] ) ->
    nil |
    number bpx, number bpy, number bpz
    [, number mpx, number mpy, number mpz ]
    [, number apx, number apy, number apz ]
<span class="note">since 89.0, returns the base (default), middle or aim position of the unit.</span>
 
'''Spring.GetUnitBasePosition''' <span class="warning">Deprecated in 89.0, use GetUnitPosition</span>
  ( number unitID ) -> nil | number x, number y, number z
<font color="#55ee99">returns the bottom of the unit.</font>
 
'''Spring.GetUnitDirection'''
  ( number unitID ) -> nil | number dx, number dy, number dz
<span class="note">returns the direction vector</span>
 
'''Spring.GetUnitHeading'''
  ( number unitID ) -> nil | number heading
<span class="note">returns heading directions used in COB scripts</span>
 
'''Spring.GetUnitRotation''' {{New|95.0}}
  (number unitID) --> nil | number pitch, number yaw, number roll
<span class="note">Marked as (WIP) in changelog</span>
 
 
'''Spring.GetUnitVelocity''' <span class="warning">velw new in 95.0</span>
  ( number unitID ) -> nil | number velx, number vely, number velz, number velLength
<span class="note">velw returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed</span>
 
 
'''Spring.GetUnitBuildFacing'''
  ( number unitID ) -> nil | number
'''Spring.GetUnitIsBuilding''' <font color="#55ee99">returns what unit a constructor/factory is currently building</font>
  ( number unitID ) -> nil | number unitID
'''Spring.GetUnitCurrentBuildPower''' {{new|92.0}}
  ( number unitID ) -> nil | number buildPower
'''Spring.GetUnitNanoPieces'''
  ( number unitID ) -> nil | { [1] = number piece1, etc ... }
'''Spring.GetUnitTransporter'''
  ( number unitID ) -> nil | number unitID
'''Spring.GetUnitIsTransporting'''
  ( number unitID ) -> nil | { [1] = number unitID, etc... }
'''Spring.GetUnitShieldState'''
  ( number unitID [, number weaponID = -1] ) -> nil | number isEnabled, number curPower
'''Spring.GetUnitTravel'''
  ( number unitID ) -> nil | number travel, number travelPeriod
'''Spring.GetUnitFuel'''
  ( number unitID ) -> nil | number
'''Spring.GetUnitFlanking'''
  ( number unitID, string "dir" ) -> nil | number x, number y, number z
  ( number unitID, string "mode" | "moveFactor" | "minDamage" | "maxDamage" ) -> nil | number
  ( number unitID ) -> nil | number mode, number modilityAdd,
    number minDamage, number maxDamage, number dirX, number dirY, number dirZ
'''Spring.GetUnitSensorRadius'''
  ( number unitID, string type ) -> nil | number radius
<font color="#55ee99">possible types are:<br>los, airLos, radar, sonar, seismic, radarJammer & sonarJammer</font>
 
'''Spring.GetUnitLosState''' <font color="red">raw is only available in gadgets</font>
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -> nil | number raw |
  { ["los" = true] [, "radar" = true] [, "typed" = true] }
'''Spring.GetUnitSeparation''' <span class="warning">surfaceDist new in 95.0</span>
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -> nil | number distance
<font color="#55ee99">returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos</font>
 
'''Spring.GetUnitFeatureSeparation''' {{new|101.0}}
  ( number unitID, number featureID [, boolean 2D] ) -> nil | number distance
 
'''Spring.GetUnitDefDimensions'''
  ( number unitDefID ) -> nil |
    {
      "height" = number,
      "radius" = number,
      "midx"  = number,
      "minx"  = number,
      "maxx"  = number,
      "midy"  = number,
      "miny"  = number,
      "maxy"  = number,
      "midz"  = number,
      "minz"  = number,
      "maxz"  = number
     }
     }
'''Spring.GetUnitLastAttacker'''
  ( number unitID ) -> nil | number unitID
'''Spring.GetUnitLastAttackedPiece''''
  ( number unitID ) -> nil | string pieceName, number gameframe
'''Spring.GetUnitMoveTypeData''' <span class="note">new in version 0.80+</span>
  ( number unitID ) -> nil | { movetype data }
'''Spring.GetUnitCollisionVolumeData'''
  ( number unitID )
  -> number scaleX, number scaleY, number scaleZ,
  number offsetX, number offsetY, number offsetZ,
  number volumeType, number testType, number primaryAxis, boolean disabled
==== Unit Weapon Informations ====
'''Spring.GetUnitWeaponState'''
  ( number unitID, number weaponNum ) -> nil |
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled
  ( number unitID, number weaponNum, string tag ) -> nil | number
  <span class=note>`tag` can be:
  "reloadState" == "reloadFrame"
  "reloadTime"
  "accuracy"
  "sprayAngle"
  "range"
  "projectileSpeed"
  "burst"
  "burstRate"
  "projectiles"
  The following 4 tags were added in 104.0:
  "salvoError"
  "salvoLeft"
  "nextSalvo"
  "targetMoveError"
</span>
'''Spring.GetUnitWeaponDamages''' {{new|101.0}}
  ( number unitID, number weaponNum | "selfDestruct" | "explode", 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>
'''Spring.GetUnitWeaponVectors'''
  ( number unitID, number weaponNum ) -> nil | number posX, number posY, number posZ,
    number dirX, number dirY, number dirZ
'''Spring.GetUnitWeaponTryTarget''' {{new|94.0}}
  ( number unitID, number weaponNum,
    number targetID | number posX, number posY, number posZ ) -> nil | boolean success
<span class="note">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.</span>
'''Spring.GetUnitWeaponTestTarget''' {{new|94.0}}
  ( number unitID, number weaponNum,
    number targetID | number posX, number posY, number posZ ) -> nil | boolean success
<span class="note">Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.</span>
'''Spring.GetUnitWeaponTestRange''' {{new|94.0}}
  ( number unitID, number weaponNum,
    number targetID | number posX, number posY, number posZ ) -> nil | boolean success
<span class="note">Checks target is in range including height modifiers and cylinder targeting if set.</span>
'''Spring.GetUnitWeaponHaveFreeLineOfFire''' {{new|94.0}}
  ( number unitID, number weaponNum,
    number targetID | number posX, number posY, number posZ ) -> nil | boolean success
<span class="note">Runs a raytrace from unit aimpoint respecting collision flags.</span>
From 104.0 onwards the param list changes so that source firing position can also be passed:
  ( unitID, weaponNum,
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -> nil | boolean success
'''Spring.GetUnitWeaponCanFire''' {{new|95.0}}
  ( number unitID, number weaponNum ) -> nil | boolean canFire
'''Spring.GetUnitWeaponTarget''' {{new|95.0}}
  ( number unitID, number weaponNum ) -> nil |
  number 0 | number 1, bool isUserTarget, number unitID |
  number 2, bool isUserTarget, { number posX, number posY, number posZ } |
  number 3, bool isUserTarget, number ProjectileID
''returned number of args is always 3 if targetType != None''
'''Spring.GetRadarErrorParams''' {{new|95.0}}
  (number allyTeamID) --> nil |
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult
'''Spring.GetUnitPosErrorParams''' {{new|95.0}}
  (number unitID) --> nil |
      number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,
      number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,
      number nextPosErrorUpdate
==== Unit LOS ====
'''Spring.IsUnitInLos''' {{new|101.0}}
  ( number unitID, number allyID ) -> boolean
'''Spring.IsUnitInAirLos''' {{new|101.0}}
  ( number unitID, number allyID ) -> boolean
'''Spring.IsUnitInRadar''' {{new|101.0}}
  ( number unitID, number allyID ) -> boolean
'''Spring.IsUnitInJammer''' {{new|101.0}}
  ( number unitID, number allyID ) -> boolean
=== Unit Pieces ===
'''Spring.GetUnitVectors'''
  ( number unitID ) -> nil | {frontX,frontY,frontZ}, {upX,upY,upZ}, {rightX,rightY,rightZ}
'''Spring.GetUnitPiecePosition'''
  ( number unitID, number piece ) -> number posx, number posy, number posz
<font color="#55ee99">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.</font>
'''Spring.GetUnitPieceDirection''' <font color="red">Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir</font>
  ( number unitID, number piece ) -> number dirx, number diry, number dirz
'''Spring.GetUnitPiecePosDir'''
  ( number unitID, number pieceNum ) -> nil | number posX, number posY, number posZ,
    number dirX, number dirZ, number dirY
<font color="#55ee99">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.</font>
'''Spring.GetUnitPieceMatrix'''
  ( number unitID, number piece ) -> { [1] = number, ... , [16] = number }
'''Spring.GetUnitPieceList'''
  ( number unitID ) -> { [1] = string "piecename", ... , [pieceNumN] = string "piecename" }
'''Spring.GetUnitPieceMap'''
  ( number unitID ) -> { "piecename1" = pieceNum1, ... , "piecenameN" = pieceNumN }
'''Spring.GetUnitPieceInfo'''
  ( number unitID, number piece ) -> {
    "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", 
  }
{{new|95.0}} "parent" field
{{new|101.0}} parent for root pieces is now "[null]" instead of ""
'''Spring.GetUnitScriptPiece'''
  ( number unitID [, number scriptPiece ] )
  -> nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum
<font color="#55ee99">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 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 <i>piece</i> definition in your cob/bos.</font>
'''Spring.GetUnitScriptNames'''
  ( number unitID )
  -> { "cobpiecename1" = ScriptPieceNum1, ... , "cobpiecenameN" = ScriptPieceNumN }
'''Spring.GetUnitPieceCollisionVolumeData'''
  ( number unitID, number pieceID )
  -> number scaleX, number scaleY, number scaleZ,
  number offsetX, number offsetY, number offsetZ,
  number volumeType, number testType, number primaryAxis, boolean disabled
As of 101.0 this is 1-based piece index argument (was 0-based).
=== CommandQueues ===
'''Spring.GetUnitCommands''' <br/>
'''Spring.GetCommandQueue''' <span class="note">(Alias)</span>
  ( number unitID, number count = 0 ) -> nil | number commandQueueSize {{new|96}}
  ( number unitID [, number count = -1] )
  -> nil | table commandQueueTable = {
    [1] = {
      "id"      = number,
      "params"  = { [1] = number, ...},
      "options" = {
        "coded"    = number,
        "alt"      = boolean,
        "ctrl"    = boolean,
        "shift"    = boolean,
        "right"    = boolean,
        "internal" = boolean,
        "meta"    = boolean
      }
    }, ...
  }
<font color="#55ee99">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]</font>
'''Spring.GetFullBuildQueue'''
  ( number unitID ) ->
  nil | buildOrders = {
          [1] = { [number unitDefID] = number count },  etc...
        }
'''Spring.GetRealBuildQueue''' <font color="#55ee99">(cleans the buildqueue of things the unit can't build itself)</font>
  ( number unitID ) ->
  nil | buildOrders = {
          [1] = { [number unitDefID] = number count },  etc...
        }
'''Spring.GetFactoryCommands'''
  ( number unitID, number count = 0 ) -> nil | number commandQueueSize {{new|96}}
  ( number unitID [, number count = -1 ] )
  -> nil | table commandQueueTable = {
    [1] = {
      "id"      = number,
      "params"  = { [1] = number, ...},
      "options" = {
        "coded"    = number,
        "alt"      = boolean,
        "ctrl"    = boolean,
        "shift"    = boolean,
        "right"    = boolean,
        "internal" = boolean,
        "meta"    = boolean
      }
    }, ...
  }
'''Spring.GetFactoryCounts''' (used to get the buildqueue of a factory, seems screwed o_O)
  ( number unitID [, number count [, boolean addCMDs ] ] ) -> nil | commandQueueTable = {
    [2] = { [number unitDefID | number -cmdID] = number count }, ...
  }
=== Command Descriptions/Buttons ===
'''Spring.GetUnitCmdDescs'''
  ( number unitID [, number startIndex [, number endIndex ] ] ) -> nil | {
      [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, ... }
    }, ...
  }
'''Spring.FindUnitCmdDesc'''
  ( number unitID, number cmdID ) -> nil | number index
== Features ==
=== GetFeatures ===
'''Spring.GetFeaturesInRectangle'''
  ( number xmin, number zmin, number xmax, number zmax )
    -> featureTable = { [1] = number featureID, etc... }
'''Spring.GetFeaturesInSphere'''
  ( number x, number y, number z, number radius )
    -> featureTable = { [1] = number featureID, etc... }
'''Spring.GetFeaturesInCylinder'''
  ( number x, number z, number radius )
    -> featureTable = { [1] = number featureID, etc... }
'''Spring.GetAllFeatures'''
  ( ) -> { [1] = number featureID, ... }
=== Feature Informations ===
'''Spring.ValidFeatureID'''
  ( number featureID ) -> boolean
'''Spring.GetFeatureDefID'''
  ( number featureID ) -> nil | number featureDefID
'''Spring.GetFeatureTeam'''
  ( number featureID ) -> nil | number teamID
'''Spring.GetFeatureAllyTeam'''
  ( number featureID ) -> nil | number allyID
'''Spring.GetFeatureHealth'''
  ( number featureID ) -> nil | number health, number maxHealth, number resurrectProgress
'''Spring.GetFeatureHeight'''
  ( number featureID ) -> nil | number
'''Spring.GetFeatureRadius'''
  ( number featureID ) -> nil | number
'''Spring.GetFeatureMass''' {{new|101.0}}
  ( number featureID ) -> nil | number
'''Spring.GetFeatureSeparation''' {{new|101.0}}
  ( number featureID1, number featureID2 [, boolean 2D] ) -> nil | number distance
'''Spring.GetFeaturePosition'''
  ( number featureID, [, boolean midPos [, boolean aimPos ] ] ) ->
  nil |
  number bpx, number bpy, number bpz [,
  number mpx, number mpy, number mpz [,
  number apx, number apy, number apz ]]
<span class="note">since 89.0, returns the base (default), middle or aim position of the feature.</span>
'''Spring.GetFeatureVelocity''' {{new|95.0}}
  ( number featureID [, boolean norm] )
  -> nil | number velx, number vely, number velz, number velLength
'''Spring.GetFeatureDirection'''
  ( number featureID ) -> nil | number dirx, number diry, number dirz
'''Spring.GetFeatureRotation''' {{New|101.0}}
  (number featureID) --> nil | number pitch, number yaw, number roll
'''Spring.GetFeatureHeading'''
  ( number featureID ) -> nil | number heading
'''Spring.GetFeatureResources''' <span class="warning">reclaimTime</span> {{new|105.0}}
  ( number featureID ) -> nil | number RemainingMetal, number maxMetal,
                                number RemainingEnergy, number maxEnergy, number reclaimLeft, number reclaimTime
'''Spring.GetFeatureNoSelect'''
  ( number featureID ) -> nil | boolean noSelect
'''Spring.GetFeatureResurrect'''
  ( number featureID ) -> nil | string UnitDefName, number buildFacing
'''Spring.GetFeatureCollisionVolumeData'''
  ( number featureID )
  -> number scaleX, number scaleY, number scaleZ,
  number offsetX, number offsetY, number offsetZ,
  number volumeType, number testType, number primaryAxis, boolean disabled
'''Spring.GetFeaturePieceCollisionVolumeData''' {{new|101.0}}
  ( number featuerID, number pieceID )
  -> number scaleX, number scaleY, number scaleZ,
  number offsetX, number offsetY, number offsetZ,
  number volumeType, number testType, number primaryAxis, boolean disabled
'''Spring.GetFeatureBlocking'''
  (number featureID) --> boolean collidable, boolean crushable, boolean blocking
{{new|95.0}} Now return values are:
  boolean isBlocking,
  boolean isSolidObjectCollidable,
  boolean isProjectileCollidable,
  boolean isRaySegmentCollidable,
  boolean crushable,
  boolean blockEnemyPushing,
  boolean blockHeightChanges
=== Feature Pieces ===
See #Unit_Pieces for full details.
'''Spring.GetFeatureLastAttackedPiece'''
'''Spring.GetFeaturePieceMap'''
'''Spring.GetFeaturePieceList'''
'''Spring.GetFeaturePieceInfo'''
'''Spring.GetFeaturePiecePosition'''
'''Spring.GetFeaturePieceDirection'''
'''Spring.GetFeaturePiecePosDir'''
'''Spring.GetFeaturePieceMatrix'''
== COB ==
'''Spring.GetCOBUnitVar'''
  ( number unitID, integer varID [, boolean unpack = false ] )
  -> nil | number value | number unpackedX, number unpackedY
'''Spring.GetCOBTeamVar'''
  ( number teamID, integer varID [, boolean unpack = false ] )
  -> nil | number value | number unpackedX, number unpackedY
'''Spring.GetCOBAllyTeamVar'''
  ( number allyID, integer varID [, boolean unpack = false ] )
  -> nil | number value | number unpackedX, number unpackedY
'''Spring.GetCOBGlobalVar'''
  ( integer varID [, boolean unpack = false ] )
  -> nil | number value | number unpackedX, number unpackedY
== 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>
'''Spring.GetGroundHeight'''
  ( number x, number z ) -> number y
'''Spring.GetGroundOrigHeight'''
  ( number x, number z ) -> number y
''This returns the ground original (before terraforming) height at a given x,z position''
'''Spring.GetGroundNormal'''
  ( number x, number z [, smoothedNormal] ) -> number x, number y, number z, number slope
{{new|100.0}}<span class="warning">: smoothedNormal and slope</span>
'''Spring.GetGroundInfo'''
  ( number x, number z ) -> string "Type", number metal, number hardness,
                            number tankSpeed, number kbotSpeed, number hoverSpeed,
                            number shipSpeed, boolean receiveTracks
'''Spring.GetGroundBlocked'''
  ( number x, number z |
    number x1, number z1, number x2, number z2 )
    -> nil |  string "feature", number featureID  |  string "unit", number unitID
'''Spring.GetGroundExtremes'''
  ( ) -> nil | number minHeight, number maxHeight
'''Spring.GetSmoothMeshHeight'''
  ( number x, number z ) -> number y
'''Spring.GetMetalMapSize'''
  ( ) -> number sizeX, number sizeY
'''Spring.GetMetalAmount'''
  ( number x, number z ) -> number metalAmount
<span class="note">where x & z are in metal map coordinates (worldspace/16)</span>
'''Spring.GetMetalExtraction'''
  ( number x, number z ) -> number extractionAmount
<span class="note">where x & z are in metal map coordinates (worldspace/16)</span>
'''Spring.GetTerrainTypeData''' {{new|92.0}}
  ( number i )
    -> nil |  string "name", number hardness,
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,
              boolean receiveTracks
'''Spring.GetGrass'''
  ( number x, number z ) -> number 0 | 1
<span class="note">where x & z are in worldspace coordinates</span>
=== 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}}
'''gl.GetUniformLocation'''
   ( number projectileID ) -> nil | number ttl
   ( number shaderID, name uniformName ) -> number locationID


'''Spring.GetProjectileDirection''' {{new|95.0}}
'''gl.Uniform'''
   ( number projectileID ) -> nil | number dir.x, number dir.y, number dir.z
   ( number locationID, number f1 [,number f2 [,number f3 [,number f4]]] ) -> nil


'''Spring.GetProjectileSpinAngle''' <span class="warning">Deprecated in 95.0</span>
'''gl.UniformInt'''
   ( number projectileID ) -> nil | number angle
   ( number locationID, number int1 [,number int2 [,number int3 [,number int4]]] ) -> nil
'''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


'''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>


'''Spring.GetProjectileDamages''' {{new|101.0}}
'''gl.UniformMatrix'''
   ( number unitID, number weaponNum, string tag ) -> nil | number
   ( number locationID,  
  <span class=note>`tag` can be:
    "shadow" |
  "paralyzeDamageTime"
    "camera" |
  "impulseFactor"
    "caminv" |
  "impulseBoost"
    "camprj" |
  "craterMult"
    number m1, number m2, number m3, number m4 |
  "craterBoost"
    number m1, ... , number m9 |
  "dynDamageExp"
    number m1, ... , number m16
  "dynDamageMin"
   ) -> nil
   "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