User:Master-athmos: Difference between revisions

From Spring
Jump to navigationJump to search
No edit summary
No edit summary
Line 1: Line 1:
[[Engine_Development|Development]] < [[Lua_Scripting|Lua Scripting]] < {{FULLPAGENAME}}
[[Engine_Development|Development]] < [[Lua_Scripting|Lua Scripting]] < {{FULLPAGENAME}}


== Game ==


{{LuaCallout
=== Special TeamID Variables ===
|prefix = Spring.
<font color="red" style="font-weight:600">(those special TeamIDs are not supported by all functions)</font><br>
|name = SetUnitBlocking
'''Spring.ALL_UNITS'''<br>
|arg1 = {{type|number}} unitID
'''Spring.MY_UNITS'''<br>
|arg2 = {{type|boolean}} isBlocking
'''Spring.ALLY_UNITS'''<br>
|arg3 = {{type|boolean}} isSolidObjectCollidable
'''Spring.ENEMY_UNITS'''
|arg4 = {{type|boolean}} isProjectileCollidable
|arg5 = {{type|boolean}} isRaySegmentCollidable
|arg6 = {{type|boolean}} crushable
|arg7 = {{type|boolean}} blockEnemyPushing
|arg8 = {{type|boolean}} blockHeightChanges
|arg9 =
|return = {{type|nil}}
|info = <font color="maroon" style="font-weight:600">No description available</font>
}}


''For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID()<br><br>


{{LuaCallout
'''Spring.GetGaiaTeamID'''
|prefix = Spring.
  ( ) -> number teamID
|name = SetUnitBuildSpeed
|arg1 = {{type|number}} builderID
|arg2 = {{type|number}} buildSpeed
|arg3 = {{bracket|{{type|number}} repairSpeed}}
|arg4 = {{bracket|{{type|number}} reclaimSpeed}}
|arg5 = {{bracket|{{type|number}} resurrectSpeed}}
|arg6 = {{bracket|{{type|number}} captureSpeed}}
|arg7 = {{bracket|{{type|number}} terraformSpeed}}
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = <font color="maroon" style="font-weight:600">No description available</font>
}}


=== GameStates ===
'''Spring.IsGodModeEnabled'''
  ( ) -> boolean
'''Spring.IsCheatingEnabled'''
  ( ) -> boolean
'''Spring.IsDevLuaEnabled'''
  ( ) -> boolean
'''Spring.IsEditDefsEnabled'''
  ( ) -> boolean
'''Spring.AreHelperAIsEnabled'''
  ( ) -> boolean
'''Spring.FixedAllies'''
  ( ) -> nil | boolean


{{LuaCallout
'''Spring.IsGameOver'''
|prefix = Spring.
  ( ) -> boolean
|name = SetUnitBuildSpeed
|arg1 = {{type|number}} builderID
|arg2 = {{type|number}} buildSpeed
|arg3 = {{bracket}}{{type|number}} repairSpeed
|arg4 = {{bracket}}{{type|number}} reclaimSpeed
|arg5 = {{bracket}}{{type|number}} resurrectSpeed
|arg6 = {{bracket}}{{type|number}} captureSpeed
|arg7 = {{bracket}}{{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = <font color="maroon" style="font-weight:600">No description available</font>
}}


[[Engine_Development|Development]] < [[Lua_Scripting|Lua Scripting]] < {{FULLPAGENAME}}
=== RulesParams ===
<span class=note>Those functions allow to save data per Game,Team and Unit.<br>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>


= Game End =
'''Spring.GetRulesInfoMap''' <span class=warning>REMOVED in 0.82!</span>
  ( ) -> { [key1] = string value1, [key2] = string value2, ... }
  ( string "key" ) -> string


{{LuaCallout
'''Spring.GetGameRulesParam'''
|prefix = Spring.
  ( number ruleIndex | string ruleName ) -> nil | number value | string value
|name = KillTeam
'''Spring.GetGameRulesParams'''
|arg1 = {{type|number}} teamID
  ( ) -> nil | { [ruleName1] = number | string value1, ... }
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|83.0}}<br> Will declare a team to be dead ( no further orders can be assigned to such teams's units ), Gaia team cannot be killed.
}}


'''Spring.GetTeamRulesParam'''
  ( number teamID, number index | string ruleName ) -> nil | number value | string value
'''Spring.GetTeamRulesParams'''
  ( number teamID ) -> nil | { [ruleName1] = number | string value1, ... }


{{LuaCallout
|prefix = Spring.
|name = GameOver
|arg1 = {{type|number}} allyTeamID1
|arg2 = {{type|number}} allyTeamID2
|arg3 = ...
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|83.0}}<br> Will declare game over, a list of winning allyteams can be passed, if undecided ( like when dropped from the host ) it should be empty ( no winner ), in the case of a draw with multiple winners, all should be listed.
}}


= RulesParams =
'''Spring.GetUnitRulesParam'''
<span class=warning>String values are new since 95.0. Attention: Numeric paramValues in quotes will be converted to number.</span>
  ( number unitID, number index | string ruleName ) -> nil | number value | string value
'''Spring.GetUnitRulesParams'''
  ( number unitID ) -> nil | { [ruleName1] = number | string value1, ... }


{{LuaCallout
'''Spring.GetFeatureRulesParam'''
|prefix = Spring.
  ( number featureID, number index | string ruleName ) -> nil | number value | string value
|name = SetUnitRulesParam
'''Spring.GetFeatureRulesParams'''
|arg1 = {{type|number}} unitID
  ( number featureID ) -> nil | { [ruleName1] = number | string value1, ... }
|arg2 = {{type|string}} paramName
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}}
|arg4 = {{type|table}} losAccess {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = <span class=note>Possible keys for the losAccess table are:
    `private` : only readable by the ally (default)
    `allied`  : readable by ally + ingame allied
    `inlos`  : readable if the unit is in LOS
    `inradar` : readable if the unit is in AirLOS
    `public`  : readable by all
  note: if one condition is fulfilled all beneath it are too (e.g. if an unit is in LOS it<br/>    can read params with `inradar=true` even if the param has `inlos=false`)
  note2: all GameRulesParam are public, TeamRulesParams can just be `private`,`allied`<br/>    and/or `public`
  note3: You can read RulesParams from '''any''' Lua enviroments! With those losAccess<br/>     policies you can limit their access.</span>
}}


=== Mod-/Map-Options ===
'''Spring.GetModOptions'''
  ( ) -> {} | { "keyName1" = string "value", "keyName2" = string "value", ... }
'''Spring.GetMapOptions'''
  ( ) -> {} | { "keyName1" = string "value", "keyName2" = string "value", ... }


{{LuaCallout
|prefix = Spring.
|name = SetFeatureRulesParam
|arg1 = {{type|number}} featureID
|arg2 = {{type|string}} paramName
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}}
|arg4 = {{type|table}} losAccess {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = <span class=warning>New since 102.0.</span><br>See above for further documentation of losAccess.
}}


! bool values are not transfered from C to Lua correctly, so in IF theres needed to use this condition:<br><br>
<font color="#55ee99">"if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end"</font><br>
not only:<br>
<span class="warning">"if (Spring.GetModOptions.exampleOption) then...end"</span>


{{LuaCallout
=== Speed/Time ===
|prefix = Spring.
'''Spring.GetGameSpeed''' <span class="warning">As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos</span>
|name = SetTeamRulesParam
  ( ) -> number userSpeedFactor, number speedFactor, boolean paused
|arg1 = {{type|number}} teamID
'''Spring.GetGameFrame'''
|arg2 = {{type|string}} paramName
  ( ) -> number frameNum%dayFrames, number frameNum/dayFrames
|arg3 = {{type|number{{pipe}}string}} paramValue {{bracket}}
'''Spring.GetGameSeconds'''
|arg4 = {{type|table}} losAccess {{rbracket}}
  ( ) -> number seconds
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = See above for further documentation of losAccess.
}}


=== Vectors ===
'''Spring.GetWind'''
  ( ) -> number dirX, number dirY, number dirZ,
        number strength,  number normDirX, number normDirY, number normDirZ


'''Spring.GetHeadingFromVector'''
  ( number x, number z ) -> number heading
'''Spring.GetVectorFromHeading'''
  ( number heading ) -> number x, number z


{{LuaCallout
== Sides/Factions ==
|prefix = Spring.
'''Spring.GetSideData'''
|name = SetGameRulesParam
  ( string sideName ) -> nil | string startUnit, string caseSensitiveSideName
|arg1 = {{type|string}} paramName
  ( number sideID ) -> nil | string sideName, string startUnit, string caseSensitiveSideName
|arg2 = {{type|number{{pipe}}string}} paramValue {{bracket}}
  ( ) -> { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }
|arg3 = {{type|table}} losAccess {{rbracket}}
|arg4 =  
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = See above for further documentation of losAccess.
}}


= Resources =
== Teams ==
=== StartBoxes/StartPositions ===
'''Spring.GetAllyTeamStartBox'''
  ( number allyID ) -> nil | number xmin, number zmin, number xmax, number zmax
'''Spring.GetTeamStartPosition'''
  ( number teamID ) -> nil | number x, number y, number z


{{LuaCallout
=== Player,Team,Ally Lists/Info ===
|prefix = Spring.
|name = AddTeamResource
|arg1 = {{type|number}} teamID
|arg2 = {{type|string}} "metal" {{pipe}} "energy"
|arg3 = {{type|number}} amount
|arg4 =  
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Adds metal or energy resources to the specified team.
}}


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
'''Spring.GetPlayerList'''
|prefix = Spring.
  ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])
|name = UseTeamResource
  -> nil | { [1] = number playerID, etc... }
|arg1 = {{type|number}} teamID
From 104.0 onwards spectators will be ignored if a valid (>=0) teamID is given
|arg2 = {{type|string}} "metal" {{pipe}} "energy"
|arg3 = {{type|number}} amount {{pipe}} { metal = {{type|number}} amount, energy = {{type|number}} amount }
|arg4 =  
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} hadEnough
|info = Consumes metal and/or energy resources of the specified team.
}}


'''Spring.GetTeamList'''
  ( [number allyTeamID = -1] ) -> nil | { [1] = number teamID, etc... }
'''Spring.GetAllyTeamList'''
  ( ) -> { [1] = number allyTeamID, etc... }


{{LuaCallout
'''Spring.GetPlayerInfo'''
|prefix = Spring.
  ( number playerID ) ->
|name = SetTeamResource
    nil | string  "name",  <span class="note">(PRE-83.0: in synced code this is "SYNCED_NONAME"!)</span>
|arg1 = {{type|number}} teamID
          boolean active,
|arg2 = {{type|string}} res
          boolean spectator,
|arg3 = {{type|number}} amount
          number teamID,
|arg4 =
          number  allyTeamID,
|arg5 =
          number pingTime,
|arg6 =
          number  cpuUsage,
|arg7 =
          string  country,
|arg8 =
          number  rank
|arg9 =
          table  customPlayerKeys
|return = {{type|nil}}
'''Spring.GetPlayerControlledUnit'''
|info = Possible values for res are:<br>"m"  = metal<br>"e"  = energy<br>"ms"  = metal storage<br>"es"  = energy storage<br>
  ( number playerID ) -> nil | number unitID
}}


'''Spring.GetAIInfo'''
  ( number teamID ) ->
          number  skirmishAIID,
          string  name,
          number  hostingPlayerID,
          string  shortName, <span class="note">(synced => "SYNCED_NOSHORTNAME"; non-local => "UNKNOWN")</span>
          string  version,  <span class="note">(synced => "SYNCED_NOVERSION";  non-local => "UNKNOWN")</span>
          table  options    <span class="note">(synced & non-local => empty-table)</span>
<span class="warning">Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.</span>


{{LuaCallout
|prefix = Spring.
|name = SetTeamShareLevel
|arg1 = {{type|number}} teamID
|arg2 = {{type|string}} "metal" {{pipe}} "energy"
|arg3 = {{type|number}} amount
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Changes the resource amount for a team beyond which resources aren't stored but transferred to other allied teams if possible.
}}


'''Spring.GetAllyTeamInfo'''
  ( number allyteamID ) -> nil | table  customTeamKeys


{{LuaCallout
'''Spring.GetTeamInfo'''
|prefix = Spring.
  ( number teamID ) ->
|name = ShareTeamResource
    nil | number  teamID,
|arg1 = {{type|number}} teamID_src
          number  leader, <span class=note>(:= a player id)</span>
|arg2 = {{type|number}} teamID_recv
          boolean isDead,
|arg3 = {{type|string}} "metal" {{pipe}} "energy"
          boolean isAiTeam,
|arg4 = {{type|number}} amount
          string  "side",
|arg5 =
          number  allyTeam,
|arg6 =
          number  incomeMultiplier,
|arg7 =
          table  customTeamKeys
|arg8 =
'''Spring.GetTeamResources'''
|arg9 =
  ( number teamID, string "metal" | "energy" ) ->
|return = {{type|nil}}
    nil | number currentLevel,
|info = Transfers resources between two teams.
          number storage,
}}
          number pull,
          number income,
          number expense,
          number share,
          number sent,
          number received
'''Spring.GetTeamUnitStats'''
  ( number teamID ) ->
    nil | number killed,
          number died,
          number capturedBy,
          number capturedFrom,
          number received,
          number sent
'''Spring.GetTeamResourceStats''' <span class="note">0.82 and later</span>
  ( number teamID,  string "metal" | "energy" ) ->
    nil | number used,
          number produced,
          number excessed,
          number received,
          number sent
'''Spring.GetTeamStatsHistory'''
  ( number teamID [, number startIndex [, number endIndex = startIndex ]]) ->
    nil |
    number cur_max_index |
    {
      [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
      }, ...
  }
<span class="note">if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}</span>


= Teams =


'''Spring.GetTeamLuaAI'''
  ( number teamID ) -> string "luaAI"


{{LuaCallout
Returns string containing name of AI defined in file LuaAI.lua as name="<AI name>". Maybe it returns whole table with all values there, so maybe depends, but in my LuaAI.lua name is on first position...
|prefix = Spring.
|name = SetAlly
|arg1 = {{type|number}} firstAllyTeamID
|arg2 = {{type|number}} secondAllyTeamID
|arg3 = {{type|bool}} ally
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|98.0}}<br>Changes the value of the (one-sided) alliance between: firstAllyTeamID -> secondAllyTeamID.
}}


=== Teams/PlayersAllied ===
'''Spring.AreTeamsAllied'''
  ( number teamID1, number teamID2 ) -> nil | boolean
'''Spring.ArePlayersAllied'''
  ( number playerID1, number playerID2 ) -> nil | boolean


{{LuaCallout
== Units ==
|prefix = Spring.
=== GetUnits ===
|name = AssignPlayerToTeam
'''Spring.GetAllUnits'''
|arg1 = {{type|number}} playerID
  ( ) -> nil | unitTable = { [1] = number unitID, ... }
|arg2 = {{type|number}} teamID
'''Spring.GetTeamUnits'''
|arg3 =  
  ( number teamID ) -> nil | unitTable = { [1] = number unitID, etc... }
|arg4 =  
'''Spring.GetTeamUnitsSorted'''
|arg5 =
  ( number teamID ) -> nil |
|arg6 =
    unitDefTable = {
|arg7 =
      [number unitDefID] = { [1] = [number unitID], etc... },
|arg8 =
      etc...
|arg9 =
    }
|return = {{type|nil}}
'''Spring.GetTeamUnitsCounts'''
|info = {{new|98.0}}<br>Assigns a player to a team.
  ( number teamID ) -> nil | countTable = { [number unitDefID] = count, etc... }
}}
'''Spring.GetTeamUnitsByDefs'''
 
  ( number teamID, number unitDefID | { number unitDefID1, ... } )
 
    -> nil | unitTable = { [1] = number unitID, etc... }
 
'''Spring.GetTeamUnitDefCount'''
{{LuaCallout
  ( number teamID, number unitDefID ) -> nil | number count
|prefix = Spring.
'''Spring.GetTeamUnitCount'''
|name = SetGlobalLos
  ( number teamID ) -> nil | number count
|arg1 = {{type|number}} allyTeamID
|arg2 = {{type|bool}} globallos
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>Changes access to global line of sight for a team and its allies.
}}
 
= Unit Handling =
 
{{LuaCallout
|prefix = Spring.
|name = CreateUnit
|arg1 = {{type|string}} "defName" {{pipe}} {{type|number }} unitDefID
|arg2 = {{type|number}} x
|arg3 = {{type|number}} y
|arg4 = {{type|number}} z
|arg5 = {{type|string}} "facing" {{pipe}} {{type|number }} facing
|arg6 = {{type|number}} teamID {{bracket}}
|arg7 = {{type|bool}} build = false {{bracket}}
|arg8 = {{type|bool}} flattenGround = true {{bracket}}
|arg9 = {{type|number}} builderID {{rbracket}}{{rbracket}}{{rbracket}}
|return = {{type|number}} unitID {{pipe}} {{type|nil}} (meaning unit was not created)
|info = Offmap positions are clamped! Use MoveCtrl to move to such positions.<br>Possible values for facing are:<br>"south" {{pipe}} "s" {{pipe}} 0<br>"east"  {{pipe}} "e" {{pipe}} 1<br>"north" {{pipe}} "n" {{pipe}} 2<br>"west"  {{pipe}} "w" {{pipe}} 3<br><br>If build is true, the unit is created in "being built" state with buildProgress = 0<br>unitID and builderID are {{new|92.0}}, the former allowing to spawn a unit with a specific ID.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = DestroyUnit
|arg1 = {{type|number}} unitID {{bracket}}  
|arg2 = {{type|bool}} selfd = false {{bracket}}
|arg3 = {{type|bool}} reclaimed = false {{bracket}}
|arg4 = {{type|number}} attackerID {{rbracket}}{{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = selfd := Makes the unit act like it self-destructed.<br>reclaimed := Don't show any DeathSequences, don't leave a wreckage. This does not give back the resources to the team!
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = TransferUnit
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} newTeamID {{bracket}}
|arg3 = {{type|bool}} given = true {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = If given=false, the unit is captured.
}}
 
== Unit Control ==
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitCosts
|arg1 = {{type|number}} unitID  
|arg2 = { {{bracket}} buildTime = {{type|number}} amount {{rbracket}}
|arg3 = {{bracket}} metalCost = {{type|number}} amount  {{rbracket}}
|arg4 = {{bracket}} energyCost = {{type|number}} amount {{rbracket}} }
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitTooltip
|arg1 = {{type|number}} unitID
|arg2 = {{type|string}} "tooltip"
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitHealth
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} health {{pipe}} { {{bracket}} health = {{type|number}} health {{rbracket}}
|arg3 = {{bracket}} capture  = {{type|number}} capture  {{rbracket}}
|arg4 = {{bracket}} paralyze = {{type|number}} paralyze {{rbracket}}
|arg5 = {{bracket}} build    = {{type|number}} build {{rbracket}} }
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitMaxHealth
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} maxHealth
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = AddUnitDamage
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} damage {{bracket}}
|arg3 = {{type|number}} paralyze = 0 {{bracket}}
|arg4 = {{type|number}} attackerID = -1 {{bracket}}
|arg5 = {{type|number}} weaponID = -1 {{bracket}}
|arg6 = {{type|number}} impulse_x {{bracket}}
|arg7 = {{type|number}} impulse_y {{bracket}}
|arg8 = {{type|number}} impulse_z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}
|arg9 =
|return = {{type|nil}}
|info = The number in the paralyze parameter equals to the paralyzetime in the WeaponDef.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitStockpile
|arg1 = {{type|number}} unitID {{bracket}}
|arg2 = {{type|number}} stockpile {{bracket}}
|arg3 = {{type|number}} buildPercent {{rbracket}}{{rbracket}}
|arg4 =
|arg5 =  
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitExperience
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} experience
|arg3 = {{type|number}} buildPercent
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitFuel
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} fuel
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{removed|101.0}}
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitCrashing
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} crashing
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info = {{new|83.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitLineage
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} teamID {{bracket}}
|arg3 = {{type|bool}} isRoot {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{removed|83.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitNeutral
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} neutral
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{removed|83.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitTarget
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} x {{pipe}} {{type|nil}}
|arg3 = {{type|number}} y
|arg4 = {{type|number}} z {{bracket}}
|arg5 = {{type|bool}} dgun = false {{bracket}}
|arg6 = {{type|bool}} userTarget = false {{bracket}}
|arg7 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info =
}}
 
or
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitTarget
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} enemyUnitID {{pipe}} {{type|nil}} {{bracket}}
|arg3 = {{type|bool}} dgun = false {{bracket}}
|arg4 = {{type|bool}} userTarget = false {{bracket}}
|arg5 = {{type|number}} weaponNum = -1 {{rbracket}}{{rbracket}}{{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info = Defines a unit's target. Nil as 2nd argument drops the unit's current target.<br><span class="warning">UserTarget & success new in version 95.0, setting nil target new in version 99.0, weaponNum new in version 102.0.</span>
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitMaxRange
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} maxRange
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitMass
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} mass
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitBlocking
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} isblocking
|arg3 = {{type|bool}} isSolidObjectCollidable
|arg4 = {{type|bool}} isProjectileCollidable
|arg5 = {{type|bool}} isRaySegmentCollidable
|arg6 = {{type|bool}} crushable
|arg7 = {{type|bool}} blockEnemyPushing
|arg8 = {{type|bool}} blockHeightChanges
|arg9 =
|return = {{type|nil}}
|info = {{new|95.0}}<br>Changed parameters.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitMetalExtraction
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} depth {{bracket}}
|arg3 = {{type|number}} range {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Parameter "depth" corresponds to metal extraction rate. Range value is similar to "extractsMetal" in unitDefs.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitBuildSpeed
|arg1 = {{type|number}} builderID
|arg2 = {{type|number}} buildSpeed {{bracket}}
|arg3 = {{type|number}} repairSpeed {{bracket}}
|arg4 = {{type|number}} reclaimSpeed{{bracket}}
|arg5 = {{type|number}} resurrectSpeed {{bracket}}
|arg6 = {{type|number}} captureSpeed {{bracket}}
|arg7 = {{type|number}} terraformSpeed {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitNanoPieces
|arg1 = {{type|number}} builderID
|arg2 = {{type|table}} pieces {{bracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|92.0}}<br>This saves a lot of engine calls, by replacing: function script.QueryNanoPiece() return currentpiece end<br>Use it!
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = UnitAttach
|arg1 = {{type|number}} transporterID
|arg2 = {{type|number}} passengerID
|arg3 = {{type|number}} pieceNum
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = UnitDetach
|arg1 = {{type|number}} passengerID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = UnitDetachFromAir
|arg1 = {{type|number}} passengerID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitLoadingTransport
|arg1 = {{type|number}} passengerID
|arg2 = {{type|number}} transportID
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>Disables collisions between the two units to allow colvol intersection during the approach.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitPieceParent
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} AlteredPiece
|arg3 = {{type|number}} ParentPiece
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>Changes the pieces hierarchy of a unit by attaching a piece to a new parent.
}}
 


{{LuaCallout
'''Spring.GetUnitsInRectangle'''
|prefix = Spring.
  ( number xmin, number zmin, number xmax, number zmax [,number teamID] )
|name = SetUnitPieceMatrix
    -> nil | unitTable = { [1] = number unitID, etc... }
|arg1 = {{type|number}} unitID
'''Spring.GetUnitsInBox'''
|arg2 = {{type|number}} pieceNum
  ( number xmin, number ymin, number zmin,
|arg3 = {{type|table }} matrix
    number xmax, number ymax, number zmax [,number teamID] )
|arg4 =
    -> nil | unitTable = { [1] = number unitID, etc... }
|arg5 =
'''Spring.GetUnitsInSphere'''
|arg6 =  
  ( number x, number y, number z, number radius [,number teamID] )
|arg7 =  
    -> nil | unitTable = { [1] = number unitID, etc... }
|arg8 =
'''Spring.GetUnitsInCylinder'''
|arg9 =  
  ( number x, number z, number radius [,number teamID] )
|return = {{type|nil}}
    -> nil | unitTable = { [1] = number unitID, etc... }
|info = {{new|104.0}}<br>Sets the local (i.e. parent-relative) matrix of the given piece if any of the first three elements are non-zero, and also blocks all script animations from modifying it until {0, 0, 0} is passed (matrix should be an array of 16 floats, but is not otherwise sanity-checked).
'''Spring.GetUnitsInPlanes'''
}}
  ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )
    -> nil | unitTable = { [1] = number unitID, etc... }
<font color="#55ee99">
  plane normals point towards accepted space,
  so the acceptance criteria for each plane is:
    radius    = unit radius
    px, py, pz = unit position
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  <=  0
</font>


'''Spring.GetUnitNearestAlly'''
  ( number unitID [, number range ] ) -> nil | number unitID
'''Spring.GetUnitNearestEnemy'''
  ( number unitID [, number range [, bool useLOS]] ) -> nil | number unitID


{{LuaCallout
<span class="note">Post 95.0 this no longer returns neutral units</span>
|prefix = Spring.
|name = SetUnitArmored
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} armored {{bracket}}
|arg3 = {{type|number}} armorMultiple {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = <span class="warning">armorMultiple new in version 0.83.x</span>
}}


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


{{LuaCallout
'''Spring.GetUnitTooltip'''
|prefix = Spring.
  ( number unitID ) -> nil | string tooltip
|name = SetUnitShieldState
'''Spring.GetUnitDefID'''
|arg1 = {{type|number}} unitID {{bracket}}
  ( number unitID ) -> nil | number unitDefID
|arg2 = {{type|number}} weaponID = -1 {{bracket}}
'''Spring.GetUnitTeam'''
|arg3 = {{type|bool}} enabled {{bracket}}
  ( number unitID ) -> nil | number teamID
|arg4 = {{type|number}} power {{rbracket}}{{rbracket}}{{rbracket}}
'''Spring.GetUnitAllyTeam'''
|arg5 =  
  ( number unitID ) -> nil | number allyID
|arg6 =
'''Spring.GetUnitLineage''' <span class="warning"> Removed from version 0.83.x</span> <br>
|arg7 =
  ( number unitID ) -> nil | number lineage | number lineage, boolean lineageIsRoot
|arg8 =
'''Spring.GetUnitNeutral'''
|arg9 =
  ( number unitID ) -> nil | boolean neutral
|return = {{type|nil}}
'''Spring.GetUnitHealth'''
|info =
  ( 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>


{{LuaCallout
'''Spring.GetUnitMetalExtraction''' <span class="note">0.82+ and later</span>
|prefix = Spring.
  ( number unitID ) -> nil | number
|name = SetUnitFlanking
'''Spring.GetUnitExperience'''
|arg1 = {{type|number}} unitID
  ( number unitID ) -> nil | number experience
|arg2 = {{type|string}} "mode"
'''Spring.GetUnitStates'''
|arg3 = {{type|number }} mode
  ( number unitID ) -> nil | {
|arg4 =
    "firestate" = number,
|arg5 =
    "movestate" = number,
|arg6 =
    "repeat" = boolean,
|arg7 =
    "cloak" = boolean,
|arg8 =
    "active" = boolean,
|arg9 =
    "trajectory" = boolean,
|return = {{type|nil}}
    ["autoland" = boolean,]
|info =
    ["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


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


{{LuaCallout
'''Spring.GetUnitBasePosition''' <span class="warning">Deprecated in 89.0, use GetUnitPosition</span>
|prefix = Spring.
  ( number unitID ) -> nil | number x, number y, number z
|name = SetUnitFlanking
<font color="#55ee99">returns the bottom of the unit.</font>
|arg1 = {{type|number}} unitID
|arg2 = {{type|string}} "moveFactor"
|arg3 = {{type|number }} factor
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


or
'''Spring.GetUnitDirection'''
  ( number unitID ) -> nil | number dx, number dy, number dz
<span class="note">returns the direction vector</span>


{{LuaCallout
'''Spring.GetUnitHeading'''
|prefix = Spring.
  ( number unitID ) -> nil | number heading
|name = SetUnitFlanking
<span class="note">returns heading directions used in COB scripts</span>
|arg1 = {{type|number}} unitID
|arg2 = {{type|string}} "minDamage"
|arg3 = {{type|number }} minDamage
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


or
'''Spring.GetUnitRotation''' {{New|95.0}}
  (number unitID) --> nil | number pitch, number yaw, number roll
<span class="note">Marked as (WIP) in changelog</span>


{{LuaCallout
|prefix = Spring.
|name = SetUnitFlanking
|arg1 = {{type|number}} unitID
|arg2 = {{type|string}} "maxDamage"
|arg3 = {{type|number }} maxDamage
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
|prefix = Spring.
|name = SetUnitFlanking
|arg1 = {{type|number}} unitID
|arg2 = {{type|string}} "dir"
|arg3 = {{type|number }} x
|arg4 = {{type|number }} y
|arg5 = {{type|number }} z
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
'''Spring.GetUnitLosState''' <font color="red">raw is only available in gadgets</font>
|prefix = Spring.
  ( number unitID [, number allyTeamID [, boolean raw] ] ) -> nil | number raw |
|name = SetUnitWeaponState
  { ["los" = true] [, "radar" = true] [, "typed" = true] }
|arg1 = {{type|number}} unitID
'''Spring.GetUnitSeparation''' <span class="warning">surfaceDist new in 95.0</span>
|arg2 = {{type|number}} weaponNum
  ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -> nil | number distance
|arg3 = {{type|table }} states
<font color="#55ee99">returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos</font>
|arg4 =  
|arg5 =  
|arg6 =  
|arg7 =  
|arg8 =
|arg9 =  
|return = {{type|nil}}
|info =
}}


or
'''Spring.GetUnitFeatureSeparation''' {{new|101.0}}
  ( number unitID, number featureID [, boolean 2D] ) -> nil | number distance


{{LuaCallout
'''Spring.GetUnitDefDimensions'''
|prefix = Spring.
  ( number unitDefID ) -> nil |
|name = SetUnitWeaponState
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} weaponNum
|arg3 = {{type|string }} key
|arg4 = {{type|number}} value
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
<span class="note">Format of the states table:
     {
     {
       ["reloadState"     = number value,]
       "height" = number,
       ["reloadFrame"     = number value,] (synonym for reloadState!)
       "radius" = number,
       ["reloadTime"     = number value,]
       "midx"   = number,
       ["accuracy"       = number value,]
       "minx"   = number,
       ["sprayAngle"     = number value,]
       "maxx"   = number,
       ["range"           = number value,] (*)
       "midy"   = number,
       ["projectileSpeed" = number value,]
       "miny"   = number,
       ["burst"           = number value,]
       "maxy"   = number,
       ["burstRate"       = number value,]
       "midz"   = number,
       ["projectiles"     = number value,]
       "minz"   = number,
       ["salvoLeft"       = number value,]
       "maxz"  = number
      ["nextSalvo"      = number value,]
      ["aimReady"        = number value,] (<>0.0f := true)
    }
  (*) if you change the range of a weapon with dynamic damage
  make sure you use SetUnitWeaponDamages to change dynDamageRange as well.
   </span>
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitWeaponDamages
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} "selfDestruct" {{pipe}} {{type|string}} "explode"
|arg3 = {{type|table}} damages
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitWeaponDamages
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} "selfDestruct" {{pipe}} {{type|string}} "explode"
|arg3 = {{type|string}} key
|arg4 = {{type|number}} value
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
<span class="note">Format of the damages table:
  {
      ["paralyzeDamageTime" = number value,] 
      ["impulseFactor"      = number value,]
      ["impulseBoost"      = number value,]
      ["craterMult"        = number value,]
      ["craterBoost"        = number value,]
      ["dynDamageExp"      = number value,]
      ["dynDamageMin"      = number value,]
      ["dynDamageRange"    = number value,]
      ["dynDamageInverted"  = number value,] (<>0.0f := true)
      ["craterAreaOfEffect" = number value,]
      ["damageAreaOfEffect" = number value,]
      ["edgeEffectiveness"  = number value,]
      ["explosionSpeed"    = number value,]
      [number armorType    = number value,] (changes the damage against this armor type)
     }
     }
  </span>
'''Spring.GetUnitLastAttacker'''
 
  ( number unitID ) -> nil | number unitID
 
'''Spring.GetUnitLastAttackedPiece''''
{{LuaCallout
  ( number unitID ) -> nil | string pieceName, number gameframe
|prefix = Spring.
'''Spring.GetUnitMoveTypeData''' <span class="note">new in version 0.80+</span>
|name = SetUnitCollisionVolumeData
   ( number unitID ) -> nil | { movetype data }
|arg1 = {{type|number}} unitID
'''Spring.GetUnitCollisionVolumeData'''
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ
  ( number unitID )
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ
  -> number scaleX, number scaleY, number scaleZ,
|arg4 = {{type|number}} vType
  number offsetX, number offsetY, number offsetZ,
|arg5 = {{type|number}} tType
  number volumeType, number testType, number primaryAxis, boolean disabled
|arg6 = {{type|number}} Axis
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
  <span class="note">enum COLVOL_TYPES {
      COLVOL_TYPE_DISABLED = -1,
      COLVOL_TYPE_ELLIPSOID = 0,
      COLVOL_TYPE_CYLINDER,
      COLVOL_TYPE_BOX,
      COLVOL_TYPE_SPHERE,
      COLVOL_NUM_TYPES      // number of non-disabled collision volume types
    };
    enum COLVOL_TESTS {
      COLVOL_TEST_DISC = 0,
      COLVOL_TEST_CONT = 1,
      COLVOL_NUM_TESTS = 2   // number of tests
    };
    enum COLVOL_AXES {
      COLVOL_AXIS_X  = 0,
      COLVOL_AXIS_Y  = 1,
      COLVOL_AXIS_Z  = 2,
      COLVOL_NUM_AXES = 3    // number of collision volume axes
    };
  </span>
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitPieceCollisionVolumeData
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} pieceIndex
|arg3 = {{type|bool}} enable
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ {{bracket}}
|arg6 = {{type|number}} volumeType {{bracket}}
|arg7 = {{type|number}} primaryAxis {{rbracket}}{{rbracket}}
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = As of 101.0 this is 1-based piece index argument (was 0-based).
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitTravel
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} travel {{bracket}}
|arg3 = {{type|number}} travelPeriod {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 


{{LuaCallout
==== Unit Weapon Informations ====
|prefix = Spring.
'''Spring.GetUnitWeaponState'''
|name = SetUnitMoveGoal
  ( number unitID, number weaponNum ) -> nil |
|arg1 = {{type|number}} unitID
    boolean angleGood, boolean loaded, number reloadFrame, number salvoLeft, number numStockpiled
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}
  ( number unitID, number weaponNum, string tag ) -> nil | number
|arg3 = {{type|number}} goalRadius {{bracket}}
  <span class=note>`tag` can be:
|arg4 = {{type|number}} moveSpeed {{bracket}}
  "reloadState" == "reloadFrame"
|arg5 = {{type|bool}} moveRaw {{rbracket}}{{rbracket}}{{rbracket}}
  "reloadTime"
|arg6 =
  "accuracy"
|arg7 =
  "sprayAngle"
|arg8 =
  "range"
|arg9 =
  "projectileSpeed"
|return = {{type|nil}}
  "burst"
|info = <span class="note">Used by default commands to get in build-, attackrange etc.</span><br>{{new|98.0}} <span class="note">moveRaw: [http://springrts.com/mantis/view.php?id=4412 allow unit to dumbly move to a coordinate without calculating path.]</span>
  "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>


{{LuaCallout
'''Spring.GetUnitWeaponVectors'''
|prefix = Spring.
  ( number unitID, number weaponNum ) -> nil | number posX, number posY, number posZ,
|name = SetUnitLandGoal
    number dirX, number dirY, number dirZ
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} goalX, {{type|number}} goalY, {{type|number}} goalZ {{bracket}}
|arg3 = {{type|number}} goalRadius {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>Used in conjunction with {{name|Spring.UnitAttach}} et al. to re-implement old airbase & fuel system in Lua.
}}


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


{{LuaCallout
'''Spring.GetUnitWeaponTestTarget''' {{new|94.0}}
|prefix = Spring.
  ( number unitID, number weaponNum,
|name = ClearUnitGoal
    number targetID | number posX, number posY, number posZ ) -> nil | boolean success
|arg1 = {{type|number}} unitID
<span class="note">Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.</span>
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|102.0}}
}}


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


{{LuaCallout
From 104.0 onwards the param list changes so that source firing position can also be passed:
|prefix = Spring.
|name = SetUnitPhysics
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = <span class="warning">Drag new in version 95.0</span>
}}


  ( unitID, weaponNum,
    targetID | [srcPosX [, srcPosY [, srcPosZ [, tgtPosX [, tgtPosY [, tgtPosZ ]]]]]] ) -> nil | boolean success


{{LuaCallout
'''Spring.GetUnitWeaponCanFire''' {{new|95.0}}
|prefix = Spring.
  ( number unitID, number weaponNum ) -> nil | boolean canFire
|name = SetUnitPosition
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} x
|arg3 = {{type|number}} z {{bracket}}
|arg4 = {{type|bool}} alwaysAboveSea {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
''returned number of args is always 3 if targetType != None''
|prefix = Spring.
|name = SetUnitDirection
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} x
|arg3 = {{type|number}} y
|arg4 = {{type|number}} z
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|90.0}}
}}


'''Spring.GetRadarErrorParams''' {{new|95.0}}
  (number allyTeamID) --> nil |
  number allyteamErrorSize, number baseErrorSize, number baseErrorMult


{{LuaCallout
'''Spring.GetUnitPosErrorParams''' {{new|95.0}}
|prefix = Spring.
  (number unitID) --> nil |
|name = SetUnitVelocity
      number posErrorVector.x, number posErrorVector.y, number posErrorVector.z,
|arg1 = {{type|number}} unitID
      number posErrorDelta.x, number posErrorDelta.y, number posErrorDelta.z,
|arg2 = {{type|number}} velX
      number nextPosErrorUpdate
|arg3 = {{type|number}} velY
|arg4 = {{type|number}} velZ
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


==== 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}


{{LuaCallout
'''Spring.GetUnitPiecePosition'''
|prefix = Spring.
  ( number unitID, number piece ) -> number posx, number posy, number posz
|name = SetUnitRotation
<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>
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} rotX
|arg3 = {{type|number}} rotY
|arg4 = {{type|number}} rotZ
|arg5 =  
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
'''Spring.GetUnitPiecePosDir'''
|prefix = Spring.
  ( number unitID, number pieceNum ) -> nil | number posX, number posY, number posZ,
|name = AddUnitImpulse
    number dirX, number dirZ, number dirY
|arg1 = {{type|number}} unitID
<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>
|arg2 = {{type|number}} x
|arg3 = {{type|number}} y
|arg4 = {{type|number}} z {{bracket}}
|arg5 = {{type|number}} decayRate {{rbracket}}
|arg6 =  
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''Spring.GetUnitPieceMatrix'''
  ( number unitID, number piece ) -> { [1] = number, ... , [16] = number }


{{LuaCallout
'''Spring.GetUnitPieceList'''
|prefix = Spring.
  ( number unitID ) -> { [1] = string "piecename", ... , [pieceNumN] = string "piecename" }
|name = AddUnitSeismicPing
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} pingSize
|arg3 =  
|arg4 =  
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''Spring.GetUnitPieceMap'''
  ( number unitID ) -> { "piecename1" = pieceNum1, ... , "piecenameN" = pieceNumN }


{{LuaCallout
'''Spring.GetUnitPieceInfo'''
|prefix = Spring.
  ( number unitID, number piece ) -> {
|name = RemoveBuildingDecal
    "name"    = string "piecename",
|arg1 = {{type|number}} unitID
    "isEmpty"  = boolean,
|arg2 =  
    "children" = { [1] = string "piecename", ... },
|arg3 =  
    "min"      = { [1] = number x, [2] = number y, [3] = number z },
|arg4 =  
    "max"      = { [1] = number x, [2] = number y, [3] = number z },
|arg5 =  
    "offset"  = { [1] = number x, [2] = number y, [3] = number z },
|arg6 =  
    "parent" = string "parentpiecename", 
|arg7 =  
  }
|arg8 =  
{{new|95.0}} "parent" field
|arg9 =
{{new|101.0}} parent for root pieces is now "[null]" instead of ""
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
'''Spring.GetUnitScriptNames'''
|prefix = Spring.
  ( number unitID )
|name = SetUnitMidAndAimPos
  -> { "cobpiecename1" = ScriptPieceNum1, ... , "cobpiecenameN" = ScriptPieceNumN }
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}
|arg4 = {{type|bool}} relative {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info = {{new|89.0}}<br>mpx, mpy, mpz: New middle position of unit<br>apx, apy, apz: New position that enemies aim at on this unit<br>relative: Are the new coordinates relative to world or unit coordinates?
}}


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


{{LuaCallout
=== CommandQueues ===
|prefix = Spring.
'''Spring.GetUnitCommands''' <br/>
|name = SetUnitRadiusAndHeight
'''Spring.GetCommandQueue''' <span class="note">(Alias)</span>
|arg1 = {{type|number}} unitID
  ( number unitID, number count = 0 ) -> nil | number commandQueueSize {{new|96}}
|arg2 = {{type|number}} radius
  ( number unitID [, number count = -1] )
|arg3 = {{type|number}} height
  -> nil | table commandQueueTable = {
|arg4 =  
    [1] = {
|arg5 =  
      "id"      = number,
|arg6 =  
      "params"  = { [1] = number, ...},
|arg7 =  
      "options" = {
|arg8 =  
        "coded"    = number,
|arg9 =  
        "alt"      = boolean,
|return = {{type|bool}} success
        "ctrl"    = boolean,
|info = {{new|89.0}}
        "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>


{{LuaCallout
'''Spring.GetFullBuildQueue'''
|prefix = Spring.
  ( number unitID ) ->
|name = UnitWeaponFire
  nil | buildOrders = {
|arg1 = {{type|number}} unitID
          [1] = { [number unitDefID] = number count },  etc...
|arg2 = {{type|number}} weaponID
        }
|arg3 =  
'''Spring.GetRealBuildQueue''' <font color="#55ee99">(cleans the buildqueue of things the unit can't build itself)</font>
|arg4 =  
  ( number unitID ) ->
|arg5 =  
  nil | buildOrders = {
|arg6 =  
          [1] = { [number unitDefID] = number count },  etc...
|arg7 =  
        }
|arg8 =  
'''Spring.GetFactoryCommands'''
|arg9 =  
  ( number unitID, number count = 0 ) -> nil | number commandQueueSize {{new|96}}
|return = {{type|nil}}
  ( number unitID [, number count = -1 ] )
|info =
  -> 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 }, ...
  }


{{LuaCallout
=== Command Descriptions/Buttons ===
|prefix = Spring.
'''Spring.GetUnitCmdDescs'''
|name = UnitWeaponHoldFire
  ( number unitID [, number startIndex [, number endIndex ] ] ) -> nil | {
|arg1 = {{type|number}} unitID
      [1] = {
|arg2 = {{type|number}} weaponID
        "id"          = number,
|arg3 =  
        "type"        = number,
|arg4 =  
        "name"        = string,
|arg5 =  
        "action"      = string,
|arg6 =  
        "tooltip"    = string,
|arg7 =  
        "texture"    = string,
|arg8 =  
        "cursor"      = string,
|arg9 =  
        "hidden"      = boolean,
|return = {{type|nil}}
        "disabled"    = boolean,
|info =  
        "showUnique"  = boolean,
}}
        "onlyTexture" = boolean,


== Unit LOS ==
        "params"      = { [1] = string, ... }
    }, ...
  }
'''Spring.FindUnitCmdDesc'''
  ( number unitID, number cmdID ) -> nil | number index


{{LuaCallout
== Features ==
|prefix = Spring.
=== GetFeatures ===
|name = SetUnitCloak
'''Spring.GetFeaturesInRectangle'''
|arg1 = {{type|number}} unitID
  ( number xmin, number zmin, number xmax, number zmax )
|arg2 = {{type|bool}} cloaked {{pipe}} {{type|number}} scriptCloak {{bracket}}
    -> featureTable = { [1] = number featureID, etc... }
|arg3 = {{type|bool}} decloakAbs {{pipe}} {{type|number}} decloakDistance {{rbracket}}
'''Spring.GetFeaturesInSphere'''
|arg4 =  
  ( number x, number y, number z, number radius )
|arg5 =  
    -> featureTable = { [1] = number featureID, etc... }
|arg6 =  
'''Spring.GetFeaturesInCylinder'''
|arg7 =  
  ( number x, number z, number radius )
|arg8 =
    -> featureTable = { [1] = number featureID, etc... }
|arg9 =
'''Spring.GetAllFeatures'''
|return = {{type|nil}}
  ( ) -> { [1] = number featureID, ... }
|info = If the 2nd argument is a number, the value works like this:<br>1:=normal cloak<br>2:=for free cloak (cost no E)<br>3:=for free + no decloaking (except the unit is stunned)<br>4:=ultimative cloak (no ecost, no decloaking, no stunned decloak)<br><br>The decloak distance is only changed:<br>- if the 3th argument is a number or a boolean.<br>- if the boolean is false it takes the default decloak distance for that unitdef,<br>- if the boolean is true it takes the absolute value of it.
}}


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


{{LuaCallout
'''Spring.GetFeatureVelocity''' {{new|95.0}}
|prefix = Spring.
  ( number featureID [, boolean norm] )
|name = SetUnitSonarStealth
  -> nil | number velx, number vely, number velz, number velLength
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} sonarStealth
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''Spring.GetFeatureDirection'''
  ( number featureID ) -> nil | number dirx, number diry, number dirz


{{LuaCallout
'''Spring.GetFeatureRotation''' {{New|101.0}}
|prefix = Spring.
  (number featureID) --> nil | number pitch, number yaw, number roll
|name = SetUnitStealth
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} stealth
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
'''Spring.GetFeaturePieceCollisionVolumeData''' {{new|101.0}}
|prefix = Spring.
  ( number featuerID, number pieceID )
|name = SetUnitAlwaysVisible
  -> number scaleX, number scaleY, number scaleZ,
|arg1 = {{type|number}} unitID
  number offsetX, number offsetY, number offsetZ,
|arg2 = {{type|bool}} alwaysVisible
  number volumeType, number testType, number primaryAxis, boolean disabled
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
=== Feature Pieces ===
|prefix = Spring.
See #Unit_Pieces for full details.
|name = SetUnitLosMask
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} allyTeam
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes
|arg4 =  
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = The 3rd argument is either the bit-and combination of the following numbers:<br>LOS_INLOS    = 1<br>LOS_INRADAR  = 2<br>LOS_PREVLOS  = 4<br>LOS_CONTRADAR = 8<br><br>or a table of the following form:<br>losTypes = {<br>[los = boolean,]<br>[radar = boolean,]<br>[prevLos = boolean,]<br>[contRadar = boolean]<br>}
}}


'''Spring.GetFeatureLastAttackedPiece'''


{{LuaCallout
'''Spring.GetFeaturePieceMap'''
|prefix = Spring.
|name = SetUnitLosState
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} allyTeam
|arg3 = {{type|number}} los  {{pipe}} {{type|table }} losTypes
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = See above for more info on the arguments.
}}


'''Spring.GetFeaturePieceList'''


{{LuaCallout
'''Spring.GetFeaturePieceInfo'''
|prefix = Spring.
|name = SetUnitSensorRadius
|arg1 = {{type|number}} unitID
|arg2 = {{type|string }} type
|arg3 = {{type|number}} radius
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} newRadius
|info = Type can be:<br>"los", "airLos", "radar", "sonar", "seismic", "radarJammer", "sonarJammer"
}}


'''Spring.GetFeaturePiecePosition'''


{{LuaCallout
'''Spring.GetFeaturePieceDirection'''
|prefix = Spring.
|name = SetRadarErrorParams
|arg1 = {{type|number}} allyTeamID
|arg2 = {{type|number }} allyteamErrorSize {{bracket}}
|arg3 = {{type|number}} baseErrorSize {{bracket}}
|arg4 = {{type|number}} baseErrorMult {{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|95.0}}
}}


'''Spring.GetFeaturePiecePosDir'''


{{LuaCallout
'''Spring.GetFeaturePieceMatrix'''
|prefix = Spring.
|name = SetUnitPosErrorParams
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z,
|arg3 = {{type|number}} posErrorDelta.x, {{type|number}} number posErrorDelta.y, {{type|number}} posErrorDelta.z {{bracket}}
|arg4 = {{type|number}} nextPosErrorUpdate {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|95.0}}
}}


== Unit Resourcing ==
== 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>


{{LuaCallout
'''Spring.GetGroundHeight'''
|prefix = Spring.
  ( number x, number z ) -> number y
|name = SetUnitResourcing
'''Spring.GetGroundOrigHeight'''
|arg1 = {{type|number}} unitID
  ( number x, number z ) -> number y
|arg2 = {{type|string }} res
''This returns the ground original (before terraforming) height at a given x,z position''
|arg3 = {{type|number}} amount
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


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


{{LuaCallout
'''Spring.GetGroundInfo'''
|prefix = Spring.
  ( number x, number z ) -> string "Type", number metal, number hardness,
|name = SetUnitResourcing
                            number tankSpeed, number kbotSpeed, number hoverSpeed,
|arg1 = {{type|number}} unitID
                            number shipSpeed, boolean receiveTracks
|arg2 = { res = {{type|number}} amount, ... }
'''Spring.GetGroundBlocked'''
|arg3 =
  ( number x, number z |
|arg4 =
    number x1, number z1, number x2, number z2 )
|arg5 =
    -> nil | string "feature", number featureID  | string "unit", number unitID
|arg6 =
'''Spring.GetGroundExtremes'''
|arg7 =
  ( ) -> nil | number minHeight, number maxHeight
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =  Possible values for res are: "[u{{pipe}}c][u{{pipe}}m][m{{pipe}}e]"<br>unconditional {{pipe}} conditional<br>use {{pipe}} make<br>metal {{pipe}} energy
}}


'''Spring.GetSmoothMeshHeight'''
  ( number x, number z ) -> number y


{{LuaCallout
'''Spring.GetMetalMapSize'''
|prefix = Spring.
  ( ) -> number sizeX, number sizeY
|name = AddUnitResource
|arg1 = {{type|number}} unitID
|arg2 = {{type|string }} "m" {{pipe}} "e"
|arg3 = {{type|number}} amount
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = 
}}


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


{{LuaCallout
'''Spring.GetTerrainTypeData''' {{new|92.0}}
|prefix = Spring.
  ( number i )
|name = UseUnitResource
    -> nil | string "name", number hardness,
|arg1 = {{type|number}} unitID
              number tankSpeed, number kbotSpeed, number hoverSpeed, number shipSpeed,
|arg2 = {{type|string }} "m" {{pipe}} "e"
              boolean receiveTracks
|arg3 = {{type|number}} amount
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} okay
|info = 
}}


or
'''Spring.GetGrass'''
  ( number x, number z ) -> number 0 | 1
<span class="note">where x & z are in worldspace coordinates</span>


{{LuaCallout
=== Test Orders ===
|prefix = Spring.
'''Spring.TestMoveOrder'''
|name = UseUnitResource
  ( number unitDefID, number x, number y, number z) -> boolean validMove
|arg1 = {{type|number}} unitID
{{New|95.0}} parameters now are:
|arg2 = { {{bracket}} "m" {{pipe}} "metal" {{pipe}} "e" {{pipe}} "energy" {{rbracket}} = amount, ... }
    number unitDefID,
|arg3 =
    number pos.x, number pos.y, number pos.z
|arg4 =
    [, number dir.x
|arg5 =
    [, number dir.y
|arg6 =
    [, number dir.z
|arg7 =
    [, boolean testTerrain
|arg8 =
    [, boolean testObjects
|arg9 =
    [, boolean centerOnly ]]]]]]
|return = {{type|nil}} {{pipe}} {{type|bool}} okay
    ) --> boolean
|info = 
}}






{{LuaCallout
|prefix = Spring.
|name = SetUnitHarvestStorage
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} metal
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =  {{new|97.0}}<br>See also {{xtaglink|Gamedev:UnitDefs|harvestStorage}} UnitDef tag.
}}


= Feature Handling =


{{LuaCallout
'''Spring.TestBuildOrder'''
|prefix = Spring.
  ( number unitDefID, number x, number y, number z, number facing)
|name = CreateFeature
    -> number blocking [,number featureID]
|arg1 = {{type|string}} "defName" {{pipe}} {{type|number}} featureDefID
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}
|arg3 = {{type|number}} heading {{bracket}}
|arg4 = {{type|number}} AllyTeamID {{bracket}}
|arg5 = {{type|number}} featureID {{rbracket}}{{rbracket}}{{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} featureID
|info = 
}}


  <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


{{LuaCallout
=== PathFinding ===
|prefix = Spring.
'''Spring.GetUnitEstimatedPath'''
|name = DestroyFeature
  ( number unitID ) -> nil | {
|arg1 = {{type|number}} featureDefID
    [1] = { x,y,z }, ...
|arg2 =  
  },{
|arg3 =  
    [1] = startIdxOfDetailedPath,
|arg4 =  
    [2] = startIdxOfDetailedEstimatedPath1,
|arg5 =
    [3] = startIdxOfDetailedEstimatedPath2,
|arg6 =  
  }
|arg7 =
  <font color="#55ee99">GetUnitEstimatedPath() returns 2 tables:
|arg8 =
    1 table the waypoints and 1 table with indices (in the waypoint table)
|arg9 =
    when a new (more lazy) pathfinding algorithm begins.
|return = {{type|nil}}
    So the waypoint table contains 3 different levels of details.</font>
|info =  
}}


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




{{LuaCallout
'''Spring.GetClosestValidPosition''' <span class="warning">//NOT FINISHED YET</span>
|prefix = Spring.
  ( number unitDefID, number x, number z, number r ) -> nil
|name = TransferFeature
|arg1 = {{type|number}} featureDefID
|arg2 = {{type|number}} teamID
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = 
}}


== Feature Control ==
== Projectiles ==


{{LuaCallout
'''Spring.GetProjectilesInRectangle'''
|prefix = Spring.
|name = SetFeatureHealth
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} health
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = 
}}


( number xmin, number zmin, number xmax, number zmax
  [, boolean excludeWeaponProjectiles
  [, boolean excludePieceProjectiles] ] )
  -> nil | projectileTable = { [1] = number projectileID, etc... }


{{LuaCallout
'''Spring.GetProjectileOwnerID''' {{new|99.0}}
|prefix = Spring.
  (number projectileID) -> nil | number unitID
|name = SetFeatureResources
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} metal
|arg3 = {{type|number}} energy {{bracket}}
|arg4 = {{type|number}} reclaimTime {{bracket}}
|arg5 = {{type|number}} reclaimLeft {{rbracket}}{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =  {{new|104.0}}
}}


'''Spring.GetProjectileTeamID''' {{new|99.0}}
  (number projectileID) -> nil | number teamID


{{LuaCallout
'''Spring.GetProjectileDefID'''
|prefix = Spring.
  (number projectileID) -> nil | number weaponDefID
|name = SetFeatureReclaim
  <span class=note>using this to get a weaponDefID is HIGHLY preferred <br/> to indexing WeaponDefNames via GetProjectileName<span>
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} reclaimLeft
|arg3 =
|arg4 =  
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''Spring.GetProjectileName'''
  ( number projectileID ) -> nil | string name
'''Spring.GetProjectileType'''
  ( number projectileID ) -> nil | boolean weapon, boolean piece


{{LuaCallout
'''Spring.GetProjectileTarget'''
|prefix = Spring.
  ( number projectileID )
|name = SetFeatureResurrect
  <span class="warning">Pre 95.0:</span>  -> nil | number targetID, string <span class=note>targetTypeStr</span>
|arg1 = {{type|number}} featureID
  <span class="warning">Post 95.0:</span> -> nil | [number <span class=note>targetTypeInt</span>, number targetID | table targetPos = {x, y, z}]
|arg2 = {{type|number}} unitDefID {{pipe}} {{type|string}} unitDefName {{bracket}}
|arg3 = {{type|number}} facing {{pipe}} {{type|string}} "facing" {{bracket}}
|arg4 = {{type|number}} progress {{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|104.0}} Second param can now be a number id instead of a string name, this also allows cancelling ressurection by passing {{value|-1}}. The level of progress can now be set via the additional 4th param.<br>Possible values for facing are:<br>"south" {{pipe}} "s" {{pipe}} 0<br>"east"  {{pipe}} "e" {{pipe}} 1<br>"north" {{pipe}} "n" {{pipe}} 2<br>"west"  {{pipe}} "w" {{pipe}} 3
}}


 
  <span class=note>targetTypeStr can be one of:  
{{LuaCallout
|prefix = Spring.
|name = SetFeaturePosition
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} x, {{type|number}} y, {{type|number}} z {{bracket}}
|arg3 = {{type|bool}} snapToGround {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureDirection
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureRotation
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureVelocity
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{New|95.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitPhysics
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ
|arg3 = {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ
|arg4 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ
|arg5 = {{type|number}} dragX, {{type|number}} dragY, {{type|number}} dragZ
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{New|95.0}}
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureMoveCtrl
|arg1 = {{type|number}} featureID {{bracket}}
|arg2 = {{type|bool}} enable {{bracket}}
|arg3 = {{type|number*}} args {{rbracket}}{{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Use this callout to control feature movement. The number* arguments are parsed as follows and all optional:<br><br>If enable is true:<br>{{bracket}}, velVector(x,y,z) -- initial velocity for feature<br>{{bracket}}, accVector(x,y,z) -- acceleration added every frame{{rbracket}}{{rbracket}}<br><br>If enable is false:<br>{{bracket}}, velocityMask(x,y,z) -- dimensions in which velocity is allowed to build when not using MoveCtrl<br>{{bracket}},  impulseMask(x,y,z) -- dimensions in which impulse is allowed to apply when not using MoveCtrl<br>{{bracket}}, movementMask(x,y,z) -- dimensions in which feature is allowed to move when not using MoveCtrl{{rbracket}}{{rbracket}}{{rbracket}}<br><br>As of spring 103.0 it is necessary to unlock feature movement on x,z axis before changing feature physics. For example use "Spring.SetFeatureMoveCtrl(featureID,false,1,1,1,1,1,1,1,1,1)" to unlock all movement prior to making SetFeatureVelocity calls.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureNoSelect
|arg1 = {{type|number}} featureID
|arg2 = {{type|bool}} noSelect
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureAlwaysVisible
|arg1 = {{type|number}} featureID
|arg2 = {{type|bool}} enable
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureCollisionVolumeData
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ
|arg3 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ
|arg4 = {{type|number}} vType
|arg5 = {{type|number}} tType
|arg6 = {{type|number}} Axis
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Check Spring.SetUnitCollisionVolumeData for further explanation of the arguments.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeaturePieceCollisionVolumeData
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} pieceIndex
|arg3 = {{type|bool}} enable
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ
|arg5 = {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ
|arg6 = {{type|number}} Axis
|arg7 = {{type|number}} volumeType {{bracket}}
|arg8 = {{type|number}} primaryAxis {{rbracket}}
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureMidAndAimPos
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ
|arg3 = {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{bracket}}
|arg4 = {{type|bool}} relative
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info = {{new|89.0}}<br>Check Spring.SetUnitMidAndAimPos for further explanation of the arguments.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureRadiusAndHeight
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} radius
|arg3 = {{type|number}} height
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info = {{new|89.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureMass
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} mass
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetFeatureBlocking
|arg1 = {{type|number}} featureID
|arg2 = {{type|boolean}} isBlocking
|arg3 = {{type|boolean}} isSolidObjectCollidable
|arg4 = {{type|boolean}} isProjectileCollidable
|arg5 = {{type|boolean}} isRaySegmentCollidable
|arg6 = {{type|boolean}} crushable
|arg7 = {{type|boolean}} blockEnemyPushing
|arg8 = {{type|boolean}} blockHeightChanges
|arg9 =
|return = {{type|nil}}
|info = {{new|95.0}}<br> Changed parameters.
}}
 
= Lua to COB =
 
{{LuaCallout
|prefix = Spring.
|name = CallCOBScript
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} funcID {{pipe}} {{type|string}} funcName
|arg3 = {{type|number}} retArgs
|arg4 = COBArg1
|arg5 = COBArg2
|arg6 = ...
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} returnValue, {{type|number}} retArg1, {{type|number}} retArg2, ...
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = GetCOBScriptID
|arg1 = {{type|number}} unitID
|arg2 = {{type|string}} funcName
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} funcID
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = GetUnitCOBValue
|arg1 = {{type|number}} unitID {{bracket}}
|arg2 = {{type|bool}} splitData=false {{rbracket}}
|arg3 = {{type|number}} COBValue {{bracket}}
|arg4 = {{type|number}} param1 {{bracket}}
|arg5 = {{type|number}} param2 {{bracket}}
|arg6 = {{type|number}} param3 {{bracket}}
|arg7 =  {{type|number}} param4 {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}
|arg8 =
|arg9 =
|return = {{type|number}} result {{pipe}} {{type|number}} result1, {{type|number}} result2
|info = Note: Don't use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!<br>You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitCOBValue
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} COBValue
|arg3 = {{type|number}} param1 {{bracket}}
|arg4 = {{type|number}} param2 {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Note: Don't use Spring.{{bracket}}Get{{pipe}}Set{{rbracket}}UnitCOBValue in LUS just because you are familar with it since bos/cob, use the LuaSpringAPI instead!<br>You can find the possible values for `COBValue` in [[Lua_ConstCOB#Get.2FSet|Lua_ConstCOB]]. Also see [[Animation-CobConstants#Custom_Variables|Custom_Variables]].
}}
 
= Give Order =
 
Options can also be a bitmask; e.g. 0 instead of an empty table (can avoid performance hit on table creation)<br>
See [[Lua CMDs]] for relevant constants.
 
 
{{LuaCallout
|prefix = Spring.
|name = GiveOrderToUnit
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} cmdID
|arg3 = params = { number, etc...}
|arg4 = options = {"alt", "ctrl", "shift", "right"}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = GiveOrderToUnitMap
|arg1 = unitMap = { {{bracket}}unitID{{rbracket}} = example, etc... }
|arg2 = {{type|number}} cmdID
|arg3 = params = { number, etc...}
|arg4 = options = {"alt", "ctrl", "shift", "right"}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = GiveOrderToUnitArray
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = unitID, etc... }
|arg2 = {{type|number}} cmdID
|arg3 = params = { number, etc...}
|arg4 = options = {"alt", "ctrl", "shift", "right"}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = GiveOrderArrayToUnitMap
|arg1 = unitMap = { {{bracket}}{{type|number}} unitID{{rbracket}} = example, etc... }
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {"alt", "ctrl", "shift", "right"} } }
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = GiveOrderArrayToUnitArray
|arg1 = unitArray = { {{bracket}}1{{rbracket}} = {{type|number}} unitID, etc... }
|arg2 = orderArray = { { {{type|number}} cmdID, params = { number, etc...}, options = {"alt", "ctrl", "shift", "right"} } }
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
=Ground=
== Grass ==
 
{{LuaCallout
|prefix = Spring.
|name = AddGrass
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = RemoveGrass
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
== Heightmap ==
<span class="note">Note that x & z coords are in worldspace (Game.mapSizeX/Z), still the heightmap resolution is [[Lua_ConstGame|Game.squareSize]].</span>
 
{{LuaCallout
|prefix = Spring.
|name = LevelHeightMap
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} z1 {{bracket}}
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} z2 {{rbracket}}
|arg5 = {{type|number}} height
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = AdjustHeightMap
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} z1 {{bracket}}
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} z2 {{rbracket}}
|arg5 = {{type|number}} height
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = (heightmap[x][z] += height;)
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = RevertHeightMap
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} z1 {{bracket}}
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} z2 {{rbracket}}
|arg5 = {{type|number}} origFactor
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetHeightMapFunc
|arg1 = lua_function {{bracket}}
|arg2 = arg1 {{bracket}}
|arg3 = arg2 {{bracket}}
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged
|info =
}}
Example code:<pre>
Spring.SetHeightMapFunc(function()
for z=0,Game.mapSizeZ, Game.squareSize do
for x=0,Game.mapSizeX, Game.squareSize do
Spring.SetHeightMap( x, z, 200 + 20 * math.cos((x + z) / 90) )
end
end
end)</pre>
 
 
{{LuaCallout
|prefix = Spring.
|name = AddHeightMap
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 = {{type|number}} height
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight
|info = Can only be called in SetHeightMapFunc()
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetHeightMap
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 = {{type|number}} height {{bracket}}
|arg4 = {{type|number}} terraform = 1 {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff
|info = Can only be called in SetHeightMapFunc(). The terraform argument is a scaling factor:<br>
If =0 nothing will be changed (the terraform starts) and if =1 the terraform will be finished.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = LevelSmoothMesh
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} z1 {{bracket}}
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} z2 {{rbracket}}
|arg5 = {{type|number}} height
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = AdjustSmoothMesh
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} z1 {{bracket}}
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} z2 {{rbracket}}
|arg5 = {{type|number}} height
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = RevertSmoothMesh
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} z1 {{bracket}}
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} z2 {{rbracket}}
|arg5 = {{type|number}} origFactor
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = SetSmoothMeshFunc
|arg1 = lua_function {{bracket}}
|arg2 = arg1 {{bracket}}
|arg3 = arg2 {{bracket}}
|arg4 = ... {{rbracket}}{{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} absTotalHeightMapAmountChanged
|info =
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = AddSmoothMesh
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 = {{type|number}} height
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} newHeight
|info = Can only be called in SetSmoothMeshFunc().
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetSmoothMesh
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 = {{type|number}} height {{bracket}}
|arg4 = {{type|number}} terraform = 1 {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} absHeightDiff
|info = Can only be called in SetSmoothMeshFunc().
}}
 
== TerrainTypes ==
 
{{LuaCallout
|prefix = Spring.
|name = SetMapSquareTerrainType
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 = {{type|number}} newType
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} oldType
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetTerrainTypeData
|arg1 = {{type|number}} typeIndex {{bracket}}
|arg2 = {{type|number}} speedTanks = nil {{bracket}}
|arg3 = {{type|number}} speedKBOts = nil {{bracket}}
|arg4 = {{type|number}} speedHovers = nil {{bracket}}
|arg5 = {{type|number}} speedShips = nil {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} true
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetSquareBuildingMask
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 = {{type|number}} mask
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|103.0}}
}}
 
See also {{xtaglink|Gamedev:UnitDefs|buildingMask}} unitdef tag.
 
== MetalAmount ==
 
{{LuaCallout
|prefix = Spring.
|name = SetMetalAmount
|arg1 = {{type|number}} x
|arg2 = {{type|number}} z
|arg3 = {{type|number}} metalAmount
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|83.0}}<br>x & z coords are in worldspace/16. metalAmount must be between 0 and 255*maxMetal (with maxMetal from the .smd or mapinfo.lua).
}}
 
= Command Descriptions =
<font color="red" style="font-size:120%; font-weight:600">Doesn't work in unsynced code!</font><br><br>
 
{{LuaCallout
|prefix = Spring.
|name = EditUnitCmdDesc
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} cmdDescID
|arg3 = {{type|table}} cmdArray
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
<pre>structure of cmdArray:
  {
    [ id          = int ],
    [ type        = int ],
    [ name        = string ],
    [ action      = string ],
    [ tooltip    = string ],
    [ texture    = string ],
    [ cursor      = string ],
    [ queueing    = boolean ],
    [ hidden      = boolean ],
    [ disabled    = boolean ],
    [ showUnique  = boolean ],
    [ onlyTexture = boolean ],
    [ params      = { string = string, ... } ]
  }</pre>
{{var|queueing}} is {{new|101.0}} and allows custom commands to be non-queueing (handy for state toggles).
 
 
{{LuaCallout
|prefix = Spring.
|name = InsertUnitCmdDesc
|arg1 = {{type|number}} unitID {{bracket}}
|arg2 = {{type|number}} cmdDescID {{rbracket}}
|arg3 = {{type|table}} cmdArray
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = RemoveUnitCmdDesc
|arg1 = {{type|number}} unitID {{bracket}}
|arg2 = {{type|number}} cmdDescID {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
= Other =
 
{{LuaCallout
|prefix = Spring.
|name = SetNoPause
|arg1 = {{type|bool}} noPause
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetUnitToFeature
|arg1 = {{type|bool}} tofeature
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = An ugly global switch that can be used to block units turning into features when they finish being built (like *A DT's do, which have the isFeature tag) [http://springrts.com/phpbb/viewtopic.php?f=14&p=481521 thread]
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = SetExperienceGrade
|arg1 = {{type|number}} expGrade {{bracket}}
|arg2 = {{type|number}} ExpPowerScale {{bracket}}
|arg3 = {{type|number}} ExpHealthScale {{bracket}}
|arg4 = {{type|number}} ExpReloadScale {{rbracket}}{{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = expGrade defines how often UnitExperience() will be called.<br>Prior to 104.0 it is based on the following equation:<br>(int) {{bracket}}exp/(exp+1){{rbracket}} / expGrade<br><br>Post 104.0 it is the raw change.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SpawnExplosion
|arg1 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0
|arg2 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0
|arg3 = {{type|table}} explosionParams
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|104.0}}
}}
  <pre>Possible keys of explosionParams are:
    weaponDef = number,
    owner = number,
    hitUnit = number,
    hitFeature = number,
    craterAreaOfEffect = number,
    damageAreaOfEffect = number,
    edgeEffectiveness = number,
    explosionSpeed = number,
    gfxMod = number,
    impactOnly = boolean,
    ignoreOwner = boolean,
    damageGround = boolean
 
Please note the explosion defaults to 1 damage regardless of what it's defined in the weaponDef.
The weapondefID is only used for visuals and for passing into callins like UnitDamaged.</pre>
 
 
{{LuaCallout
|prefix = Spring.
|name = SpawnCEG
|arg1 = {{type|string}} "cegname" | {{type|number}} cegID
|arg2 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0
|arg3 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0
|arg4 = {{type|number}} radius = 0
|arg5 = {{type|number}} damage = 0
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} success, {{type|number}} cegID
|info = cegID new in 95.0.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SpawnSFX
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} sfxID
|arg3 = {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0
|arg4 = {{type|number}} dirX = 0, {{type|number}} dirY = 0, {{type|number}} dirZ = 0
|arg5 = {{type|number}} radius = 0
|arg6 = {{type|number}} damage = 0 {{bracket}}
|arg7 = {{type|bool}} absolute {{rbracket}}
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} success
|info = {{new|104.0}}
}}
 
Equal to the [[Animation-LuaCallouts#Effects|UnitScript versions of EmitSFX]], but takes position and direction arguments (in either unit- or piece-space) instead of a piece index.
 
= Projectiles =
 
{{LuaCallout
|prefix = Spring.
|name = SpawnProjectile
|arg1 = {{type|number}} weaponDefID
|arg2 = {{type|table}} projectileParams
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} projectileID
|info =
}}
  <pre>Possible keys of projectileParams are:
    pos = {number x, number y, number z},
    end = {number x, number y, number z},
    speed = {number x, number y, number z},
    spread = {number x, number y, number z},
    error = {number x, number y, number z},
    owner = number,
    team = number,
    ttl = number,
    gravity = number,
    tracking = number,
    maxRange = number,
    startAlpha = number,
    endAlpha = number,
    model = string,
    cegTag = string</pre>
 
{{LuaCallout
|prefix = Spring.
|name = DeleteProjectile
|arg1 = {{type|number}} projectileID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>Silently removes projectiles (no explosion).
}}
 
 
<span class = "warning">Pre 95.0:</span>
{{LuaCallout
|prefix = Spring.
|name = SetProjectileTarget
|arg1 = {{type|number}} projectileID
|arg2 = {{bracket}} {{type|number}} targetID, {{type|string}} targetTypeStr {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{bracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget
|info =
}}
 
<span class = "warning">Post 95.0:</span>
{{LuaCallout
|prefix = Spring.
|name = SetProjectileTarget
|arg1 = {{type|number}} projectileID
|arg2 = {{bracket}} {{type|number}} targetID, {{type|number}} targetType {{rbracket}} {{pipe}} {{bracket}} {{type|number}} posX = 0, {{type|number}} posY = 0, {{type|number}} posZ = 0 {{bracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} validTarget
|info =
}}
  <pre>targetTypeStr can be one of:  
     'u' - unit
     'u' - unit
     'f' - feature
     'f' - feature
Line 2,742: Line 953:
     string.byte('u') := UNIT
     string.byte('u') := UNIT
     string.byte('f') := FEATURE
     string.byte('f') := FEATURE
     string.byte('p') := PROJECTILE</pre>
     string.byte('p') := PROJECTILE
 
  </span>
 
'''Spring.GetProjectileIntercepted''' {{new|99.0}}
{{LuaCallout
  ( number projectileID ) -> nil | boolean isBeingIntercepted
|prefix = Spring.
|name = SetProjectileIgnoreTrackingError
|arg1 = {{type|number}} projectileID
|arg2 = {{type|bool}} ignore
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileIsIntercepted
|arg1 = {{type|number}} projectileID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|99.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileMoveControl
|arg1 = {{type|number}} projectileID  
|arg2 = {{type|bool}} enable
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Disables engine movecontrol, so lua can fully control the physics.
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectilePosition
|arg1 = {{type|number}} projectileID {{bracket}}
|arg2 = {{type|number}} posX = 0 {{bracket}}
|arg3 = {{type|number}} posY = 0 {{bracket}}
|arg4 = {{type|number}} posZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileVelocity
|arg1 = {{type|number}} projectileID {{bracket}}
|arg2 = {{type|number}} velX = 0 {{bracket}}
|arg3 = {{type|number}} velY = 0 {{bracket}}
|arg4 = {{type|number}} velZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileCollision
|arg1 = {{type|number}} projectileID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileGravity
|arg1 = {{type|number}} projectileID {{bracket}}
|arg2 = {{type|number}} grav = 0 {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileSpinAngle
|arg1 = {{type|number}} projectileID {{bracket}}
|arg2 = {{type|number}} spinAngle = 0 {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{removed|95.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileSpinSpeed
|arg1 = {{type|number}} projectileID {{bracket}}
|arg2 = {{type|number}} speed = 0 {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{removed|95.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileSpinVec
|arg1 = {{type|number}} projectileID {{bracket}}
|arg2 = {{type|number}} spinX = 0 {{bracket}}
|arg3 = {{type|number}} spinY = 0 {{bracket}}
|arg4 = {{type|number}} spinZ = 0 {{rbracket}}{{rbracket}}{{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{removed|95.0}}
}}
 
 
{{LuaCallout
|prefix = Spring.
|name = SetProjectileCEG
|arg1 = {{type|number}} projectileID
|arg2 = {{type|string}} ceg_name
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 


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


{{LuaCallout
'''Spring.GetProjectileGravity'''
|prefix = Spring.
  ( number projectileID ) -> nil | number gravity
|name = SetPieceProjectileParams
|arg1 = {{type|number}} projectileID {{bracket}}
|arg2 = {{type|number}} explosionFlags {{bracket}}
|arg3 = {{type|number}} spinAngle {{bracket}}
|arg4 = {{type|number}} spinSpeed {{bracket}}
|arg5 = {{type|number}} spinVector.x {{bracket}}
|arg6 = {{type|number}} spinVector.y {{bracket}}
|arg7 = {{type|number}} spinVector.z {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|95.0}}
}}


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


{{LuaCallout
'''Spring.GetProjectileTimeToLive''' {{new|99.0}}
|prefix = Spring.
  ( number projectileID ) -> nil | number ttl
|name = SetProjectileAlwaysVisible
|arg1 = {{type|number}} projectileID
|arg2 = {{type|bool}} alwaysVisible
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|95.0}}  
}}


'''Spring.GetProjectileDirection''' {{new|95.0}}
  ( number projectileID ) -> nil | number dir.x, number dir.y, number dir.z


{{LuaCallout
'''Spring.GetProjectileSpinAngle'''  <span class="warning">Deprecated in 95.0</span>
|prefix = Spring.
  ( number projectileID ) -> nil | number angle
|name = SetProjectileDamages
'''Spring.GetProjectileSpinSpeed''' <span class="warning">Deprecated in 95.0</span>
|arg1 = {{type|number}} unitID
  ( number projectileID ) -> nil | number spinSpeed
|arg2 = {{type|number}} weaponNum
'''Spring.GetProjectileSpinVec'''  <span class="warning">Deprecated in 95.0</span>
|arg3 = {{type|table}} damages
  ( number projectileID ) -> nil | number x, number y, number z
|arg4 =
|arg5 =  
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


or


{{LuaCallout
'''Spring.GetProjectileDamages''' {{new|101.0}}
|prefix = Spring.
  ( number unitID, number weaponNum, string tag ) -> nil | number
|name = SetProjectileDamages
  <span class=note>`tag` can be:
|arg1 = {{type|number}} unitID
  "paralyzeDamageTime"
|arg2 = {{type|number}} weaponNum
  "impulseFactor"
|arg3 = {{type|string}} key
  "impulseBoost"
|arg4 = {{type|number}} value
  "craterMult"
|arg5 =
  "craterBoost"
|arg6 =
  "dynDamageExp"
|arg7 =
  "dynDamageMin"
|arg8 =
  "dynDamageRange"
|arg9 =
  "dynDamageInverted"
|return = {{type|nil}}
  "craterAreaOfEffect"
|info = {{new|101.0}}
  "damageAreaOfEffect"
}}
  "edgeEffectiveness"
<pre>Format of the damages table:
  "explosionSpeed"
  {
  - or -
      ["paralyzeDamageTime" = number value,] 
  an armor type index to get the damage against it.</span>
      ["impulseFactor"     = number value,]
      ["impulseBoost"       = number value,]
      ["craterMult"         = number value,]
      ["craterBoost"       = number value,]
      ["dynDamageExp"       = number value,]
      ["dynDamageMin"       = number value,]
      ["dynDamageRange"     = number value,]
      ["dynDamageInverted" = number value,] (<>0.0f := true)
      ["craterAreaOfEffect" = number value,]
      ["damageAreaOfEffect" = number value,]
      ["edgeEffectiveness" = number value,]
      ["explosionSpeed"     = number value,]
      [number armorType    = number value,] (changes the damage against this armor type)
    }</pre>


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

Revision as of 15:31, 6 March 2021

Development < Lua Scripting < User:Master-athmos

Game

Special TeamID Variables

(those special TeamIDs are not supported by all functions)
Spring.ALL_UNITS
Spring.MY_UNITS
Spring.ALLY_UNITS
Spring.ENEMY_UNITS

For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID()

Spring.GetGaiaTeamID

 ( ) -> number teamID

GameStates

Spring.IsGodModeEnabled

 ( ) -> boolean

Spring.IsCheatingEnabled

 ( ) -> boolean

Spring.IsDevLuaEnabled

 ( ) -> boolean

Spring.IsEditDefsEnabled

 ( ) -> boolean

Spring.AreHelperAIsEnabled

 ( ) -> boolean

Spring.FixedAllies

 ( ) -> nil | boolean

Spring.IsGameOver

 ( ) -> boolean

RulesParams

Those 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!)

string values are new since 95.0

Spring.GetRulesInfoMap REMOVED in 0.82!

 ( ) -> { [key1] = string value1, [key2] = string value2, ... }
 ( string "key" ) -> string

Spring.GetGameRulesParam

 ( number ruleIndex | string ruleName ) -> nil | number value | string value

Spring.GetGameRulesParams

 ( ) -> nil | { [ruleName1] = number | string value1, ... }

Spring.GetTeamRulesParam

 ( number teamID, number index | string ruleName ) -> nil | number value | string value

Spring.GetTeamRulesParams

 ( number teamID ) -> nil | { [ruleName1] = number | string value1, ... }


Spring.GetUnitRulesParam

 ( number unitID, number index | string ruleName ) -> nil | number value | string value

Spring.GetUnitRulesParams

 ( number unitID ) -> nil | { [ruleName1] = number | string value1, ... }

Spring.GetFeatureRulesParam

 ( number featureID, number index | string ruleName ) -> nil | number value | string value

Spring.GetFeatureRulesParams

 ( number featureID ) -> nil | { [ruleName1] = number | string value1, ... }

Mod-/Map-Options

Spring.GetModOptions

 ( ) -> {} | { "keyName1" = string "value", "keyName2" = string "value", ... }

Spring.GetMapOptions

 ( ) -> {} | { "keyName1" = string "value", "keyName2" = string "value", ... }


! bool values are not transfered from C to Lua correctly, so in IF theres needed to use this condition:

"if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end"
not only:
"if (Spring.GetModOptions.exampleOption) then...end"

Speed/Time

Spring.GetGameSpeed As of 98.0 moved to Lua_UnsyncedRead due to desyncs in replays/demos

 ( ) -> number userSpeedFactor, number speedFactor, boolean paused

Spring.GetGameFrame

 ( ) -> number frameNum%dayFrames, number frameNum/dayFrames

Spring.GetGameSeconds

 ( ) -> number seconds

Vectors

Spring.GetWind

 ( ) -> number dirX, number dirY, number dirZ, 
        number strength,  number normDirX, number normDirY, number normDirZ

Spring.GetHeadingFromVector

 ( number x, number z ) -> number heading

Spring.GetVectorFromHeading

 ( number heading ) -> number x, number z

Sides/Factions

Spring.GetSideData

 ( string sideName ) -> nil | string startUnit, string caseSensitiveSideName
 ( number sideID ) -> nil | string sideName, string startUnit, string caseSensitiveSideName
 ( ) -> { [1] = { sideName=string,caseName=string,startUnit=string}, [2] = .., .. }

Teams

StartBoxes/StartPositions

Spring.GetAllyTeamStartBox

 ( number allyID ) -> nil | number xmin, number zmin, number xmax, number zmax

Spring.GetTeamStartPosition

 ( number teamID ) -> nil | number x, number y, number z

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 here

Spring.GetPlayerList

 ( [number teamID = -1 | boolean onlyActive = false] [, number teamID | boolean onlyActive])
 -> nil | { [1] = number playerID, etc... }

From 104.0 onwards spectators will be ignored if a valid (>=0) teamID is given

Spring.GetTeamList

 ( [number allyTeamID = -1] ) -> nil | { [1] = number teamID, etc... }

Spring.GetAllyTeamList

 ( ) -> { [1] = number allyTeamID, etc... }

Spring.GetPlayerInfo

 ( number playerID ) -> 
   nil | string  "name",  (PRE-83.0: in synced code this is "SYNCED_NONAME"!)
         boolean active,
         boolean spectator,
         number  teamID,
         number  allyTeamID,
         number  pingTime,
         number  cpuUsage,
         string  country,
         number  rank
         table   customPlayerKeys

Spring.GetPlayerControlledUnit

 ( number playerID ) -> nil | number unitID

Spring.GetAIInfo

 ( number teamID ) -> 
         number  skirmishAIID,
         string  name,
         number  hostingPlayerID,
         string  shortName, (synced => "SYNCED_NOSHORTNAME"; non-local => "UNKNOWN")
         string  version,   (synced => "SYNCED_NOVERSION";   non-local => "UNKNOWN")
         table   options    (synced & non-local => empty-table)

Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.


Spring.GetAllyTeamInfo

 ( number allyteamID ) -> nil | table   customTeamKeys

Spring.GetTeamInfo

 ( number teamID ) ->
   nil | number  teamID,
         number  leader, (:= a player id)
         boolean isDead,
         boolean isAiTeam,
         string  "side",
         number  allyTeam,
         number  incomeMultiplier,
         table   customTeamKeys

Spring.GetTeamResources

 ( number teamID, string "metal" | "energy" ) ->
   nil | number currentLevel,
         number storage,
         number pull,
         number income,
         number expense,
         number share,
         number sent,
         number received

Spring.GetTeamUnitStats

 ( number teamID ) ->
   nil | number killed,
         number died,
         number capturedBy,
         number capturedFrom,
         number received,
         number sent

Spring.GetTeamResourceStats 0.82 and later

 ( number teamID,  string "metal" | "energy" ) ->
   nil | number used,
         number produced,
         number excessed,
         number received,
         number sent

Spring.GetTeamStatsHistory

 ( number teamID [, number startIndex [, number endIndex = startIndex ]]) ->
   nil |
   number cur_max_index |
   {
     [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
     }, ...
  }

if called with just teamID as argument it returns the current possible range for startIndex/endIndex :={1..cur_max_index}


Spring.GetTeamLuaAI

 ( number teamID ) -> string "luaAI"

Returns string containing name of AI defined in file LuaAI.lua as name="<AI name>". Maybe it returns whole table with all values there, so maybe depends, but in my LuaAI.lua name is on first position...

Teams/PlayersAllied

Spring.AreTeamsAllied

 ( number teamID1, number teamID2 ) -> nil | boolean

Spring.ArePlayersAllied

 ( number playerID1, number playerID2 ) -> nil | boolean

Units

GetUnits

Spring.GetAllUnits

 ( ) -> nil | unitTable = { [1] = number unitID, ... }

Spring.GetTeamUnits

 ( number teamID ) -> nil | unitTable = { [1] = number unitID, etc... }

Spring.GetTeamUnitsSorted

 ( number teamID ) -> nil |
   unitDefTable = {
     [number unitDefID] = { [1] = [number unitID], etc... },
     etc...
   }

Spring.GetTeamUnitsCounts

 ( number teamID ) -> nil | countTable = { [number unitDefID] = count, etc... }

Spring.GetTeamUnitsByDefs

 ( number teamID, number unitDefID | { number unitDefID1, ... } )
   -> nil | unitTable = { [1] = number unitID, etc... }

Spring.GetTeamUnitDefCount

 ( number teamID, number unitDefID ) -> nil | number count

Spring.GetTeamUnitCount

 ( number teamID ) -> nil | number count

Spring.GetUnitsInRectangle

 ( number xmin, number zmin, number xmax, number zmax [,number teamID] ) 
   -> nil | unitTable = { [1] = number unitID, etc... }

Spring.GetUnitsInBox

 ( number xmin, number ymin, number zmin,
   number xmax, number ymax, number zmax [,number teamID] )
   -> nil | unitTable = { [1] = number unitID, etc... }

Spring.GetUnitsInSphere

 ( number x, number y, number z, number radius [,number teamID] )
   -> nil | unitTable = { [1] = number unitID, etc... }

Spring.GetUnitsInCylinder

 ( number x, number z, number radius [,number teamID] )
   -> nil | unitTable = { [1] = number unitID, etc... }

Spring.GetUnitsInPlanes

 ( planes = { [1] = { number nx, number ny, number nz, number d }, etc... } )
   -> nil | unitTable = { [1] = number unitID, etc... }

 plane normals point towards accepted space,
 so the acceptance criteria for each plane is:
   radius     = unit radius
   px, py, pz = unit position
   [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  <=  0

Spring.GetUnitNearestAlly

 ( number unitID [, number range ] ) -> nil | number unitID

Spring.GetUnitNearestEnemy

 ( number unitID [, number range [, bool useLOS]] ) -> nil | number unitID

Post 95.0 this no longer returns neutral units

Unit Informations

Spring.ValidUnitID

 ( number unitID ) -> boolean

Spring.GetUnitIsDead

 ( number unitID ) -> nil | boolean

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())

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 Removed from version 0.83.x

 ( 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 armorMultiple new in version 0.83.x

 ( 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

See also harvestStorage UnitDef tag.

Spring.GetUnitMetalExtraction 0.82+ and later

 ( 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 in version 101.0

 ( number unitID ) -> nil | number

Spring.GetUnitBlocking New in version 85.0

 ( number unitID ) -> nil | boolean blocking, boolean crushable

New in version 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 ]

since 89.0, returns the base (default), middle or aim position of the unit.

Spring.GetUnitBasePosition Deprecated in 89.0, use GetUnitPosition

 ( number unitID ) -> nil | number x, number y, number z

returns the bottom of the unit.

Spring.GetUnitDirection

 ( number unitID ) -> nil | number dx, number dy, number dz

returns the direction vector

Spring.GetUnitHeading

 ( number unitID ) -> nil | number heading

returns heading directions used in COB scripts

Spring.GetUnitRotation New in version 95.0

  (number unitID) --> nil | number pitch, number yaw, number roll 

Marked as (WIP) in changelog


Spring.GetUnitVelocity velw new in 95.0

 ( number unitID ) -> nil | number velx, number vely, number velz, number velLength

velw returns the velocity length in one frame. Multiply by 30 (game frames/s) to get an equivalent to unitDef.speed


Spring.GetUnitBuildFacing

 ( number unitID ) -> nil | number

Spring.GetUnitIsBuilding returns what unit a constructor/factory is currently building

 ( number unitID ) -> nil | number unitID

Spring.GetUnitCurrentBuildPower New in version 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

possible types are:
los, airLos, radar, sonar, seismic, radarJammer & sonarJammer

Spring.GetUnitLosState raw is only available in gadgets

 ( number unitID [, number allyTeamID [, boolean raw] ] ) -> nil | number raw |
 { ["los" = true] [, "radar" = true] [, "typed" = true] }

Spring.GetUnitSeparation surfaceDist new in 95.0

 ( number unitID1, number unitID2 [, boolean 2D] [, boolean surfaceDist] ) -> nil | number distance

returns the distance of 2 units, surfaceDist calculates the distance between the unitsphere surfaces instead of their midpos

Spring.GetUnitFeatureSeparation New in version 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 new in version 0.80+

 ( 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
 `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"

Spring.GetUnitWeaponDamages New in version 101.0

 ( number unitID, number weaponNum | "selfDestruct" | "explode", string tag ) -> nil | number
 `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.

Spring.GetUnitWeaponVectors

 ( number unitID, number weaponNum ) -> nil | number posX, number posY, number posZ,
   number dirX, number dirY, number dirZ

Spring.GetUnitWeaponTryTarget New in version 94.0

 ( number unitID, number weaponNum, 
   number targetID | number posX, number posY, number posZ ) -> nil | boolean success

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.

Spring.GetUnitWeaponTestTarget New in version 94.0

 ( number unitID, number weaponNum, 
   number targetID | number posX, number posY, number posZ ) -> nil | boolean success

Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreLineOfFire.

Spring.GetUnitWeaponTestRange New in version 94.0

 ( number unitID, number weaponNum, 
   number targetID | number posX, number posY, number posZ ) -> nil | boolean success

Checks target is in range including height modifiers and cylinder targeting if set.

Spring.GetUnitWeaponHaveFreeLineOfFire New in version 94.0

 ( number unitID, number weaponNum, 
   number targetID | number posX, number posY, number posZ ) -> nil | boolean success

Runs a raytrace from unit aimpoint respecting collision flags.

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 in version 95.0

 ( number unitID, number weaponNum ) -> nil | boolean canFire

Spring.GetUnitWeaponTarget New in version 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 in version 95.0

 (number allyTeamID) --> nil | 
 number allyteamErrorSize, number baseErrorSize, number baseErrorMult

Spring.GetUnitPosErrorParams New in version 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 in version 101.0

 ( number unitID, number allyID ) -> boolean

Spring.IsUnitInAirLos New in version 101.0

 ( number unitID, number allyID ) -> boolean

Spring.IsUnitInRadar New in version 101.0

 ( number unitID, number allyID ) -> boolean

Spring.IsUnitInJammer New in version 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

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.

Spring.GetUnitPieceDirection Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir

 ( 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

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.

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 in version 95.0 "parent" field New in version 101.0 parent for root pieces is now "[null]" instead of ""

Spring.GetUnitScriptPiece

 ( number unitID [, number scriptPiece ] )
  -> nil | { scriptPieceNum = number modelPieceNum } | number modelPieceNum

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 piece definition in your cob/bos.

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
Spring.GetCommandQueue (Alias)

 ( number unitID, number count = 0 ) -> nil | number commandQueueSize New in version 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
      }
    }, ...
  }

This function can trigger an error if called too often without passing a second parameter. Refer to LuaSyncedRead.cpp#L3983-L3996

Spring.GetFullBuildQueue

 ( number unitID ) ->
 nil | buildOrders = {
         [1] = { [number unitDefID] = number count },  etc...
       }

Spring.GetRealBuildQueue (cleans the buildqueue of things the unit can't build itself)

 ( number unitID ) ->
 nil | buildOrders = {
         [1] = { [number unitDefID] = number count },  etc...
       }

Spring.GetFactoryCommands

 ( number unitID, number count = 0 ) -> nil | number commandQueueSize New in version 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 in version 101.0

 ( number featureID ) -> nil | number

Spring.GetFeatureSeparation New in version 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 ]]

since 89.0, returns the base (default), middle or aim position of the feature.

Spring.GetFeatureVelocity New in version 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 in version 101.0

  (number featureID) --> nil | number pitch, number yaw, number roll 

Spring.GetFeatureHeading

 ( number featureID ) -> nil | number heading

Spring.GetFeatureResources reclaimTime New in version 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 in version 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 in version 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

Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).

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 in version 100.0: smoothedNormal and slope

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 

where x & z are in metal map coordinates (worldspace/16)

Spring.GetMetalExtraction

 ( number x, number z ) -> number extractionAmount 

where x & z are in metal map coordinates (worldspace/16)

Spring.GetTerrainTypeData New in version 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 

where x & z are in worldspace coordinates

Test Orders

Spring.TestMoveOrder

 ( number unitDefID, number x, number y, number z) -> boolean validMove

New in version 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]
 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"

Spring.Pos2BuildPos optional param facing supported in 0.83 and later

 ( 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,
  }
 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.

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 jammed new in 95.0

 ( number x, number y, number z [, number allyID] )
   -> boolean LosOrRadar, boolean inLos, boolean inRadar, boolean jammed

jammed indicates if a position is actively being radar- or sonar-jammed by any allyteam


Spring.GetClosestValidPosition //NOT FINISHED YET

 ( 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 in version 99.0

  (number projectileID) -> nil | number unitID

Spring.GetProjectileTeamID New in version 99.0

  (number projectileID) -> nil | number teamID

Spring.GetProjectileDefID

  (number projectileID) -> nil | number weaponDefID
 using this to get a weaponDefID is HIGHLY preferred 
to indexing WeaponDefNames via GetProjectileName

Spring.GetProjectileName

 ( number projectileID ) -> nil | string name

Spring.GetProjectileType

 ( number projectileID ) -> nil | boolean weapon, boolean piece

Spring.GetProjectileTarget

 ( number projectileID )
 Pre 95.0:  -> nil | number targetID, string targetTypeStr
 Post 95.0: -> nil | [number targetTypeInt, number targetID | table targetPos = {x, y, z}]
 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
 

Spring.GetProjectileIntercepted New in version 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 in version 95.0: returns (targetPos - startPos) for Beamlasers and similar weapons

Spring.GetProjectileGravity

 ( number projectileID ) -> nil | number gravity

Spring.GetPieceProjectileParams New in version 95.0

 ( number projectileID ) -> nil |  number explosionFlags, number spinAngle, 
 number spinSpeed, number spinVector.x, number spinVector.y, number spinVector.z
 Where explosionFlags use binary flags with the following integer equivalents: 
  more info here
  SHATTER = 1,  EXPLODE = 2, EXPLODE_ON_HIT = 2, FALL = 4, SMOKE = 8, FIRE = 16
  NONE = 32, NO_CEG_TRAIL = 64, NO_HEATCLOUD = 128   

Spring.GetProjectileTimeToLive New in version 99.0

 ( number projectileID ) -> nil | number ttl

Spring.GetProjectileDirection New in version 95.0

 ( number projectileID ) -> nil | number dir.x, number dir.y, number dir.z

Spring.GetProjectileSpinAngle Deprecated in 95.0

 ( number projectileID ) -> nil | number angle

Spring.GetProjectileSpinSpeed Deprecated in 95.0

 ( number projectileID ) -> nil | number spinSpeed

Spring.GetProjectileSpinVec Deprecated in 95.0

 ( number projectileID ) -> nil | number x, number y, number z


Spring.GetProjectileDamages New in version 101.0

 ( number unitID, number weaponNum, string tag ) -> nil | number
 `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.