<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Masterbel</id>
	<title>Spring - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://springrts-wiki.p2004a.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Masterbel"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Masterbel"/>
	<updated>2026-11-08T16:48:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Tutorial_GettingStarted&amp;diff=10924</id>
		<title>Lua:Tutorial GettingStarted</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Tutorial_GettingStarted&amp;diff=10924"/>
		<updated>2023-06-21T03:30:45Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: &amp;lt;syntaxhighlight&amp;gt; doesn&amp;#039;t appear to be working, so for the time being I&amp;#039;ve subbed it out with &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
Here are some examples of small widgets, with useful code to get you started! &lt;br /&gt;
&lt;br /&gt;
To play with each example, place the code into a &amp;quot;my_new_widget_name.lua&amp;quot; file in your Spring/LuaUI/widgets dir (create it if not already present) and run Spring with any game. Your widget should then appear ingame!&lt;br /&gt;
&lt;br /&gt;
To see many more examples, check out the LuaUI/widgets directory of the games in [[Gamedev:PublicRepos|PublicRepos]]. &lt;br /&gt;
&lt;br /&gt;
Note that every widget (and gadget) must include a GetInfo() callin, but all other callins are optional.&lt;br /&gt;
&lt;br /&gt;
==Example 1==&lt;br /&gt;
The &amp;quot;hello world&amp;quot; example, with a ticking clock.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
function widget:GetInfo()&lt;br /&gt;
   return {&lt;br /&gt;
      name         = &amp;quot;Name as shown in widget list&amp;quot;,&lt;br /&gt;
      desc         = &amp;quot;Description as normally shown in tooltip&amp;quot;,&lt;br /&gt;
      author       = &amp;quot;It could be you!&amp;quot;,&lt;br /&gt;
      date         = &amp;quot;now&amp;quot;,&lt;br /&gt;
      license      = &amp;quot;PD&amp;quot;, -- should be compatible with Spring&lt;br /&gt;
      layer        = 0,&lt;br /&gt;
      enabled      = true&lt;br /&gt;
   }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local helloWorld = &amp;quot;I STARTED LOOK AT ME JIM!&amp;quot;&lt;br /&gt;
local toggle&lt;br /&gt;
&lt;br /&gt;
function widget:Initialize()&lt;br /&gt;
   Spring.Echo(helloWorld)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function widget:Update()&lt;br /&gt;
   if (toggle == true) then&lt;br /&gt;
      Spring.Echo(&amp;quot;TOCK&amp;quot;)&lt;br /&gt;
      toggle = false&lt;br /&gt;
   else&lt;br /&gt;
      Spring.Echo(&amp;quot;TICK&amp;quot;)&lt;br /&gt;
      toggle = true&lt;br /&gt;
   end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example 2==&lt;br /&gt;
How to make stuff happen when units do stuff.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
function widget:GetInfo()&lt;br /&gt;
   return {&lt;br /&gt;
      name         = &amp;quot;Unit Announcer&amp;quot;,&lt;br /&gt;
      desc         = &amp;quot;Units are proud to be alive&amp;quot;,&lt;br /&gt;
      author       = &amp;quot;Some guy&amp;quot;,&lt;br /&gt;
      date         = &amp;quot;I don&#039;t know why we include dates&amp;quot;,&lt;br /&gt;
      license      = &amp;quot;GPLv2 or later&amp;quot;,&lt;br /&gt;
      layer        = 0,&lt;br /&gt;
      enabled      = true&lt;br /&gt;
   }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local machoUnits = {}&lt;br /&gt;
&lt;br /&gt;
function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
  Spring.Echo(&amp;quot;HELLO&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  local humanName = UnitDefs[unitDefID].humanName&lt;br /&gt;
  local numWeapons = #UnitDefs[unitDefID].weapons&lt;br /&gt;
  local plural = numWeapons~=1 and &amp;quot;s&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  Spring.Echo(&amp;quot;I am unit &amp;quot; .. unitID .. &amp;quot;. I am a &amp;quot; .. humanName .. &amp;quot;.&amp;quot;)&lt;br /&gt;
  Spring.Echo(&amp;quot;I have &amp;quot; .. numWeapons .. &amp;quot; weapon&amp;quot; .. plural .. &amp;quot;.&amp;quot;)&lt;br /&gt;
  if numWeapons&amp;gt;0 then&lt;br /&gt;
    machoUnits[unitID] = true&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function widget:UnitDestroyed(unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam)&lt;br /&gt;
  machoUnits[unitID] = nil&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
function widget:UnitDamaged(unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam)&lt;br /&gt;
  if machoUnits[unitID] then return end&lt;br /&gt;
&lt;br /&gt;
  local n = math.random(3,10)&lt;br /&gt;
  local ow = &amp;quot;O&amp;quot;&lt;br /&gt;
  for i=1,n do&lt;br /&gt;
    ow = ow .. &amp;quot;W&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
  Spring.Echo(ow)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example 3==&lt;br /&gt;
Something actually useful.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
function widget:GetInfo()&lt;br /&gt;
  return {&lt;br /&gt;
    name      = &amp;quot;Stop means Stop&amp;quot;,&lt;br /&gt;
    desc      = &amp;quot;Cancels Self D orders when unit is given a stop command&amp;quot;,&lt;br /&gt;
    author    = &amp;quot;enotseulB&amp;quot;,&lt;br /&gt;
    date      = &amp;quot;GPL v2 or later&amp;quot;,&lt;br /&gt;
    license   = &amp;quot;Feb 2015&amp;quot;,&lt;br /&gt;
    layer     = 0,&lt;br /&gt;
    enabled   = true  &lt;br /&gt;
  }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local CMD_STOP = CMD.STOP&lt;br /&gt;
&lt;br /&gt;
function widget:UnitCommand(unitID, unitDefID, teamID, cmdID, cmdParams, cmdOptions)&lt;br /&gt;
    if cmdID ~= CMD_STOP then return end&lt;br /&gt;
    if not unitID then return end&lt;br /&gt;
    if teamID ~= Spring.GetMyTeamID() then return end&lt;br /&gt;
&lt;br /&gt;
    if (Spring.GetUnitSelfDTime(unitID) &amp;gt; 0) then&lt;br /&gt;
        Spring.GiveOrderToUnit(unitID, CMD.SELFD, {}, {})&lt;br /&gt;
    end &lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12074</id>
		<title>Lua SyncedRead</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12074"/>
		<updated>2022-06-23T00:03:24Z</updated>

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

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

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

		<summary type="html">&lt;p&gt;Masterbel: Add fix for repeating tile bug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ]]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Network==&lt;br /&gt;
&lt;br /&gt;
===My buddy can not connect to a game I&#039;ve opened. What can we do?===&lt;br /&gt;
The engine uses UDP port 8452 by default, which can be changed in the lobby. If you are behind a router, and are having problems hosting, try forwarding the correct port and also make sure the firewall is not blocking it. If you do not know what a port or a firewall is, use a relay host instead: when hosting a game, tick the check-box labeled &amp;quot;Use relayhost&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===I can not connect to the online lobby server?===&lt;br /&gt;
See in the [http://springrts.com/phpbb/index.php forum] if others have the same problem.&lt;br /&gt;
&lt;br /&gt;
The server might be temporary down for maintenance.&lt;br /&gt;
Most lobbies should allow you to connect to a &amp;quot;backup server&amp;quot; or just try again after some time.&lt;br /&gt;
&lt;br /&gt;
==Graphics==&lt;br /&gt;
&lt;br /&gt;
===Map texture repeating across the map in squares===&lt;br /&gt;
[[File:Screenshot Spring Squares of Doom.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Try adding &amp;lt;code&amp;gt;UsePBO = 0&amp;lt;/code&amp;gt; to your springsettings.cfg.&lt;br /&gt;
&lt;br /&gt;
===Low fps that get better in metalview (F4)===&lt;br /&gt;
Try typing into ingame chat:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/advmapshading 0&lt;br /&gt;
&lt;br /&gt;
/advmodelshading 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And/Or add to springsettings.cfg:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;AdvMapShading = 0&lt;br /&gt;
&lt;br /&gt;
AdvUnitShading = 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(usually the AdvMapShading part is enough)&lt;br /&gt;
&lt;br /&gt;
===I am having really bad framerates (fps) on my dual core! What am I doing wrong?===&lt;br /&gt;
Some of this helped other users:&lt;br /&gt;
&lt;br /&gt;
* This error is sometimes reported by people having multicore-CPUs. To solve this, you could try to restrict it to run on one core. Enable &amp;quot;SetCoreAffinity=1&amp;quot; in your [[springrc]].&lt;br /&gt;
* Installing the latest processor drivers and Windows hotfixes for your system may also help.&lt;br /&gt;
* Also try to disabling the &amp;quot;Exhaust&amp;quot; effect on planes could help: Press f11 while ingame, disable LUPS and Lups manager (by clicking on them to make them turn red)&lt;br /&gt;
&lt;br /&gt;
===How to Alt-Tab out of full-screen on Linux?===&lt;br /&gt;
Play windowed with &#039;&#039;/grabinput&#039;&#039;, or [http://springrts.com/phpbb/viewtopic.php?p=449972#p449972 use devilspie].&lt;br /&gt;
&lt;br /&gt;
===I use Linux with Open-Source Gfx drivers, and the map is all white!===&lt;br /&gt;
[[File:Whitemap.png|200px]] &lt;br /&gt;
&lt;br /&gt;
Due to patents S3TC texture support is disabled by default. To enable it you need the tool driconf (note, you no longer require libdxtn):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install libgl1-mesa-dev driconf&lt;br /&gt;
$ driconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the &amp;quot;Image Quality&amp;quot; tab activate &amp;quot;Enable S3TC texture compression even if software support is not available&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=20&amp;amp;t=20809 Spring on Intel or ATI &#039;open-source&#039; drivers]&lt;br /&gt;
&lt;br /&gt;
===It crashes, hangs, ...===&lt;br /&gt;
Possible fixes are: &lt;br /&gt;
* updating your graphics driver&lt;br /&gt;
* lowering the graphic-settings at SpringSettings&lt;br /&gt;
* disabling graphics effects at SpringSettings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Spring crashes on my notebook but it has a really nice graphic card! (or some effects are messed up) ===&lt;br /&gt;
for example air plane trails might look like:&lt;br /&gt;
&lt;br /&gt;
[[File: Bugged_plane_trails_graphics.jpg]]&lt;br /&gt;
&lt;br /&gt;
Some notebooks have two graphic cards: One for 3D and a small integrated one to save power while on facebook.&lt;br /&gt;
Setting it to use the correct 3D card has helped some players.&lt;br /&gt;
Use the internet to find out how to do that.&lt;br /&gt;
Screenhot of such controll panel, though it might look different on different computers:&lt;br /&gt;
&lt;br /&gt;
[[File: Graphic_cards_selection.png]]&lt;br /&gt;
&lt;br /&gt;
===Nvidia===&lt;br /&gt;
&lt;br /&gt;
====I am having really bad framerates (FPS)!====&lt;br /&gt;
Turn off &#039;threaded optimizations&#039; for Spring in the nVidia control panel, enable &amp;quot;Compress textures&amp;quot; in SpringSettings.&lt;br /&gt;
&lt;br /&gt;
[[File:MToptimizations.png|200px]]&lt;br /&gt;
&lt;br /&gt;
====After playing Spring, in background running firefox window is white or gray. ====&lt;br /&gt;
&lt;br /&gt;
Disable Anti-Aliasing / decrease graphic-quality (&amp;lt;=high) in SpringSettings.&lt;br /&gt;
&lt;br /&gt;
====Shadows on Units doesn&#039;t work====&lt;br /&gt;
[[File:Shadows_fail.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Check if Shadows and AdvUnitShading is enabled, update your graphics driver.&lt;br /&gt;
&lt;br /&gt;
====It crashes/hangs====&lt;br /&gt;
&lt;br /&gt;
* try disabling shadows (SpringSettings)&lt;br /&gt;
* try disabling advanced map shading (AdvMapShading=0)&lt;br /&gt;
&lt;br /&gt;
===Intel===&lt;br /&gt;
&lt;br /&gt;
====Why does spring hang for a few seconds?====&lt;br /&gt;
This bug occurs on maps like FolsomDamDeluxeV2, Tangerline. FPS suddenly drops to 1 and game runs very slowly. This seems to be an Intel driver bug. For Windows Vista/7 try updating driver up to 8.15.10.2246 or newer. For Windows XP there is no solution yet.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23541 Intel HD Graphics Driver issue?]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23081 Performance issues on Intel X4500]&lt;br /&gt;
&lt;br /&gt;
====Fonts are unreadable====&lt;br /&gt;
[[File:IntelBorkedFonts.png|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a driver bug, try to update/downgrade your driver.&lt;br /&gt;
&lt;br /&gt;
====It crashes, hangs etc...====&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* disabling texture-compression at SpringSettings&lt;br /&gt;
* disabling reflective units at SpringSettings&lt;br /&gt;
* disable ReflectiveWater&lt;br /&gt;
* [http://downloadcenter.intel.com/ updating your driver]&lt;br /&gt;
* use linux! (yes, this hint sucks, but the open-source-drivers seems to work better...)&lt;br /&gt;
&lt;br /&gt;
===ATI/AMD===&lt;br /&gt;
First of all, if you encourage a graphics related problem on ATI/AMD graphic device update your drivers to the latest version [http://support.amd.com/us/gpudownload/Pages/index.aspx ATI/AMD dowload].&lt;br /&gt;
&lt;br /&gt;
==== I&#039;ve got the most recent drivers and the game crashes in atioglxx.dll====&lt;br /&gt;
As of Spring 0.80.5, use only basic or dynamic water. Bump water with disabled shore waves should also work. Reflective or refractive water will make the game crash after 15-20 minutes due to a memory leak.&lt;br /&gt;
&lt;br /&gt;
Spring 0.81.2 and/or Catalyst 10.2 drivers or newer should fix this problem.&lt;br /&gt;
&lt;br /&gt;
if the game crashes immediatly after the loading screen is finished (&amp;quot;Finalizing&amp;quot;) in the Zero-K or Gundam mods and the video card is based on the RV670 GPU (some models of: 3690, 3850, 3870, 4570, 4730, 3730, 3610, 4580, 4750, 3750, 2600 XT/PRO, 3830) Catalyst 8.12 drivers may fix it (windows xp 32-bit, possibly other NT5-based 32-bit platforms), however even with that driver there may still be a crash (not immediatly after the loading screen, as soon as the simulations starts) in Annihilation-based mods that use RED UI, the same lua-based atioglxx.dll crash also happens with the 1944 mod.&lt;br /&gt;
&lt;br /&gt;
also note that later versions of Catalyst drivers for these cards reduce performance in OpenGL applications (windows xp 32-bit, possibly other NT5-based 32-bit platforms) (found at least in: spring, quake3 and Nexuiz), for spring the most significant drop (by ~15%) appears in 9.10 and higher Catalyst versions (more than 15%), if you have one of the lower-performing models of these and don&#039;t use shadows you may want to try the Catalyst 8.3 and 8.4 drivers (they do not support shadows but should work ~5% faster compared to 8.12) but those drivers may be less stable&lt;br /&gt;
&lt;br /&gt;
====I&#039;ve got a notebook and official ATI/AMD drivers refuse to install, what to do?====&lt;br /&gt;
First of all, make sure you&#039;re installing the &#039;AMD Mobility Radeon&#039; driver pack branch.&lt;br /&gt;
Use [http://www.driverheaven.net/modtool.php ATI Mobility Modder] or unofficial drivers - DNA or Omega. Use [http://google.com Google] or get them from [http://downloads.guru3d.com/Videocards----ATI-Catalyst-(Modified)_c24.html guru3d].&lt;br /&gt;
&lt;br /&gt;
====UI disapears after 5-10 mins of play on old ATI videocards====&lt;br /&gt;
In cmdcolors.txt, simply comment out or remove the following lines:&lt;br /&gt;
 stipplePattern 0xffcc&lt;br /&gt;
 stippleFactor 1&lt;br /&gt;
 stippleSpeed 1.0&lt;br /&gt;
The problem detected on:&lt;br /&gt;
* ATI Radeon X3200 with latest drivers ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=20817 ref])&lt;br /&gt;
* ATI Radeon 9500 with Omega drivers 3.8.442 ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23526 ref])&lt;br /&gt;
&lt;br /&gt;
====I see the complete screen full of red/green/yellow or giant dots on minimap====&lt;br /&gt;
&lt;br /&gt;
[[File:Redui-minimap-bug.pngâ€Ž|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a bug somewhere in LUA drawing with ATI/AMD. Disable widgets that draw via F11 menu to find the one. There is no real fix. A Widget causing this is &amp;quot;Red UI Minimap&amp;quot;, &amp;quot;Highlight Units&amp;quot; or &amp;quot;Chili Minimap&amp;quot;. Setting &amp;quot;Max nano simultaneous particles&amp;quot; (SpringSettings) seems to help, too.&lt;br /&gt;
&lt;br /&gt;
====I see big green rectagle on minimap====&lt;br /&gt;
[[File:AMD-Minimap-green_rectangle-bug.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Try to set [[Springsettings.cfg#MiniMapDrawProjectiles|MiniMapDrawProjectiles]] in Spring settings to 0. &lt;br /&gt;
&lt;br /&gt;
====The textures looks scary====&lt;br /&gt;
[[File:Ati-drawing-issues.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a known ATI/AMD-bug. Try using different driver, preferably other than 10.5, 10.6, 10.7 -&amp;gt; newer driver pack with fixed OpenGL driver should be fine.&lt;br /&gt;
&lt;br /&gt;
====Units are almost invisible, except for same black pieces====&lt;br /&gt;
For example on Radeon X1300/X1550 Series.&lt;br /&gt;
&lt;br /&gt;
[[File:InvisibleUnitBug_Radeon_X1300X1550AdvUnitShading.jpg]]&lt;br /&gt;
&lt;br /&gt;
Set [[Springsettings.cfg#AdvUnitShading]] = 0&lt;br /&gt;
&lt;br /&gt;
====It crashes always at start, hangs etc...====&lt;br /&gt;
Check [[infolog.txt]], as it mostly contains hints whats the cause for the crash.&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* try the [[springsettings.cfg#Safemode|safemode]] / set [[springsettings.cfg]] safemode values.&lt;br /&gt;
* updating or even downgrading [http://support.amd.com/ ATI driver]&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
&lt;br /&gt;
===The Sound is crackling/pausing in Windows, what can i do?===&lt;br /&gt;
Try:&lt;br /&gt;
* Update the sounds driver&lt;br /&gt;
* Enable SystemSoundsService in Vista/Seven&lt;br /&gt;
&lt;br /&gt;
===I am having sound problems under Linux! What can i do?===&lt;br /&gt;
In more then 90% of the cases, this is caused by PulseAudio. If this is the problem, there are three known solutions to solve it. Use one of them.&lt;br /&gt;
&lt;br /&gt;
====disable sound effects====&lt;br /&gt;
Make sure you have the OpenAL-Soft configuration utility. You might want to run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# install&lt;br /&gt;
sudo apt-get install alsoft-conf&lt;br /&gt;
# run&lt;br /&gt;
alsoft-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not on a debian-based distribution, you can download the source from the project&#039;s homepage: http://www.anduin.net/~angasule/?x=entry:entry091211-133213. You can also check if there&#039;s a newer version.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#download&lt;br /&gt;
wget http://www.anduin.net/~angasule/fp-content/attachs/alsoft-conf_1.4.3.tar.gz&lt;br /&gt;
#extract&lt;br /&gt;
tar xvf alsoft-conf_1.4.3.tar.gz&lt;br /&gt;
cd alsoft-conf-1.4.3&lt;br /&gt;
#compile&lt;br /&gt;
cmake .&lt;br /&gt;
make&lt;br /&gt;
#run&lt;br /&gt;
./alsoft-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Effects&amp;quot; tab remove everything from &amp;quot;Allowed effects&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====disable non-ALSA (preferred)====&lt;br /&gt;
run alsoft-conf (for installation see above)&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;backend&amp;quot; tab, keep only &amp;quot;ALSA&amp;quot; on the left column, then save. Done!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Side Note:&#039;&#039; ALSA is redirected to the PulseAudio layer when installed.&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
===Middle mouse button does not work ingame===&lt;br /&gt;
&lt;br /&gt;
If you use Logitech Setpoint be aware that it sets your middle mouse button by default to &#039;Autoscroll&#039;. It should be set to &#039;Middle button&#039; instead. Change the setting in Setpoint.&lt;br /&gt;
&lt;br /&gt;
===Spring crashes after Error opening cache\ ... in infolog.txt===&lt;br /&gt;
&lt;br /&gt;
   [f=0000000] Reading Estimate PathCosts [8]&lt;br /&gt;
   [f=0000000] Error opening cache\paths\...&lt;br /&gt;
&lt;br /&gt;
this is a known bug in 0.82.7.1. Your cpu also has many cores?&lt;br /&gt;
Then try to set HardwareThreadCount=2&amp;quot; in [[springrc]]. Spring tries to create the PathCache with to many threads in parallel and crashes because out of memory.&lt;br /&gt;
&lt;br /&gt;
===I have a problem that is not described here! What can i do?===&lt;br /&gt;
There is a number of things you can do, among these are:&lt;br /&gt;
* Search in the [http://springrts.com/phpbb/viewforum.php?f=11 Help &amp;amp; Bugs Forum], and ask if you can not find a suiting topic.&lt;br /&gt;
* Check the games forum or homepage.&lt;br /&gt;
* Look at the [[Gentoo_install#Linux_specific_Troubleshooting|Linux only FAQ]].&lt;br /&gt;
* Ask for help in the lobby in a suiting channel, eg: #springlobby, #de, #fr, #ai, #main&lt;br /&gt;
* Ask the FAQ-Bot in the lobby in channel #springlobby. To get a list of topics, write &#039;&#039;!faqlist&#039;&#039; and then use &#039;&#039;!faq &amp;lt;topic-name&amp;gt;&#039;&#039; to get the help text. For example, try &#039;&#039;!faq rename&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===The ingame chat spams a lot of cryptic error messages===&lt;br /&gt;
This is most likely a problem with the game&#039;s Lua scripting.&lt;br /&gt;
Report it in the games forum or its bug tracker.&lt;br /&gt;
[[Bugs|Here]] are some hints how to so.&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=File:Screenshot_Spring_Squares_of_Doom.jpg&amp;diff=22058</id>
		<title>File:Screenshot Spring Squares of Doom.jpg</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=File:Screenshot_Spring_Squares_of_Doom.jpg&amp;diff=22058"/>
		<updated>2021-02-07T20:54:47Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:trouble&amp;diff=7380</id>
		<title>FAQ:trouble</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:trouble&amp;diff=7380"/>
		<updated>2021-02-07T20:52:44Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: Undo revision 31458 by Masterbel (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ]]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Network==&lt;br /&gt;
&lt;br /&gt;
===My buddy can not connect to a game I&#039;ve opened. What can we do?===&lt;br /&gt;
The engine uses UDP port 8452 by default, which can be changed in the lobby. If you are behind a router, and are having problems hosting, try forwarding the correct port and also make sure the firewall is not blocking it. If you do not know what a port or a firewall is, use a relay host instead: when hosting a game, tick the check-box labeled &amp;quot;Use relayhost&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===I can not connect to the online lobby server?===&lt;br /&gt;
See in the [http://springrts.com/phpbb/index.php forum] if others have the same problem.&lt;br /&gt;
&lt;br /&gt;
The server might be temporary down for maintenance.&lt;br /&gt;
Most lobbies should allow you to connect to a &amp;quot;backup server&amp;quot; or just try again after some time.&lt;br /&gt;
&lt;br /&gt;
==Graphics==&lt;br /&gt;
===Low fps that get better in metalview (F4)===&lt;br /&gt;
Try typing into ingame chat:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/advmapshading 0&lt;br /&gt;
&lt;br /&gt;
/advmodelshading 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And/Or add to springsettings.cfg:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;AdvMapShading = 0&lt;br /&gt;
&lt;br /&gt;
AdvUnitShading = 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(usually the AdvMapShading part is enough)&lt;br /&gt;
&lt;br /&gt;
===I am having really bad framerates (fps) on my dual core! What am I doing wrong?===&lt;br /&gt;
Some of this helped other users:&lt;br /&gt;
&lt;br /&gt;
* This error is sometimes reported by people having multicore-CPUs. To solve this, you could try to restrict it to run on one core. Enable &amp;quot;SetCoreAffinity=1&amp;quot; in your [[springrc]].&lt;br /&gt;
* Installing the latest processor drivers and Windows hotfixes for your system may also help.&lt;br /&gt;
* Also try to disabling the &amp;quot;Exhaust&amp;quot; effect on planes could help: Press f11 while ingame, disable LUPS and Lups manager (by clicking on them to make them turn red)&lt;br /&gt;
&lt;br /&gt;
===How to Alt-Tab out of full-screen on Linux?===&lt;br /&gt;
Play windowed with &#039;&#039;/grabinput&#039;&#039;, or [http://springrts.com/phpbb/viewtopic.php?p=449972#p449972 use devilspie].&lt;br /&gt;
&lt;br /&gt;
===I use Linux with Open-Source Gfx drivers, and the map is all white!===&lt;br /&gt;
[[File:Whitemap.png|200px]] &lt;br /&gt;
&lt;br /&gt;
Due to patents S3TC texture support is disabled by default. To enable it you need the tool driconf (note, you no longer require libdxtn):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install libgl1-mesa-dev driconf&lt;br /&gt;
$ driconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the &amp;quot;Image Quality&amp;quot; tab activate &amp;quot;Enable S3TC texture compression even if software support is not available&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=20&amp;amp;t=20809 Spring on Intel or ATI &#039;open-source&#039; drivers]&lt;br /&gt;
&lt;br /&gt;
===It crashes, hangs, ...===&lt;br /&gt;
Possible fixes are: &lt;br /&gt;
* updating your graphics driver&lt;br /&gt;
* lowering the graphic-settings at SpringSettings&lt;br /&gt;
* disabling graphics effects at SpringSettings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Spring crashes on my notebook but it has a really nice graphic card! (or some effects are messed up) ===&lt;br /&gt;
for example air plane trails might look like:&lt;br /&gt;
&lt;br /&gt;
[[File: Bugged_plane_trails_graphics.jpg]]&lt;br /&gt;
&lt;br /&gt;
Some notebooks have two graphic cards: One for 3D and a small integrated one to save power while on facebook.&lt;br /&gt;
Setting it to use the correct 3D card has helped some players.&lt;br /&gt;
Use the internet to find out how to do that.&lt;br /&gt;
Screenhot of such controll panel, though it might look different on different computers:&lt;br /&gt;
&lt;br /&gt;
[[File: Graphic_cards_selection.png]]&lt;br /&gt;
&lt;br /&gt;
===Nvidia===&lt;br /&gt;
&lt;br /&gt;
====I am having really bad framerates (FPS)!====&lt;br /&gt;
Turn off &#039;threaded optimizations&#039; for Spring in the nVidia control panel, enable &amp;quot;Compress textures&amp;quot; in SpringSettings.&lt;br /&gt;
&lt;br /&gt;
[[File:MToptimizations.png|200px]]&lt;br /&gt;
&lt;br /&gt;
====After playing Spring, in background running firefox window is white or gray. ====&lt;br /&gt;
&lt;br /&gt;
Disable Anti-Aliasing / decrease graphic-quality (&amp;lt;=high) in SpringSettings.&lt;br /&gt;
&lt;br /&gt;
====Shadows on Units doesn&#039;t work====&lt;br /&gt;
[[File:Shadows_fail.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Check if Shadows and AdvUnitShading is enabled, update your graphics driver.&lt;br /&gt;
&lt;br /&gt;
====It crashes/hangs====&lt;br /&gt;
&lt;br /&gt;
* try disabling shadows (SpringSettings)&lt;br /&gt;
* try disabling advanced map shading (AdvMapShading=0)&lt;br /&gt;
&lt;br /&gt;
===Intel===&lt;br /&gt;
&lt;br /&gt;
====Why does spring hang for a few seconds?====&lt;br /&gt;
This bug occurs on maps like FolsomDamDeluxeV2, Tangerline. FPS suddenly drops to 1 and game runs very slowly. This seems to be an Intel driver bug. For Windows Vista/7 try updating driver up to 8.15.10.2246 or newer. For Windows XP there is no solution yet.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23541 Intel HD Graphics Driver issue?]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23081 Performance issues on Intel X4500]&lt;br /&gt;
&lt;br /&gt;
====Fonts are unreadable====&lt;br /&gt;
[[File:IntelBorkedFonts.png|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a driver bug, try to update/downgrade your driver.&lt;br /&gt;
&lt;br /&gt;
====It crashes, hangs etc...====&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* disabling texture-compression at SpringSettings&lt;br /&gt;
* disabling reflective units at SpringSettings&lt;br /&gt;
* disable ReflectiveWater&lt;br /&gt;
* [http://downloadcenter.intel.com/ updating your driver]&lt;br /&gt;
* use linux! (yes, this hint sucks, but the open-source-drivers seems to work better...)&lt;br /&gt;
&lt;br /&gt;
===ATI/AMD===&lt;br /&gt;
First of all, if you encourage a graphics related problem on ATI/AMD graphic device update your drivers to the latest version [http://support.amd.com/us/gpudownload/Pages/index.aspx ATI/AMD dowload].&lt;br /&gt;
&lt;br /&gt;
==== I&#039;ve got the most recent drivers and the game crashes in atioglxx.dll====&lt;br /&gt;
As of Spring 0.80.5, use only basic or dynamic water. Bump water with disabled shore waves should also work. Reflective or refractive water will make the game crash after 15-20 minutes due to a memory leak.&lt;br /&gt;
&lt;br /&gt;
Spring 0.81.2 and/or Catalyst 10.2 drivers or newer should fix this problem.&lt;br /&gt;
&lt;br /&gt;
if the game crashes immediatly after the loading screen is finished (&amp;quot;Finalizing&amp;quot;) in the Zero-K or Gundam mods and the video card is based on the RV670 GPU (some models of: 3690, 3850, 3870, 4570, 4730, 3730, 3610, 4580, 4750, 3750, 2600 XT/PRO, 3830) Catalyst 8.12 drivers may fix it (windows xp 32-bit, possibly other NT5-based 32-bit platforms), however even with that driver there may still be a crash (not immediatly after the loading screen, as soon as the simulations starts) in Annihilation-based mods that use RED UI, the same lua-based atioglxx.dll crash also happens with the 1944 mod.&lt;br /&gt;
&lt;br /&gt;
also note that later versions of Catalyst drivers for these cards reduce performance in OpenGL applications (windows xp 32-bit, possibly other NT5-based 32-bit platforms) (found at least in: spring, quake3 and Nexuiz), for spring the most significant drop (by ~15%) appears in 9.10 and higher Catalyst versions (more than 15%), if you have one of the lower-performing models of these and don&#039;t use shadows you may want to try the Catalyst 8.3 and 8.4 drivers (they do not support shadows but should work ~5% faster compared to 8.12) but those drivers may be less stable&lt;br /&gt;
&lt;br /&gt;
====I&#039;ve got a notebook and official ATI/AMD drivers refuse to install, what to do?====&lt;br /&gt;
First of all, make sure you&#039;re installing the &#039;AMD Mobility Radeon&#039; driver pack branch.&lt;br /&gt;
Use [http://www.driverheaven.net/modtool.php ATI Mobility Modder] or unofficial drivers - DNA or Omega. Use [http://google.com Google] or get them from [http://downloads.guru3d.com/Videocards----ATI-Catalyst-(Modified)_c24.html guru3d].&lt;br /&gt;
&lt;br /&gt;
====UI disapears after 5-10 mins of play on old ATI videocards====&lt;br /&gt;
In cmdcolors.txt, simply comment out or remove the following lines:&lt;br /&gt;
 stipplePattern 0xffcc&lt;br /&gt;
 stippleFactor 1&lt;br /&gt;
 stippleSpeed 1.0&lt;br /&gt;
The problem detected on:&lt;br /&gt;
* ATI Radeon X3200 with latest drivers ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=20817 ref])&lt;br /&gt;
* ATI Radeon 9500 with Omega drivers 3.8.442 ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23526 ref])&lt;br /&gt;
&lt;br /&gt;
====I see the complete screen full of red/green/yellow or giant dots on minimap====&lt;br /&gt;
&lt;br /&gt;
[[File:Redui-minimap-bug.pngâ€Ž|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a bug somewhere in LUA drawing with ATI/AMD. Disable widgets that draw via F11 menu to find the one. There is no real fix. A Widget causing this is &amp;quot;Red UI Minimap&amp;quot;, &amp;quot;Highlight Units&amp;quot; or &amp;quot;Chili Minimap&amp;quot;. Setting &amp;quot;Max nano simultaneous particles&amp;quot; (SpringSettings) seems to help, too.&lt;br /&gt;
&lt;br /&gt;
====I see big green rectagle on minimap====&lt;br /&gt;
[[File:AMD-Minimap-green_rectangle-bug.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Try to set [[Springsettings.cfg#MiniMapDrawProjectiles|MiniMapDrawProjectiles]] in Spring settings to 0. &lt;br /&gt;
&lt;br /&gt;
====The textures looks scary====&lt;br /&gt;
[[File:Ati-drawing-issues.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a known ATI/AMD-bug. Try using different driver, preferably other than 10.5, 10.6, 10.7 -&amp;gt; newer driver pack with fixed OpenGL driver should be fine.&lt;br /&gt;
&lt;br /&gt;
====Units are almost invisible, except for same black pieces====&lt;br /&gt;
For example on Radeon X1300/X1550 Series.&lt;br /&gt;
&lt;br /&gt;
[[File:InvisibleUnitBug_Radeon_X1300X1550AdvUnitShading.jpg]]&lt;br /&gt;
&lt;br /&gt;
Set [[Springsettings.cfg#AdvUnitShading]] = 0&lt;br /&gt;
&lt;br /&gt;
====It crashes always at start, hangs etc...====&lt;br /&gt;
Check [[infolog.txt]], as it mostly contains hints whats the cause for the crash.&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* try the [[springsettings.cfg#Safemode|safemode]] / set [[springsettings.cfg]] safemode values.&lt;br /&gt;
* updating or even downgrading [http://support.amd.com/ ATI driver]&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
&lt;br /&gt;
===The Sound is crackling/pausing in Windows, what can i do?===&lt;br /&gt;
Try:&lt;br /&gt;
* Update the sounds driver&lt;br /&gt;
* Enable SystemSoundsService in Vista/Seven&lt;br /&gt;
&lt;br /&gt;
===I am having sound problems under Linux! What can i do?===&lt;br /&gt;
In more then 90% of the cases, this is caused by PulseAudio. If this is the problem, there are three known solutions to solve it. Use one of them.&lt;br /&gt;
&lt;br /&gt;
====disable sound effects====&lt;br /&gt;
Make sure you have the OpenAL-Soft configuration utility. You might want to run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# install&lt;br /&gt;
sudo apt-get install alsoft-conf&lt;br /&gt;
# run&lt;br /&gt;
alsoft-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not on a debian-based distribution, you can download the source from the project&#039;s homepage: http://www.anduin.net/~angasule/?x=entry:entry091211-133213. You can also check if there&#039;s a newer version.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#download&lt;br /&gt;
wget http://www.anduin.net/~angasule/fp-content/attachs/alsoft-conf_1.4.3.tar.gz&lt;br /&gt;
#extract&lt;br /&gt;
tar xvf alsoft-conf_1.4.3.tar.gz&lt;br /&gt;
cd alsoft-conf-1.4.3&lt;br /&gt;
#compile&lt;br /&gt;
cmake .&lt;br /&gt;
make&lt;br /&gt;
#run&lt;br /&gt;
./alsoft-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Effects&amp;quot; tab remove everything from &amp;quot;Allowed effects&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====disable non-ALSA (preferred)====&lt;br /&gt;
run alsoft-conf (for installation see above)&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;backend&amp;quot; tab, keep only &amp;quot;ALSA&amp;quot; on the left column, then save. Done!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Side Note:&#039;&#039; ALSA is redirected to the PulseAudio layer when installed.&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
===Middle mouse button does not work ingame===&lt;br /&gt;
&lt;br /&gt;
If you use Logitech Setpoint be aware that it sets your middle mouse button by default to &#039;Autoscroll&#039;. It should be set to &#039;Middle button&#039; instead. Change the setting in Setpoint.&lt;br /&gt;
&lt;br /&gt;
===Spring crashes after Error opening cache\ ... in infolog.txt===&lt;br /&gt;
&lt;br /&gt;
   [f=0000000] Reading Estimate PathCosts [8]&lt;br /&gt;
   [f=0000000] Error opening cache\paths\...&lt;br /&gt;
&lt;br /&gt;
this is a known bug in 0.82.7.1. Your cpu also has many cores?&lt;br /&gt;
Then try to set HardwareThreadCount=2&amp;quot; in [[springrc]]. Spring tries to create the PathCache with to many threads in parallel and crashes because out of memory.&lt;br /&gt;
&lt;br /&gt;
===I have a problem that is not described here! What can i do?===&lt;br /&gt;
There is a number of things you can do, among these are:&lt;br /&gt;
* Search in the [http://springrts.com/phpbb/viewforum.php?f=11 Help &amp;amp; Bugs Forum], and ask if you can not find a suiting topic.&lt;br /&gt;
* Check the games forum or homepage.&lt;br /&gt;
* Look at the [[Gentoo_install#Linux_specific_Troubleshooting|Linux only FAQ]].&lt;br /&gt;
* Ask for help in the lobby in a suiting channel, eg: #springlobby, #de, #fr, #ai, #main&lt;br /&gt;
* Ask the FAQ-Bot in the lobby in channel #springlobby. To get a list of topics, write &#039;&#039;!faqlist&#039;&#039; and then use &#039;&#039;!faq &amp;lt;topic-name&amp;gt;&#039;&#039; to get the help text. For example, try &#039;&#039;!faq rename&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===The ingame chat spams a lot of cryptic error messages===&lt;br /&gt;
This is most likely a problem with the game&#039;s Lua scripting.&lt;br /&gt;
Report it in the games forum or its bug tracker.&lt;br /&gt;
[[Bugs|Here]] are some hints how to so.&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:trouble&amp;diff=7379</id>
		<title>FAQ:trouble</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=FAQ:trouble&amp;diff=7379"/>
		<updated>2021-02-07T20:51:13Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: /* Graphics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ]]&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Network==&lt;br /&gt;
&lt;br /&gt;
===My buddy can not connect to a game I&#039;ve opened. What can we do?===&lt;br /&gt;
The engine uses UDP port 8452 by default, which can be changed in the lobby. If you are behind a router, and are having problems hosting, try forwarding the correct port and also make sure the firewall is not blocking it. If you do not know what a port or a firewall is, use a relay host instead: when hosting a game, tick the check-box labeled &amp;quot;Use relayhost&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===I can not connect to the online lobby server?===&lt;br /&gt;
See in the [http://springrts.com/phpbb/index.php forum] if others have the same problem.&lt;br /&gt;
&lt;br /&gt;
The server might be temporary down for maintenance.&lt;br /&gt;
Most lobbies should allow you to connect to a &amp;quot;backup server&amp;quot; or just try again after some time.&lt;br /&gt;
&lt;br /&gt;
==Graphics==&lt;br /&gt;
===Low fps that get better in metalview (F4)===&lt;br /&gt;
Try typing into ingame chat:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;/advmapshading 0&lt;br /&gt;
&lt;br /&gt;
/advmodelshading 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
And/Or add to springsettings.cfg:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;AdvMapShading = 0&lt;br /&gt;
&lt;br /&gt;
AdvUnitShading = 0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
(usually the AdvMapShading part is enough)&lt;br /&gt;
&lt;br /&gt;
===The map is broken into weird squares!===&lt;br /&gt;
[[File:Https://springrts.com/phpbb/download/file.php?mode=view&amp;amp;id=11229|200px|thumb]]&lt;br /&gt;
&lt;br /&gt;
Try adding `UsePBO = 0` to springsettings.cfg.&lt;br /&gt;
&lt;br /&gt;
===I am having really bad framerates (fps) on my dual core! What am I doing wrong?===&lt;br /&gt;
Some of this helped other users:&lt;br /&gt;
&lt;br /&gt;
* This error is sometimes reported by people having multicore-CPUs. To solve this, you could try to restrict it to run on one core. Enable &amp;quot;SetCoreAffinity=1&amp;quot; in your [[springrc]].&lt;br /&gt;
* Installing the latest processor drivers and Windows hotfixes for your system may also help.&lt;br /&gt;
* Also try to disabling the &amp;quot;Exhaust&amp;quot; effect on planes could help: Press f11 while ingame, disable LUPS and Lups manager (by clicking on them to make them turn red)&lt;br /&gt;
&lt;br /&gt;
===How to Alt-Tab out of full-screen on Linux?===&lt;br /&gt;
Play windowed with &#039;&#039;/grabinput&#039;&#039;, or [http://springrts.com/phpbb/viewtopic.php?p=449972#p449972 use devilspie].&lt;br /&gt;
&lt;br /&gt;
===I use Linux with Open-Source Gfx drivers, and the map is all white!===&lt;br /&gt;
[[File:Whitemap.png|200px]] &lt;br /&gt;
&lt;br /&gt;
Due to patents S3TC texture support is disabled by default. To enable it you need the tool driconf (note, you no longer require libdxtn):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install libgl1-mesa-dev driconf&lt;br /&gt;
$ driconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the &amp;quot;Image Quality&amp;quot; tab activate &amp;quot;Enable S3TC texture compression even if software support is not available&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=20&amp;amp;t=20809 Spring on Intel or ATI &#039;open-source&#039; drivers]&lt;br /&gt;
&lt;br /&gt;
===It crashes, hangs, ...===&lt;br /&gt;
Possible fixes are: &lt;br /&gt;
* updating your graphics driver&lt;br /&gt;
* lowering the graphic-settings at SpringSettings&lt;br /&gt;
* disabling graphics effects at SpringSettings&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Spring crashes on my notebook but it has a really nice graphic card! (or some effects are messed up) ===&lt;br /&gt;
for example air plane trails might look like:&lt;br /&gt;
&lt;br /&gt;
[[File: Bugged_plane_trails_graphics.jpg]]&lt;br /&gt;
&lt;br /&gt;
Some notebooks have two graphic cards: One for 3D and a small integrated one to save power while on facebook.&lt;br /&gt;
Setting it to use the correct 3D card has helped some players.&lt;br /&gt;
Use the internet to find out how to do that.&lt;br /&gt;
Screenhot of such controll panel, though it might look different on different computers:&lt;br /&gt;
&lt;br /&gt;
[[File: Graphic_cards_selection.png]]&lt;br /&gt;
&lt;br /&gt;
===Nvidia===&lt;br /&gt;
&lt;br /&gt;
====I am having really bad framerates (FPS)!====&lt;br /&gt;
Turn off &#039;threaded optimizations&#039; for Spring in the nVidia control panel, enable &amp;quot;Compress textures&amp;quot; in SpringSettings.&lt;br /&gt;
&lt;br /&gt;
[[File:MToptimizations.png|200px]]&lt;br /&gt;
&lt;br /&gt;
====After playing Spring, in background running firefox window is white or gray. ====&lt;br /&gt;
&lt;br /&gt;
Disable Anti-Aliasing / decrease graphic-quality (&amp;lt;=high) in SpringSettings.&lt;br /&gt;
&lt;br /&gt;
====Shadows on Units doesn&#039;t work====&lt;br /&gt;
[[File:Shadows_fail.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
Check if Shadows and AdvUnitShading is enabled, update your graphics driver.&lt;br /&gt;
&lt;br /&gt;
====It crashes/hangs====&lt;br /&gt;
&lt;br /&gt;
* try disabling shadows (SpringSettings)&lt;br /&gt;
* try disabling advanced map shading (AdvMapShading=0)&lt;br /&gt;
&lt;br /&gt;
===Intel===&lt;br /&gt;
&lt;br /&gt;
====Why does spring hang for a few seconds?====&lt;br /&gt;
This bug occurs on maps like FolsomDamDeluxeV2, Tangerline. FPS suddenly drops to 1 and game runs very slowly. This seems to be an Intel driver bug. For Windows Vista/7 try updating driver up to 8.15.10.2246 or newer. For Windows XP there is no solution yet.&lt;br /&gt;
&lt;br /&gt;
Related forum threads:&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23541 Intel HD Graphics Driver issue?]&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23081 Performance issues on Intel X4500]&lt;br /&gt;
&lt;br /&gt;
====Fonts are unreadable====&lt;br /&gt;
[[File:IntelBorkedFonts.png|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a driver bug, try to update/downgrade your driver.&lt;br /&gt;
&lt;br /&gt;
====It crashes, hangs etc...====&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* disabling texture-compression at SpringSettings&lt;br /&gt;
* disabling reflective units at SpringSettings&lt;br /&gt;
* disable ReflectiveWater&lt;br /&gt;
* [http://downloadcenter.intel.com/ updating your driver]&lt;br /&gt;
* use linux! (yes, this hint sucks, but the open-source-drivers seems to work better...)&lt;br /&gt;
&lt;br /&gt;
===ATI/AMD===&lt;br /&gt;
First of all, if you encourage a graphics related problem on ATI/AMD graphic device update your drivers to the latest version [http://support.amd.com/us/gpudownload/Pages/index.aspx ATI/AMD dowload].&lt;br /&gt;
&lt;br /&gt;
==== I&#039;ve got the most recent drivers and the game crashes in atioglxx.dll====&lt;br /&gt;
As of Spring 0.80.5, use only basic or dynamic water. Bump water with disabled shore waves should also work. Reflective or refractive water will make the game crash after 15-20 minutes due to a memory leak.&lt;br /&gt;
&lt;br /&gt;
Spring 0.81.2 and/or Catalyst 10.2 drivers or newer should fix this problem.&lt;br /&gt;
&lt;br /&gt;
if the game crashes immediatly after the loading screen is finished (&amp;quot;Finalizing&amp;quot;) in the Zero-K or Gundam mods and the video card is based on the RV670 GPU (some models of: 3690, 3850, 3870, 4570, 4730, 3730, 3610, 4580, 4750, 3750, 2600 XT/PRO, 3830) Catalyst 8.12 drivers may fix it (windows xp 32-bit, possibly other NT5-based 32-bit platforms), however even with that driver there may still be a crash (not immediatly after the loading screen, as soon as the simulations starts) in Annihilation-based mods that use RED UI, the same lua-based atioglxx.dll crash also happens with the 1944 mod.&lt;br /&gt;
&lt;br /&gt;
also note that later versions of Catalyst drivers for these cards reduce performance in OpenGL applications (windows xp 32-bit, possibly other NT5-based 32-bit platforms) (found at least in: spring, quake3 and Nexuiz), for spring the most significant drop (by ~15%) appears in 9.10 and higher Catalyst versions (more than 15%), if you have one of the lower-performing models of these and don&#039;t use shadows you may want to try the Catalyst 8.3 and 8.4 drivers (they do not support shadows but should work ~5% faster compared to 8.12) but those drivers may be less stable&lt;br /&gt;
&lt;br /&gt;
====I&#039;ve got a notebook and official ATI/AMD drivers refuse to install, what to do?====&lt;br /&gt;
First of all, make sure you&#039;re installing the &#039;AMD Mobility Radeon&#039; driver pack branch.&lt;br /&gt;
Use [http://www.driverheaven.net/modtool.php ATI Mobility Modder] or unofficial drivers - DNA or Omega. Use [http://google.com Google] or get them from [http://downloads.guru3d.com/Videocards----ATI-Catalyst-(Modified)_c24.html guru3d].&lt;br /&gt;
&lt;br /&gt;
====UI disapears after 5-10 mins of play on old ATI videocards====&lt;br /&gt;
In cmdcolors.txt, simply comment out or remove the following lines:&lt;br /&gt;
 stipplePattern 0xffcc&lt;br /&gt;
 stippleFactor 1&lt;br /&gt;
 stippleSpeed 1.0&lt;br /&gt;
The problem detected on:&lt;br /&gt;
* ATI Radeon X3200 with latest drivers ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=20817 ref])&lt;br /&gt;
* ATI Radeon 9500 with Omega drivers 3.8.442 ([http://springrts.com/phpbb/viewtopic.php?f=11&amp;amp;t=23526 ref])&lt;br /&gt;
&lt;br /&gt;
====I see the complete screen full of red/green/yellow or giant dots on minimap====&lt;br /&gt;
&lt;br /&gt;
[[File:Redui-minimap-bug.pngâ€Ž|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a bug somewhere in LUA drawing with ATI/AMD. Disable widgets that draw via F11 menu to find the one. There is no real fix. A Widget causing this is &amp;quot;Red UI Minimap&amp;quot;, &amp;quot;Highlight Units&amp;quot; or &amp;quot;Chili Minimap&amp;quot;. Setting &amp;quot;Max nano simultaneous particles&amp;quot; (SpringSettings) seems to help, too.&lt;br /&gt;
&lt;br /&gt;
====I see big green rectagle on minimap====&lt;br /&gt;
[[File:AMD-Minimap-green_rectangle-bug.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Try to set [[Springsettings.cfg#MiniMapDrawProjectiles|MiniMapDrawProjectiles]] in Spring settings to 0. &lt;br /&gt;
&lt;br /&gt;
====The textures looks scary====&lt;br /&gt;
[[File:Ati-drawing-issues.jpg|200px]]&lt;br /&gt;
&lt;br /&gt;
This is a known ATI/AMD-bug. Try using different driver, preferably other than 10.5, 10.6, 10.7 -&amp;gt; newer driver pack with fixed OpenGL driver should be fine.&lt;br /&gt;
&lt;br /&gt;
====Units are almost invisible, except for same black pieces====&lt;br /&gt;
For example on Radeon X1300/X1550 Series.&lt;br /&gt;
&lt;br /&gt;
[[File:InvisibleUnitBug_Radeon_X1300X1550AdvUnitShading.jpg]]&lt;br /&gt;
&lt;br /&gt;
Set [[Springsettings.cfg#AdvUnitShading]] = 0&lt;br /&gt;
&lt;br /&gt;
====It crashes always at start, hangs etc...====&lt;br /&gt;
Check [[infolog.txt]], as it mostly contains hints whats the cause for the crash.&lt;br /&gt;
Possible fixes are:&lt;br /&gt;
* try the [[springsettings.cfg#Safemode|safemode]] / set [[springsettings.cfg]] safemode values.&lt;br /&gt;
* updating or even downgrading [http://support.amd.com/ ATI driver]&lt;br /&gt;
&lt;br /&gt;
==Sound==&lt;br /&gt;
&lt;br /&gt;
===The Sound is crackling/pausing in Windows, what can i do?===&lt;br /&gt;
Try:&lt;br /&gt;
* Update the sounds driver&lt;br /&gt;
* Enable SystemSoundsService in Vista/Seven&lt;br /&gt;
&lt;br /&gt;
===I am having sound problems under Linux! What can i do?===&lt;br /&gt;
In more then 90% of the cases, this is caused by PulseAudio. If this is the problem, there are three known solutions to solve it. Use one of them.&lt;br /&gt;
&lt;br /&gt;
====disable sound effects====&lt;br /&gt;
Make sure you have the OpenAL-Soft configuration utility. You might want to run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# install&lt;br /&gt;
sudo apt-get install alsoft-conf&lt;br /&gt;
# run&lt;br /&gt;
alsoft-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not on a debian-based distribution, you can download the source from the project&#039;s homepage: http://www.anduin.net/~angasule/?x=entry:entry091211-133213. You can also check if there&#039;s a newer version.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#download&lt;br /&gt;
wget http://www.anduin.net/~angasule/fp-content/attachs/alsoft-conf_1.4.3.tar.gz&lt;br /&gt;
#extract&lt;br /&gt;
tar xvf alsoft-conf_1.4.3.tar.gz&lt;br /&gt;
cd alsoft-conf-1.4.3&lt;br /&gt;
#compile&lt;br /&gt;
cmake .&lt;br /&gt;
make&lt;br /&gt;
#run&lt;br /&gt;
./alsoft-conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;Effects&amp;quot; tab remove everything from &amp;quot;Allowed effects&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
====disable non-ALSA (preferred)====&lt;br /&gt;
run alsoft-conf (for installation see above)&lt;br /&gt;
&lt;br /&gt;
In the &amp;quot;backend&amp;quot; tab, keep only &amp;quot;ALSA&amp;quot; on the left column, then save. Done!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Side Note:&#039;&#039; ALSA is redirected to the PulseAudio layer when installed.&lt;br /&gt;
&lt;br /&gt;
==Misc==&lt;br /&gt;
&lt;br /&gt;
===Middle mouse button does not work ingame===&lt;br /&gt;
&lt;br /&gt;
If you use Logitech Setpoint be aware that it sets your middle mouse button by default to &#039;Autoscroll&#039;. It should be set to &#039;Middle button&#039; instead. Change the setting in Setpoint.&lt;br /&gt;
&lt;br /&gt;
===Spring crashes after Error opening cache\ ... in infolog.txt===&lt;br /&gt;
&lt;br /&gt;
   [f=0000000] Reading Estimate PathCosts [8]&lt;br /&gt;
   [f=0000000] Error opening cache\paths\...&lt;br /&gt;
&lt;br /&gt;
this is a known bug in 0.82.7.1. Your cpu also has many cores?&lt;br /&gt;
Then try to set HardwareThreadCount=2&amp;quot; in [[springrc]]. Spring tries to create the PathCache with to many threads in parallel and crashes because out of memory.&lt;br /&gt;
&lt;br /&gt;
===I have a problem that is not described here! What can i do?===&lt;br /&gt;
There is a number of things you can do, among these are:&lt;br /&gt;
* Search in the [http://springrts.com/phpbb/viewforum.php?f=11 Help &amp;amp; Bugs Forum], and ask if you can not find a suiting topic.&lt;br /&gt;
* Check the games forum or homepage.&lt;br /&gt;
* Look at the [[Gentoo_install#Linux_specific_Troubleshooting|Linux only FAQ]].&lt;br /&gt;
* Ask for help in the lobby in a suiting channel, eg: #springlobby, #de, #fr, #ai, #main&lt;br /&gt;
* Ask the FAQ-Bot in the lobby in channel #springlobby. To get a list of topics, write &#039;&#039;!faqlist&#039;&#039; and then use &#039;&#039;!faq &amp;lt;topic-name&amp;gt;&#039;&#039; to get the help text. For example, try &#039;&#039;!faq rename&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===The ingame chat spams a lot of cryptic error messages===&lt;br /&gt;
This is most likely a problem with the game&#039;s Lua scripting.&lt;br /&gt;
Report it in the games forum or its bug tracker.&lt;br /&gt;
[[Bugs|Here]] are some hints how to so.&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Read_Me_First&amp;diff=15839</id>
		<title>Read Me First</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Read_Me_First&amp;diff=15839"/>
		<updated>2021-02-07T11:28:44Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: Updated BA link; springfightclub.com now redirects to balancedannhilation.com, so we&amp;#039;ll use that address instead.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__= Playing =&lt;br /&gt;
&#039;&#039;&#039;Spring is an engine!&#039;&#039;&#039; It can play many different games and maps. To play, you need at least one [[Games|Game]] and [[Maps|Map]]!&lt;br /&gt;
&lt;br /&gt;
==Getting Started==&lt;br /&gt;
&lt;br /&gt;
To get started with Spring, download [https://springlobby.info/ SpringLobby], which you can use to play, chat and download games and maps.&lt;br /&gt;
&lt;br /&gt;
==Downloading Games/Maps==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;To download [[Games|Games]] (or [[Maps|Maps]]), use your lobby to join an online battle hosting the game/map that you want. It should offer to download for you.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;If the download fails, or if no games/maps show up, you should check that your lobby has found your Spring install. With SpringLobby, click edit -&amp;gt; preferences -&amp;gt; Spring, and make sure that it has the correct paths.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also download games and maps manually, see the [[FAQ|FAQ]]. There is also the option to install different [[GamesDownloads#Universal_Downloaders|Lobbies]].&lt;br /&gt;
&lt;br /&gt;
==Single-Player==&lt;br /&gt;
&lt;br /&gt;
To start a single-player game, use your lobby. Go to the Single-Player tab. Select a game, map and [[AIs|AI]] and click &amp;quot;Start&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Some AIs don&#039;t work with all games. If the one you pick builds nothing, try another!&lt;br /&gt;
&lt;br /&gt;
==Playing Online==&lt;br /&gt;
To play online, you need the latest version of the [[Download|Spring Engine]]. To join matches, look for the &amp;quot;battles&amp;quot; or &amp;quot;multiplayer&amp;quot; tab in your lobby client.&lt;br /&gt;
&lt;br /&gt;
== Wondering where some former popular games are? ==&lt;br /&gt;
Some larger games run their own lobby servers! &lt;br /&gt;
* Zero-k (which grew out of CA) can be found at https://zero-k.info/&lt;br /&gt;
* Beyond All Reason (which grew out of BAR) can be found at https://www.beyondallreason.info/&lt;br /&gt;
* Balanced Annihilation and some other legacy *A games can be found at at https://balancedannihilation.com/&lt;br /&gt;
&lt;br /&gt;
==Lan Party==&lt;br /&gt;
See the dedicated page [[Spring_on_a_LAN|Playing on a lan]].&lt;br /&gt;
&lt;br /&gt;
=Useful Hotkeys, Etc.=&lt;br /&gt;
&lt;br /&gt;
For the default keyboard layout please look at the [[Keyboard]] page.&lt;br /&gt;
&lt;br /&gt;
=The Spring Forum=&lt;br /&gt;
[[Forum_Etiquette|Guidelines For Forum Etiquette]]&lt;br /&gt;
&lt;br /&gt;
=Development=&lt;br /&gt;
To get started with development check the [[Engine_Development|Development]] page.&lt;br /&gt;
&lt;br /&gt;
=Your question not answered here? Got problems?=&lt;br /&gt;
Read the [[FAQ|Frequently Asked Questions]] or ask in the [http://springrts.com/phpbb/viewforum.php?f=11 Forum].&lt;br /&gt;
You can also report [[Bugs]] to the developers so they can be fixed.&lt;br /&gt;
&lt;br /&gt;
==Game Specific Questions==&lt;br /&gt;
If you have a question or problem with a certain gameplay mechanic in a game, you can talk about it at the [http://springrts.com/phpbb/viewforum.php?f=47 game&#039;s subforum]&lt;br /&gt;
&lt;br /&gt;
If Spring crashes/hangs, please look at the [[FAQ:trouble|FAQ]]. &lt;br /&gt;
&lt;br /&gt;
[[Category:Help]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
This page opens, when the installer finished installing, keep that in mind when changing stuff here. This Page is also linked directly from the start-page.&lt;br /&gt;
&lt;br /&gt;
This page should explain how to get an running game after installing the engine.&lt;br /&gt;
(Install Mod + Map)&lt;br /&gt;
 --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3510</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3510"/>
		<updated>2020-03-04T12:47:29Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: /* Macports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
=== MacPorts ===&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===HomeBrew===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install gcc@8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
===MacPorts===&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===HomeBrew===&lt;br /&gt;
&lt;br /&gt;
Note that this list is incomplete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install cmake minizip freetype glew openal-soft p7zip clang-format libvorbis jsoncpp PkgConfig devil sdl2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release. (Note: The recursive argument is important for submodules.)&amp;lt;br /&amp;gt;&lt;br /&gt;
Update with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=/path/to/bin/g++-mp-8 -DCMAKE_C_COMPILER=/path/to/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include &lt;br /&gt;
-DGLEW_LIBRARIES=/path/to/lib/libGLEW.a &lt;br /&gt;
-DOPENAL_INCLUDE_DIR=/path/to/include/AL &lt;br /&gt;
-DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory &lt;br /&gt;
-DCMAKE_PREFIX_PATH=/path/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by: &amp;lt;code&amp;gt;make spring -j&amp;lt;n&amp;gt;&amp;lt;/code&amp;gt; Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Examples=&lt;br /&gt;
&lt;br /&gt;
==Macports==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Example setup script (for MacOS Catalina)&lt;br /&gt;
&lt;br /&gt;
# Macports must be installed prior to running this script. Macports requires XCode to be installed.&lt;br /&gt;
# Boost sources must be located in&lt;br /&gt;
&lt;br /&gt;
# Requires the following directory format:&lt;br /&gt;
# $DIR (customisable; set on line 16)&lt;br /&gt;
#	/setup.sh&lt;br /&gt;
#	/build.sh&lt;br /&gt;
# 	/Sources&lt;br /&gt;
#		/boost_1_68_0&lt;br /&gt;
#	/Builds&lt;br /&gt;
#	/Bunldes&lt;br /&gt;
&lt;br /&gt;
DIR=~/Spring # The root directory; to be set manually&lt;br /&gt;
&lt;br /&gt;
SCRIPTDIR=~/Documents/Spring/ # The directory the build script is located in&lt;br /&gt;
&lt;br /&gt;
SOURCES=$DIR/Sources&lt;br /&gt;
SPRING=$SOURCES/spring&lt;br /&gt;
BOOST=$SOURCES/boost_1_66_0/boost&lt;br /&gt;
&lt;br /&gt;
cd $DIR&lt;br /&gt;
&lt;br /&gt;
# Install the necessary compiler. Version gcc5 is oldest compatible with High Sierra; gcc48 is the oldest I know works&lt;br /&gt;
sudo port install gcc9&lt;br /&gt;
&lt;br /&gt;
# Set compiler as default&lt;br /&gt;
sudo port select --set gcc mp-gcc9&lt;br /&gt;
hash -r&lt;br /&gt;
&lt;br /&gt;
sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils dylibbundler xorg-libXcursor +gcc9&lt;br /&gt;
#dylibbundler is for the bundling stage, not actual dependency&lt;br /&gt;
&lt;br /&gt;
cd $SOURCES&lt;br /&gt;
&lt;br /&gt;
# Clone from git (creates the directory $SPRING for us)&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git&lt;br /&gt;
cd $SPRING&lt;br /&gt;
git fetch --all --tags --prune&lt;br /&gt;
git checkout tags/103.0 -b master&lt;br /&gt;
&lt;br /&gt;
# Install Boost&lt;br /&gt;
&lt;br /&gt;
cd $BOOST&lt;br /&gt;
&lt;br /&gt;
./bootstrap.sh --with-toolset=gcc --with-libraries=all # Not sure which libaries.&lt;br /&gt;
./b2 # install&lt;br /&gt;
&lt;br /&gt;
# Try compiling spring&lt;br /&gt;
&lt;br /&gt;
cd $SCRIPTDIR&lt;br /&gt;
&lt;br /&gt;
sh build.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Example buildscript (for MacOS Catalina)&lt;br /&gt;
&lt;br /&gt;
# This script assumes that setup.sh (the above example) has been run.&lt;br /&gt;
&lt;br /&gt;
# Build Configuration&lt;br /&gt;
&lt;br /&gt;
BRANCH=&amp;lt;branch name&amp;gt; # The source branch to checkout and build.&lt;br /&gt;
REPOSITORY=spring # The name of the folder containing the git repository.&lt;br /&gt;
WIPE=0 # Wipes previous build on WIPE = 1 (flag -w)&lt;br /&gt;
&lt;br /&gt;
for arg in &amp;quot;$@&amp;quot;&lt;br /&gt;
do&lt;br /&gt;
if [ &amp;quot;$arg&amp;quot; == &amp;quot;-w&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Initiating clean build.&amp;quot;&lt;br /&gt;
WIPE=1&lt;br /&gt;
else&lt;br /&gt;
echo &amp;quot;Unknown flag ${arg}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Building sources at/to ${REPOSITORY}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Directory Setup&lt;br /&gt;
&lt;br /&gt;
DIR=~/Spring # Where everything is/will be&lt;br /&gt;
SOURCES=$DIR/Sources&lt;br /&gt;
SPRING=$SOURCES/$REPOSITORY&lt;br /&gt;
BUILD=$DIR/Builds/$REPOSITORY&lt;br /&gt;
BOOST=$SOURCES/boost_1_55_0 # Where boost can be found. Must be prepared as per the setup script (above).&lt;br /&gt;
&lt;br /&gt;
MACPORTS=/opt/local # The install directory of MACPORTS&lt;br /&gt;
&lt;br /&gt;
if [ -d $BUILD ]; then&lt;br /&gt;
	if [ $WIPE != 0 ]; then&lt;br /&gt;
		echo &amp;quot;Wiping previous build…&amp;quot;&lt;br /&gt;
		rm -r $BUILD # Wipe preivous build&lt;br /&gt;
&lt;br /&gt;
		echo &amp;quot;Making new build directory…&amp;quot;&lt;br /&gt;
		mkdir $BUILD # The others should have already been made&lt;br /&gt;
	fi&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;Making new build directory…&amp;quot;&lt;br /&gt;
	mkdir $BUILD # The others should have already been made&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -e $DIR/log.txt ]; then&lt;br /&gt;
	echo &amp;quot;Removing outdated log…&amp;quot;&lt;br /&gt;
	rm $DIR/log.txt&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Source setup&lt;br /&gt;
&lt;br /&gt;
if [ -d $SPRING ]; then&lt;br /&gt;
	cd $SPRING&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;Cloning remote…&amp;quot;&lt;br /&gt;
    cd $SOURCES&lt;br /&gt;
    git clone --recursive git://github.com/spring/spring.git $REPOSITORY&lt;br /&gt;
&lt;br /&gt;
	cd $SPRING&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Update repository&lt;br /&gt;
&lt;br /&gt;
CURRENTBRANCH=$(git rev-parse --abbrev-ref HEAD)&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$CURRENTBRANCH&amp;quot; != &amp;quot;$BRANCH&amp;quot; ]; then&lt;br /&gt;
git fetch --all&lt;br /&gt;
echo &amp;quot;Switching branch from ${CURRENTBRANCH} to ${BRANCH}&amp;quot;&lt;br /&gt;
git checkout $BRANCH&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Updating to latest…&amp;quot;&lt;br /&gt;
git pull # Update to latest&lt;br /&gt;
echo &amp;quot;Updating submodules&amp;quot;&lt;br /&gt;
git submodule update&lt;br /&gt;
&lt;br /&gt;
# Metadata&lt;br /&gt;
&lt;br /&gt;
REV=$(git describe --tags)&lt;br /&gt;
VERSION=`echo &amp;quot;${REV}&amp;quot; | tr &#039;&amp;lt;&amp;gt;:\&amp;quot;/\\|?*&#039; -`&lt;br /&gt;
&lt;br /&gt;
# Compile&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Compiling Spring ${VERSION}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd $BUILD&lt;br /&gt;
&lt;br /&gt;
cmake . $SPRING -DCMAKE_PREFIX_PATH=$MACPORTS -DCMAKE_CXX_COMPILER=$MACPORTS/bin/g++-mp-9 -DCMAKE_C_COMPILER=$MACPORTS/bin/gcc-mp-9 -DGLEW_INCLUDE_DIR=$MACPORTS/include -DGLEW_LIBRARIES=$MACPORTS/lib/libGLEW.a -DOPENAL_INCLUDE_DIR=$MACPORTS/include/AL -DBOOST_ROOT=$BOOST -DBoost_USE_STATIC_LIBS=YES -DCMAKE_CXX_FLAGS=&amp;quot;${FLAGS}&amp;quot; -DCMAKE_C_FLAGS=&amp;quot;${FLAGS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
make spring -j5 # &amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
make pr-downloader # -j5 &amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
make install-spring DESTDIR=$BUILD/temp #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Bundling spring&lt;br /&gt;
&lt;br /&gt;
BUNDLES=$DIR/Bundles&lt;br /&gt;
BUNDLE=$BUNDLES/Spring_${VERSION}.app&lt;br /&gt;
&lt;br /&gt;
mkdir $BUNDLES&lt;br /&gt;
mkdir $BUNDLE&lt;br /&gt;
mkdir $BUNDLE/Contents&lt;br /&gt;
mkdir $BUNDLE/Contents/MacOS&lt;br /&gt;
mkdir $BUNDLE/Contents/Resources&lt;br /&gt;
mkdir $BUNDLE/Contents/lib&lt;br /&gt;
&lt;br /&gt;
cp $BUILD/spring $BUNDLE/Contents/MacOS/spring #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
cp $SPRING/installer/Mac/spring.icns $BUNDLE/Contents/Resources/spring.icns #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
cp -R $BUILD/temp/usr/local/share $BUNDLE/Contents/share #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
cat $SPRING/installer/Mac/Info.plist | sed s/###VERSION###/${VERSION}/ &amp;gt; $BUNDLE/Contents/Info.plist&lt;br /&gt;
&lt;br /&gt;
cp $BUILD/tools/pr-downloader/src/pr-downloader $BUNDLE/Contents/MacOS #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUILD/temp/usr/local/lib/libunitsync.dylib -d $BUNDLE/Contents/MacOS -p @loader_path/../MacOS #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -of -cd -b -x $BUNDLE/Contents/MacOS/spring -d $BUNDLE/Contents/lib -p @executable_path/../lib #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
install_name_tool -change $MACPORTS/lib/libX11.6.dylib @executable_path/../lib/libX11.6.dylib $BUNDLE/Contents/lib/libXcursor.1.dylib #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -of -cd -b -x $BUNDLE/Contents/MacOS/pr-downloader -d $BUNDLE/Contents/lib -p @executable_path/../lib #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Interfaces/C/0.1/libAIInterface.dylib -d $BUNDLE/Contents/share/games/spring/AI/Interfaces/C/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Interfaces/Java/0.1/libAIInterface.dylib -d $BUNDLE/Contents/share/games/spring/AI/Interfaces/Java/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/AAI/0.9/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/AAI/0.9 -p @loader_path/../0.9 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/CppTestAI/0.1/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/CppTestAI/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/E323AI/3.25.0/libSkirmishAI.dylib -d $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/E323AI/3.25.0 -p @loader_path/../3.25.0 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/KAIK/0.13/libSkirmishAI.dylib -d $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/KAIK/0.13 -p @loader_path/../0.13 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/NullAI/0.1/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/NullAI/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/RAI/0.601/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/RAI/0.601 -p @loader_path/../0.601 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/Shard/dev/libSkirmishAI.dylib -d $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/Shard/dev -p @loader_path/../dev #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
if [ ! -e $BUNDLE/Contents/MacOS/spring ];then&lt;br /&gt;
echo &amp;quot;Error: App did not build correctly. Check log for details&amp;quot;&lt;br /&gt;
ERRORBUILD=1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$ERRORBUILD&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
	echo &amp;quot;Build Failed.&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3509</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3509"/>
		<updated>2020-03-04T12:46:29Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: Added example setup &amp;amp; build scripts for Macports&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
=== MacPorts ===&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===HomeBrew===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install gcc@8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
===MacPorts===&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===HomeBrew===&lt;br /&gt;
&lt;br /&gt;
Note that this list is incomplete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install cmake minizip freetype glew openal-soft p7zip clang-format libvorbis jsoncpp PkgConfig devil sdl2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release. (Note: The recursive argument is important for submodules.)&amp;lt;br /&amp;gt;&lt;br /&gt;
Update with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=/path/to/bin/g++-mp-8 -DCMAKE_C_COMPILER=/path/to/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include &lt;br /&gt;
-DGLEW_LIBRARIES=/path/to/lib/libGLEW.a &lt;br /&gt;
-DOPENAL_INCLUDE_DIR=/path/to/include/AL &lt;br /&gt;
-DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory &lt;br /&gt;
-DCMAKE_PREFIX_PATH=/path/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by: &amp;lt;code&amp;gt;make spring -j&amp;lt;n&amp;gt;&amp;lt;/code&amp;gt; Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Examples=&lt;br /&gt;
&lt;br /&gt;
==Macports==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Example setup script (for MacOS Catalina)&lt;br /&gt;
&lt;br /&gt;
# Macports must be installed prior to running this script. Macports requires XCode to be installed.&lt;br /&gt;
# Boost sources must be located in&lt;br /&gt;
&lt;br /&gt;
# Requires the following directory format:&lt;br /&gt;
# $DIR (customisable; set on line 16)&lt;br /&gt;
#	/setup.sh&lt;br /&gt;
#	/build.sh&lt;br /&gt;
# 	/Sources&lt;br /&gt;
#		/boost_1_68_0&lt;br /&gt;
#	/Builds&lt;br /&gt;
#	/Bunldes&lt;br /&gt;
&lt;br /&gt;
DIR=~/Spring # The root directory; to be set manually&lt;br /&gt;
&lt;br /&gt;
SCRIPTDIR=~/Documents/Spring/ # The directory the build script is located in&lt;br /&gt;
&lt;br /&gt;
SOURCES=$DIR/Sources&lt;br /&gt;
SPRING=$SOURCES/spring&lt;br /&gt;
BOOST=$SOURCES/boost_1_66_0/boost&lt;br /&gt;
&lt;br /&gt;
cd $DIR&lt;br /&gt;
&lt;br /&gt;
# Install the necessary compiler. Version gcc5 is oldest compatible with High Sierra; gcc48 is the oldest I know works&lt;br /&gt;
sudo port install gcc9&lt;br /&gt;
&lt;br /&gt;
# Set compiler as default&lt;br /&gt;
sudo port select --set gcc mp-gcc9&lt;br /&gt;
hash -r&lt;br /&gt;
&lt;br /&gt;
sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils dylibbundler xorg-libXcursor +gcc9&lt;br /&gt;
#dylibbundler is for the bundling stage, not actual dependency&lt;br /&gt;
&lt;br /&gt;
cd $SOURCES&lt;br /&gt;
&lt;br /&gt;
# Clone from git (creates the directory $SPRING for us)&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git&lt;br /&gt;
cd $SPRING&lt;br /&gt;
git fetch --all --tags --prune&lt;br /&gt;
git checkout tags/103.0 -b master&lt;br /&gt;
&lt;br /&gt;
# Install Boost&lt;br /&gt;
&lt;br /&gt;
cd $BOOST&lt;br /&gt;
&lt;br /&gt;
./bootstrap.sh --with-toolset=gcc --with-libraries=all # Not sure which libaries.&lt;br /&gt;
./b2 # install&lt;br /&gt;
&lt;br /&gt;
# Try compiling spring&lt;br /&gt;
&lt;br /&gt;
cd $SCRIPTDIR&lt;br /&gt;
&lt;br /&gt;
sh build.sh&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Example buildscript (for MacOS Catalina)&lt;br /&gt;
&lt;br /&gt;
# This script assumes that setup.sh (the above example) has been run.&lt;br /&gt;
&lt;br /&gt;
# Build Configuration&lt;br /&gt;
&lt;br /&gt;
BRANCH=&amp;lt;branch name&amp;gt; # The source branch to checkout and build.&lt;br /&gt;
REPOSITORY=spring # The name of the folder containing the git repository.&lt;br /&gt;
WIPE=0 # Wipes previous build on WIPE = 1 (flag -w)&lt;br /&gt;
&lt;br /&gt;
for arg in &amp;quot;$@&amp;quot;&lt;br /&gt;
do&lt;br /&gt;
if [ &amp;quot;$arg&amp;quot; == &amp;quot;-w&amp;quot; ]; then&lt;br /&gt;
echo &amp;quot;Initiating clean build.&amp;quot;&lt;br /&gt;
WIPE=1&lt;br /&gt;
else&lt;br /&gt;
echo &amp;quot;Unknown flag ${arg}&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Building sources at/to ${REPOSITORY}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Directory Setup&lt;br /&gt;
&lt;br /&gt;
DIR=~/Spring # Where everything is/will be&lt;br /&gt;
SOURCES=$DIR/Sources&lt;br /&gt;
SPRING=$SOURCES/$REPOSITORY&lt;br /&gt;
BUILD=$DIR/Builds/$REPOSITORY&lt;br /&gt;
BOOST=$SOURCES/boost_1_55_0 # Where boost can be found. Must be prepared as per the setup script (above).&lt;br /&gt;
&lt;br /&gt;
MACPORTS=/opt/local # The install directory of MACPORTS&lt;br /&gt;
&lt;br /&gt;
if [ -d $BUILD ]; then&lt;br /&gt;
	if [ $WIPE != 0 ]; then&lt;br /&gt;
		echo &amp;quot;Wiping previous build…&amp;quot;&lt;br /&gt;
		rm -r $BUILD # Wipe preivous build&lt;br /&gt;
&lt;br /&gt;
		echo &amp;quot;Making new build directory…&amp;quot;&lt;br /&gt;
		mkdir $BUILD # The others should have already been made&lt;br /&gt;
	fi&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;Making new build directory…&amp;quot;&lt;br /&gt;
	mkdir $BUILD # The others should have already been made&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -e $DIR/log.txt ]; then&lt;br /&gt;
	echo &amp;quot;Removing outdated log…&amp;quot;&lt;br /&gt;
	rm $DIR/log.txt&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Source setup&lt;br /&gt;
&lt;br /&gt;
if [ -d $SPRING ]; then&lt;br /&gt;
	cd $SPRING&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;Cloning remote…&amp;quot;&lt;br /&gt;
    cd $SOURCES&lt;br /&gt;
    git clone --recursive git://github.com/spring/spring.git $REPOSITORY&lt;br /&gt;
&lt;br /&gt;
	cd $SPRING&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Update repository&lt;br /&gt;
&lt;br /&gt;
CURRENTBRANCH=$(git rev-parse --abbrev-ref HEAD)&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$CURRENTBRANCH&amp;quot; != &amp;quot;$BRANCH&amp;quot; ]; then&lt;br /&gt;
git fetch --all&lt;br /&gt;
echo &amp;quot;Switching branch from ${CURRENTBRANCH} to ${BRANCH}&amp;quot;&lt;br /&gt;
git checkout $BRANCH&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Updating to latest…&amp;quot;&lt;br /&gt;
git pull # Update to latest&lt;br /&gt;
echo &amp;quot;Updating submodules&amp;quot;&lt;br /&gt;
git submodule update&lt;br /&gt;
&lt;br /&gt;
# Metadata&lt;br /&gt;
&lt;br /&gt;
REV=$(git describe --tags)&lt;br /&gt;
VERSION=`echo &amp;quot;${REV}&amp;quot; | tr &#039;&amp;lt;&amp;gt;:\&amp;quot;/\\|?*&#039; -`&lt;br /&gt;
&lt;br /&gt;
# Compile&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Compiling Spring ${VERSION}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd $BUILD&lt;br /&gt;
&lt;br /&gt;
cmake . $SPRING -DCMAKE_PREFIX_PATH=$MACPORTS -DCMAKE_CXX_COMPILER=$MACPORTS/bin/g++-mp-9 -DCMAKE_C_COMPILER=$MACPORTS/bin/gcc-mp-9 -DGLEW_INCLUDE_DIR=$MACPORTS/include -DGLEW_LIBRARIES=$MACPORTS/lib/libGLEW.a -DOPENAL_INCLUDE_DIR=$MACPORTS/include/AL -DBOOST_ROOT=$BOOST -DBoost_USE_STATIC_LIBS=YES -DCMAKE_CXX_FLAGS=&amp;quot;${FLAGS}&amp;quot; -DCMAKE_C_FLAGS=&amp;quot;${FLAGS}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
make spring -j5 # &amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
make pr-downloader # -j5 &amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
make install-spring DESTDIR=$BUILD/temp #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
# Bundling spring&lt;br /&gt;
&lt;br /&gt;
BUNDLES=$DIR/Bundles&lt;br /&gt;
BUNDLE=$BUNDLES/Spring_${VERSION}.app&lt;br /&gt;
&lt;br /&gt;
mkdir $BUNDLES&lt;br /&gt;
mkdir $BUNDLE&lt;br /&gt;
mkdir $BUNDLE/Contents&lt;br /&gt;
mkdir $BUNDLE/Contents/MacOS&lt;br /&gt;
mkdir $BUNDLE/Contents/Resources&lt;br /&gt;
mkdir $BUNDLE/Contents/lib&lt;br /&gt;
&lt;br /&gt;
cp $BUILD/spring $BUNDLE/Contents/MacOS/spring #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
cp $SPRING/installer/Mac/spring.icns $BUNDLE/Contents/Resources/spring.icns #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
cp -R $BUILD/temp/usr/local/share $BUNDLE/Contents/share #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
cat $SPRING/installer/Mac/Info.plist | sed s/###VERSION###/${VERSION}/ &amp;gt; $BUNDLE/Contents/Info.plist&lt;br /&gt;
&lt;br /&gt;
cp $BUILD/tools/pr-downloader/src/pr-downloader $BUNDLE/Contents/MacOS #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUILD/temp/usr/local/lib/libunitsync.dylib -d $BUNDLE/Contents/MacOS -p @loader_path/../MacOS #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -of -cd -b -x $BUNDLE/Contents/MacOS/spring -d $BUNDLE/Contents/lib -p @executable_path/../lib #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
install_name_tool -change $MACPORTS/lib/libX11.6.dylib @executable_path/../lib/libX11.6.dylib $BUNDLE/Contents/lib/libXcursor.1.dylib #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -of -cd -b -x $BUNDLE/Contents/MacOS/pr-downloader -d $BUNDLE/Contents/lib -p @executable_path/../lib #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Interfaces/C/0.1/libAIInterface.dylib -d $BUNDLE/Contents/share/games/spring/AI/Interfaces/C/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Interfaces/Java/0.1/libAIInterface.dylib -d $BUNDLE/Contents/share/games/spring/AI/Interfaces/Java/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/AAI/0.9/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/AAI/0.9 -p @loader_path/../0.9 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/CppTestAI/0.1/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/CppTestAI/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/E323AI/3.25.0/libSkirmishAI.dylib -d $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/E323AI/3.25.0 -p @loader_path/../3.25.0 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/KAIK/0.13/libSkirmishAI.dylib -d $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/KAIK/0.13 -p @loader_path/../0.13 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/NullAI/0.1/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/NullAI/0.1 -p @loader_path/../0.1 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/RAI/0.601/libSkirmishAI.dylib -d $BUNDLE/Contents/share/games/spring/AI/Skirmish/RAI/0.601 -p @loader_path/../0.601 #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
dylibbundler -cd -b -x $BUNDLE/Contents/share/games/spring/AI/Skirmish/Shard/dev/libSkirmishAI.dylib -d $BUILD/Spring.app/Contents/share/games/spring/AI/Skirmish/Shard/dev -p @loader_path/../dev #&amp;gt;&amp;gt;$DIR/log.txt 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
if [ ! -e $BUNDLE/Contents/MacOS/spring ];then&lt;br /&gt;
echo &amp;quot;Error: App did not build correctly. Check log for details&amp;quot;&lt;br /&gt;
ERRORBUILD=1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ &amp;quot;$ERRORBUILD&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
	echo &amp;quot;Build Failed.&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done!&amp;quot;&lt;br /&gt;
exit 0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3507</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3507"/>
		<updated>2018-12-30T15:15:20Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: /* Obtaining Source */ Formatting tweak&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release. (Note: The recursive argument is important for submodules.)&amp;lt;br /&amp;gt;&lt;br /&gt;
Update with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=/path/to/bin/g++-mp-8 -DCMAKE_C_COMPILER=/path/to/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include &lt;br /&gt;
-DGLEW_LIBRARIES=/path/to/lib/libGLEW.a &lt;br /&gt;
-DOPENAL_INCLUDE_DIR=/path/to/include/AL &lt;br /&gt;
-DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory &lt;br /&gt;
-DCMAKE_PREFIX_PATH=/path/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by: &amp;lt;code&amp;gt;make spring -j&amp;lt;n&amp;gt;&amp;lt;/code&amp;gt; Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3506</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3506"/>
		<updated>2018-12-30T15:14:37Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: /* Compiling Source */ formatting tweak&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release. (Note: The recursive argument is important for submodules.)&lt;br /&gt;
Update with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=/path/to/bin/g++-mp-8 -DCMAKE_C_COMPILER=/path/to/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include &lt;br /&gt;
-DGLEW_LIBRARIES=/path/to/lib/libGLEW.a &lt;br /&gt;
-DOPENAL_INCLUDE_DIR=/path/to/include/AL &lt;br /&gt;
-DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory &lt;br /&gt;
-DCMAKE_PREFIX_PATH=/path/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by: &amp;lt;code&amp;gt;make spring -j&amp;lt;n&amp;gt;&amp;lt;/code&amp;gt; Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3505</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3505"/>
		<updated>2018-12-30T15:13:52Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: Fix formating&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release. (Note: The recursive argument is important for submodules.)&lt;br /&gt;
Update with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=/path/to/bin/g++-mp-8 -DCMAKE_C_COMPILER=/path/to/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include &lt;br /&gt;
-DGLEW_LIBRARIES=/path/to/lib/libGLEW.a &lt;br /&gt;
-DOPENAL_INCLUDE_DIR=/path/to/include/AL &lt;br /&gt;
-DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory &lt;br /&gt;
-DCMAKE_PREFIX_PATH=/path/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
make spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3504</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3504"/>
		<updated>2018-12-28T08:54:44Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: /* Compiling Source: fix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The recursive argument is important for submodules. Update with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=/path/to/bin/g++-mp-8 -DCMAKE_C_COMPILER=/path/to/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include -DGLEW_LIBRARIES=/path/to/lib/libGLEW.a -DOPENAL_INCLUDE_DIR=/path/to/include/AL -DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory -DCMAKE_PREFIX_PATH=/path/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3503</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3503"/>
		<updated>2018-12-28T07:52:22Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: Grammar error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The recursive argument is important for submodules. Update with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=$MACPORTS/bin/g++-mp-8 -DCMAKE_C_COMPILER=$MACPORTS/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include -DGLEW_LIBRARIES=/path/to/lib/libGLEW.a -DOPENAL_INCLUDE_DIR=/path/to/include/AL -DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
-DCMAKE_PREFIX_PATH=$MACPORTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3502</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3502"/>
		<updated>2018-12-28T07:50:33Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: Rewrite the guide to (hopefully) be cleaner, and (definitely) be more up-to-date&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The recursive argument is important for submodules. Update with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=$MACPORTS/bin/g++-mp-8 -DCMAKE_C_COMPILER=$MACPORTS/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include -DGLEW_LIBRARIES=/path/to/lib/libGLEW.a -DOPENAL_INCLUDE_DIR=/path/to/include/AL -DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
-DCMAKE_PREFIX_PATH=$MACPORTS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These flags were recommended by a previous editor:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3501</id>
		<title>Building Spring on MacOSX</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_MacOSX&amp;diff=3501"/>
		<updated>2018-12-28T07:41:26Z</updated>

		<summary type="html">&lt;p&gt;Masterbel: Rewrite the guide to (hopefully) be cleaner, and (definitely) be more up-to-date&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
This is a guide to the requirements for building the Spring RTS engine on MacOS. If you want only to play a spring game, follow the [[Spring_on_MacOSX]] Tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Building Spring on MacOS=&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Guide is for x86/Intel based MacOS installs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Even though it will not run, Spring should successfully compile on Mac for both 104.0 and the latest develop version.&lt;br /&gt;
&lt;br /&gt;
NOTE: Only official spring versions 99.0-103.1 will compile and run on MacOS. 104+ will compile, but uses an incompatible OpenGL version. When 105.0 is released, a MacOS - compatible OpenGL version will be used, however at this point in time &#039;&#039;&#039;there are other blocking issues&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Questions about this process should be asked [https://springrts.com/phpbb/viewforum.php?f=65 here].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
&lt;br /&gt;
==Command Line Tools==&lt;br /&gt;
Install the [http://developer.apple.com/TOOLS/Xcode/ Xcode developers package] (this requires a free membership to apple&#039;s ADC website).&lt;br /&gt;
&lt;br /&gt;
==Package Manager==&lt;br /&gt;
Either  [http://brew.sh Homebrew] or [http://www.macports.org/install.php MacPorts] may be used to fetch dependencies. The MacOS Buildbot (run by Turboss) uses Homebrew. The writer uses Macports.&lt;br /&gt;
&lt;br /&gt;
== Compiler==&lt;br /&gt;
&lt;br /&gt;
Compiler: GCC must be used, and dependencies must be compiled with GCC&lt;br /&gt;
&lt;br /&gt;
For MacPorts:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install&lt;br /&gt;
sudo port select --set gcc mp-gcc8&lt;br /&gt;
hash -r # Reload the terminal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To check for installed gcc:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port select --list gcc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
&lt;br /&gt;
Necessary dependencies for the develop branch are below (as called by Macports):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
port install sudo port install cmake libsdl2 p7zip libdevil libvorbis minizip openal-soft glew freetype binutils libXcursor +gcc8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This list has not been tested for errors; please message MasterBel if they do not work for you.)&lt;br /&gt;
&lt;br /&gt;
Compiling Spring 104.0 (current master) or older will also require Boost. [https://sourceforge.net/projects/boost/ Retreive source] and compile with gcc. &#039;&#039;&#039;TODO: Instructions?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Obtaining Source==&lt;br /&gt;
&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b &amp;lt;branch&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
The “master” branch is the latest stable release. “develop” branch is the latest development release&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The recursive argument is important for submodules. Update with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Compiling Source=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DCMAKE_CXX_COMPILER=$MACPORTS/bin/g++-mp-8 -DCMAKE_C_COMPILER=$MACPORTS/bin/gcc-mp-8&lt;br /&gt;
make spring&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other common Cmake flags are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/path/to/include -DGLEW_LIBRARIES=/path/to/lib/libGLEW.a -DOPENAL_INCLUDE_DIR=/path/to/include/AL -DCMAKE_INSTALL_PREFIX:PATH=/path/to/output/directory&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If boost is used:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
-DBoost_Root=/path/to/boost&lt;br /&gt;
-DCMAKE_PREFIX_PATH=$MACPORTS &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number of simultaneous jobs may be specified by:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Where n is number of jobs. It is common for n to be number of cores + 1&lt;br /&gt;
&lt;br /&gt;
Other targets may be made also/instead, e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
make prdownloader -j&amp;lt;n&amp;gt;&lt;br /&gt;
make install-spring -j&amp;lt;n&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Additional Notes=&lt;br /&gt;
==Using Macports==&lt;br /&gt;
As hint: set &amp;quot;buildmakejobs&amp;quot; to cpu-core count + 1 in /opt/local/etc/macports/macports.conf. For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
buildmakejobs 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using Homebrew==&lt;br /&gt;
&lt;br /&gt;
Hombrew can install boost, but it must be recompiled  with gcc &amp;lt;version&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
brew install boost --build-from-source --cc=gcc&amp;lt;version&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build And Install:&lt;br /&gt;
&lt;br /&gt;
==brew-specific instructions:==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
cmake . -DAPPLE=1 -DCMAKE_CXX_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/g++-4.8 \&lt;br /&gt;
-DCMAKE_C_COMPILER=/usr/local/Cellar/gcc48/4.8.3/bin/gcc-4.8 \&lt;br /&gt;
-DIL_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DGLEW_INCLUDE_DIR=/usr/local/include \&lt;br /&gt;
-DOPENAL_DIR=/usr/local/include/AL \&lt;br /&gt;
-DNO_SOUND=1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Masterbel</name></author>
	</entry>
</feed>