<?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=Beherith</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=Beherith"/>
	<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/wiki/Special:Contributions/Beherith"/>
	<updated>2026-11-08T16:48:25Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10815</id>
		<title>Lua:Callins</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10815"/>
		<updated>2022-10-12T14:10:04Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Drawing */ newline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua Callins =&lt;br /&gt;
This page is future looking to unified widget/gadget (aka &amp;quot;addon&amp;quot;) handler, which may yet be some way off, c.f. the [https://github.com/spring/spring/blob/ebb704e008f6ea645947d07be1cfcc272af0428f/doc/changelog.txt#L71 changelog].&lt;br /&gt;
&lt;br /&gt;
Related Sourcecode :&lt;br /&gt;
[https://github.com/spring/spring/blob/d9b3927a528a876b9ab4042771e82b050267572a/rts/Lua/LuaHandle.cpp https://github.com/spring/spring/rts/Lua/LuaHandle.cpp]&lt;br /&gt;
&lt;br /&gt;
For now, to use these addons in a widget, replace addon with widget and, for a gadget, replace addon with gadget. For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
        ...  &lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some functions may differ between (synced) gadget and widgets; those are in the [[#Synced_-_Unsynced_Shared]] section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: maroon;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention:&#039;&#039;&#039;&amp;lt;/span&amp;gt; some callins will only work on the unsynced portion of the gadget. Due to the type-unsafe nature of lua parsing, those callins not firing up might be hard to trace. This document will be continuously updated to properly alert about those situations.&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Initialize&lt;br /&gt;
|info = Called when the addon is (re)loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Shutdown&lt;br /&gt;
|info = Called when the addon or the game is shutdown.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsynced Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DefaultCommand&lt;br /&gt;
|args = type, id&lt;br /&gt;
|return = {{type|number}} cmdID&lt;br /&gt;
|info = Used to set the default command when a unit is selected. First parameter is the type of the object pointed at (either &amp;quot;unit or &amp;quot;feature&amp;quot;) and the second is its {{var|unitID}} or {{var|featureID}} respectively. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandNotify&lt;br /&gt;
|args = cmdID, cmdParams, cmdOptions&lt;br /&gt;
|return = {{type|bool}} removeCmd&lt;br /&gt;
|info = Called when a command is issued. Returning {{value|true}} deletes the command and does not send it through the network.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandsChanged&lt;br /&gt;
|args = None&lt;br /&gt;
|return = ?&lt;br /&gt;
|info = Called when the command descriptions changed, e.g. when selecting or deselecting a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = WorldTooltip&lt;br /&gt;
|args = ttType, data1, data2, data3&lt;br /&gt;
|return = {{type|string}} newTooltip&lt;br /&gt;
|info = The parameters can be {{value|&amp;quot;unit&amp;quot;}}, {{var|unitID}}; {{value|&amp;quot;feature&amp;quot;}}, {{var|featureID}}; {{value|&amp;quot;ground&amp;quot;}}, {{var|posX}}, {{var|posY}}, {{var|posZ}} or {{value|&amp;quot;selection&amp;quot;}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnsyncedHeightMapUpdate&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = Called when the unsynced copy of the height-map is altered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameProgress&lt;br /&gt;
|args = serverFrameNum&lt;br /&gt;
|info = Called every 60 frames, calculating delta between GameFrame and GameProgress. Can give an ETA about catching up with simulation for mid-game join players.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameSetup&lt;br /&gt;
|args =  state, ready, playerStates&lt;br /&gt;
|return = {{type|bool}} success, {{type|bool}} newReady&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = SunChanged&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AddConsoleLine&lt;br /&gt;
|args = msg, priority&lt;br /&gt;
|info = Called when text is entered into the console (e.g. Spring.Echo).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvSkirmishAIMessage&lt;br /&gt;
|args = aiTeam, dataStr&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvFromSynced&lt;br /&gt;
|args = ...&lt;br /&gt;
|info = Receives data sent via [[Lua_System#Synced|SendToUnsynced]] callout.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Save&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called when a chat command &#039;/save&#039; or &#039;/savegame&#039; is received. The single argument is a userdatum representing the savegame zip file. See [[Lua_SaveLoad#Save_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = LoadProgress&lt;br /&gt;
|args = message, replaceLastLine&lt;br /&gt;
|info = Only available to LuaIntro.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GroupChanged&lt;br /&gt;
|args = groupID&lt;br /&gt;
|info = Called when a unit is added to or removed from a control group. Currently implemented for widgets only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ConfigureLayout&lt;br /&gt;
|args = ???&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Input ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = IsAbove&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|bool}} isAbove&lt;br /&gt;
|info = Called every Update. Must return {{value|true}} for {{name|Mouse*}} events and {{name|GetToolTip}} to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GetTooltip&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = Called when {{name|IsAbove}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyPress&lt;br /&gt;
|args = key, mods, isRepeat&lt;br /&gt;
|return = {{type|bool}} becomeOwner&lt;br /&gt;
|info = Called repeatedly when a key is pressed down. If you want an action to occur only once check for {{var|1=isRepeat == {{value|false}}}}. The {{var|mods}} parameter is a {{type|table}}, with keys {{value|&amp;quot;alt&amp;quot;}}, {{value|&amp;quot;ctrl&amp;quot;}}, {{value|&amp;quot;meta&amp;quot;}} and {{value|&amp;quot;shift&amp;quot;}} each having a boolean value. Return {{value|true}} if you don&#039;t want other callins or the engine to also receive this keypress. A list of key codes can be seen at the [https://wiki.libsdl.org/SDLKeycodeLookup SDL wiki].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyRelease&lt;br /&gt;
|args = key&lt;br /&gt;
|return = {{type|bool}}&lt;br /&gt;
|info = Called when the key is released.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TextInput&lt;br /&gt;
|args = utf8char&lt;br /&gt;
|info = Called whenever a key press results in text input. Introduced in 97.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = JoystickEvent&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MousePress&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = {{type|bool}} becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is pressed. The {{var|button}} parameter supports up to 7 buttons. Must return {{value|true}} for {{name|MouseRelease}} and other functions to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseRelease&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is released. Please note that in order to have Spring call {{name|MouseRelease}}, you need to have a {{name|MousePress}} call-in in the same addon that returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseWheel&lt;br /&gt;
|args = up, value&lt;br /&gt;
|info = Called when the mouse wheel is moved. The parameters indicate the direction and amount of travel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseMove&lt;br /&gt;
|args = x, y, dx, dy, button&lt;br /&gt;
|info = Called when the mouse is moved. The {{var|dx}} and {{var|dy}} parameters indicate the distance travelled, whereas the first two indicate the final position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Players ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerChanged&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a player&#039;s status changes e.g. becoming a spectator.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerAdded&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a new player joins the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerRemoved&lt;br /&gt;
|args = playerID, reason&lt;br /&gt;
|info = Called whenever a player is removed from the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadStarted&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download is started via [[Lua_VFS#Archives|VFS.DownloadArchive]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFinished&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download finishes successfully.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFailed&lt;br /&gt;
|args = id, errorID&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download fails to complete.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadProgress&lt;br /&gt;
|args = id, downloaded, total&lt;br /&gt;
|info = Called incrementally during a [[Pr-downloader]] download.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Drawing ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ViewResize&lt;br /&gt;
|args = viewSizeX, viewSizeY&lt;br /&gt;
|info = Called whenever the window is resized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Update&lt;br /&gt;
|args = dt&lt;br /&gt;
|info = Called for every draw frame (including when the game is paused) and at least once per sim frame except when catching up. The parameter is the time since the last update. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Draw* Functions ===&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Avoid doing heavy calculations inside these callins; ideally, do the calculations elsewhere and use Draw callins only for drawing.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|info = Doesn&#039;t render to screen! Use this callin to update textures, shaders, etc. Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreParticles&lt;br /&gt;
|info = ??? {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreUnit&lt;br /&gt;
|info = Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorld&lt;br /&gt;
|info = Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldShadow&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldReflection&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldRefraction&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreForward&lt;br /&gt;
|info = Runs at the start of the forward pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreDeferred&lt;br /&gt;
|info = Runs at the start of the deferred pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPostDeferred&lt;br /&gt;
|info = This runs at the end of its respective deferred pass and allows proper frame compositing (with ground flashes/decals/foliage/etc, which are drawn between it and [[#API:DrawWorldPreUnit|{{name|DrawWorldPreUnit}}]]) via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnitsPostDeferred&lt;br /&gt;
|info = Runs at the end of the unit deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeaturesPostDeferred&lt;br /&gt;
|info = Runs at the end of the feature deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreen&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = ??? Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenEffects&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = Where {{var|vsx}}, {{var|vsy}} are screen coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenPost&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = {{new|104.0}} Similar to {{name|DrawScreenEffects}}, this can be used to alter the contents of a frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawLoadScreen&lt;br /&gt;
|info = {{new|95.0}} Only available to LuaIntro, draws custom load screens.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimap&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimapBackground&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Object Rendering ===&lt;br /&gt;
For the following calls {{var|drawMode}} can be one of the following, {{var|1=notDrawing = {{value|0}}}}, {{var|1=normalDraw = {{value|1}}}}, {{var|1=shadowDraw = {{value|2}}}}, {{var|1=reflectionDraw = {{value|3}}}}, {{var|1=refractionDraw = {{value|4}}}}, and finally {{var|1=gameDeferredDraw = {{value|5}}}} which was added in 102.0.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnit&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of units, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeature&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of features, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawShield&lt;br /&gt;
|args = unitID, weaponID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of [[Gamedev:WeaponDefs#Shield_(WeaponType)|shields]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawProjectile&lt;br /&gt;
|args = projectileID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of weapon (&amp;amp; other) projectiles, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unsynced Menu Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDraw&lt;br /&gt;
|return = {{type|bool}} allowDraw&lt;br /&gt;
|info = Enables Draw{Genesis,Screen,ScreenPost} callins if {{value|true}} is returned, otherwise they are called once every 30 seconds. Only active when a game isn&#039;t running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateMenu&lt;br /&gt;
|info = Called whenever LuaMenu is on with no game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateGame&lt;br /&gt;
|info = Called whenever LuaMenu is on with a game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced - Unsynced Shared ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GotChatMsg&lt;br /&gt;
|args = msg, player&lt;br /&gt;
|info = Called when a player issues a UI command e.g. types {{var|/foo}} or {{var|/luarules foo}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameID&lt;br /&gt;
|args = gameID&lt;br /&gt;
|info = Called once to deliver the {{var|gameID}}. As of 101.0+ the string is encoded in hex.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePaused&lt;br /&gt;
|info = Called when the game is paused.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|args = winningAllyTeams&lt;br /&gt;
|info = The parameter is a {{type|table}} list of winning allyTeams, if empty the game result was undecided (like when dropping from an host).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameFrame&lt;br /&gt;
|args = frame&lt;br /&gt;
|info = Called for every game simulation frame (30 per second). Starts at frame {{value|0}} in 101.0+ and {{value|1}} in previous versions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePreload&lt;br /&gt;
|info = Called before the 0 gameframe. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameStart&lt;br /&gt;
|info = Called upon the start of the game. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamChanged&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamDied&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = Called when a team dies (see [[Lua_SyncedCtrl#Game_End|Spring.KillTeam]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCreated&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, builderID&lt;br /&gt;
|info = Called at the moment the unit is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFinished&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called at the moment the unit is completed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFromFactory&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, factID, factDefID, userOrders&lt;br /&gt;
|info = Called when a factory finishes construction of a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitReverseBuilt&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a living unit becomes a nanoframe again.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitGiven&lt;br /&gt;
|args = unitID, unitDefID, newTeam, oldTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called after {{name|UnitTaken}} and in that moment unit is assigned to the &#039;&#039;&#039;newTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitTaken&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called before {{name|UnitGiven}} and in that moment unit is still assigned to the &#039;&#039;&#039;oldTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDamaged&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is damaged (after {{name|UnitPreDamaged}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RenderUnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called just before a unit is invalid, after it finishes its death animation. {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitStunned&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, stunned&lt;br /&gt;
|info = Called when a unit changes its stun status. {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnitCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when two units collide. Both units must be registered with [[Lua_System#Synced|Script.SetWatchUnit]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFeatureCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when a unit collides with a feature. The unit must be registered with [[Lua_System#Synced|Script.SetWatchUnit]] and the feature registered with [[Lua_System#Synced|Script.SetWatchFeature]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitHarvestStorageFull&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit&#039;s harvestStorage is full (according to its unitDef&#039;s entry).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called after when a unit accepts a command, after {{name|AllowCommand}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCmdDone&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called when a unit completes a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLoaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is loaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnloaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is unloaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitExperience&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, experience, oldExperience&lt;br /&gt;
|info = Called when a unit gains experience greater or equal to the minimum limit set by calling [[Lua_SyncedCtrl#Other|Spring.SetExperienceGrade]]. Should be called more reliably with small values of experience grade in 104.0+.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitIdle&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit is idle (empty command queue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit cloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDecloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit decloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoveFailed&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = StockpileChanged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&lt;br /&gt;
|info = Called when a units stockpile of weapons increases or decreases. See {{xtaglink|Gamedev:WeaponDefs|stockpile}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters LOS of an allyteam. Its called after the unit is in LOS, so you can query that unit. The allyTeam is who&#039;s LOS the unit entered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves LOS of an allyteam. For widgets, this one is called just before the unit leaves los, so you can still get the position of a unit that left los. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters radar of an allyteam. Also called when a unit enters LOS without any radar coverage. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves radar of an allyteam. Also called when a unit leaves LOS without any radar coverage. For widgets, this is called just after a unit leaves radar coverage, so widgets cannot get the position of units that left their radar. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitSeismicPing&lt;br /&gt;
|args = x, y, z, strength, allyTeam, unitID, unitDefID&lt;br /&gt;
|info = Called when a unit emits a seismic ping. See {{xtaglink|Gamedev:UnitDefs|seismicSignature}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureCreated&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDamaged&lt;br /&gt;
|args =  featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a feature is damaged.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDestroyed&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Projectiles ===&lt;br /&gt;
The following Callins are only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileCreated&lt;br /&gt;
|args = proID, proOwnerID, weaponDefID&lt;br /&gt;
|info = Called when the projectile is created. Note that {{var|weaponDefID}} is missing if the projectile is spawned as part of a burst, but [[Lua_SyncedRead#Projectiles|Spring.GetProjectileDefID]] and [[Lua_SyncedRead#Projectiles|Spring.GetProjectileName]] still work in callin scope using {{var|proID}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileDestroyed&lt;br /&gt;
|args = proID&lt;br /&gt;
|info = Called when the projectile is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced Only ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandFallback&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&lt;br /&gt;
|return = {{type|bool}} used, {{type|bool}} finished&lt;br /&gt;
|info = Called when the unit reaches an unknown command in its queue (i.e. one not handled by the engine). If no addon returns {{var|used}} as {{value|true}} the command is dropped, if an addon returns {{value|true}}, {{value|true}} the command is removed because it&#039;s done, with {{value|true}}, {{value|false}} it&#039;s kept in the queue and {{name|CommandFallback}} gets called again on the next slowupdate.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when the command is given, before the unit&#039;s queue is altered. The return value is whether it should be let into the queue. The queue remains untouched when a command is blocked, whether it would be queued or replace the queue.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitCreation&lt;br /&gt;
|args = unitDefID, builderID, builderTeam, x, y, z, facing&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before unit is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitTransfer&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam, capture&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit is transferred to a different team, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitBuildStep&lt;br /&gt;
|args = builderID, builderTeam, unitID, unitDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit progresses its build percentage, the boolean return value determines whether or not the build makes progress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureCreation&lt;br /&gt;
|args = featureDefID, teamID, x, y, z&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before feature is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureBuildStep&lt;br /&gt;
|args = builderID, builderTeam, featureID, featureDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a feature changes its build percentage, the boolean return value determines whether or not the change is permitted. Note that this is also called for resurrecting features, and for refilling features with resources before resurrection. On reclaim the part values are negative, and on refill and ressurect they are positive. Part is the percentage the feature be built or reclaimed per frame. Eg. for a 30 workertime builder, that&#039;s a build power of 1 per frame. For a 50 buildtime feature reclaimed by this builder, part will be 100/-50(/1) = -2%, or -0.02 numerically.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceLevel&lt;br /&gt;
|args = teamID, res, level&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when a team sets the sharing level of a resource, the boolean return value determines whether or not the sharing level is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceTransfer&lt;br /&gt;
|args = oldTeamID, newTeamID, res, amount&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before resources are transferred between players, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowStartPosition&lt;br /&gt;
|args = playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = {{var|clamped{X,Y,Z}}} are the coordinates clamped into start-boxes, {{var|raw}} is where player tried to place their marker. The {{var|readyState}} can be any one of &lt;br /&gt;
* {{value|0}} - player picked a position, &lt;br /&gt;
* {{value|1}} - player clicked ready, &lt;br /&gt;
* {{value|2}} - player pressed ready OR  the game was force-started (player did not click ready, but is now forcibly readied) or &lt;br /&gt;
* {{value|3}} - the player failed to load. &lt;br /&gt;
* {{new|95.0}} the default &#039;failed to choose&#039; start-position is the north-west point of their startbox, or (0,0,0) if they do not have a startbox. &lt;br /&gt;
NB: The order of the parameters changed with the addition of {{var|teamID}} in 104.0. Previouly it was:&lt;br /&gt;
{{var|clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDirectUnitControl&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, playerID&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Determines if this unit can be controlled directly in FPS view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTargetCheck&lt;br /&gt;
|args = attackerID, attackerWeaponNum, attackerWeaponDefID&lt;br /&gt;
|return = {{type|bool}} allowCheck, {{type|bool}} ignoreCheck&lt;br /&gt;
|info = Determines if this weapon can automatically generate targets itself. See also {{xtaglink|Gamedev:WeaponDefs|commandFire}} weaponDef tag. The {{var|ignoreCheck}} return value was added in 99.0 to allow ignoring the callin i.e. running normal engine check for this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTarget&lt;br /&gt;
|args = attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defPriority&lt;br /&gt;
|return = {{type|bool}} allowed, {{type|number}} newPriority&lt;br /&gt;
|info = Controls blocking of a specific target from being considered during a weapon&#039;s periodic auto-targeting sweep. The second return value is the new priority for this target (if you don&#039;t want to change it, return {{var|defPriority}}). Lower priority targets are targeted first.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponInterceptTarget&lt;br /&gt;
|args = interceptorUnitID, interceptorWeaponID, targetProjectileID&lt;br /&gt;
|return = {{type|bool}} allowed&lt;br /&gt;
|info = Controls blocking of a specific intercept target from being considered during an {{xtaglink|Gamedev:WeaponDefs|interceptor}} weapon&#039;s periodic auto-targeting sweep. Only called for {{var|weaponDefIDs}} registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowBuilderHoldFire&lt;br /&gt;
|args = unitID, unitDefID, action&lt;br /&gt;
|return = {{type|bool}} actionAllowed&lt;br /&gt;
|info = {{new|98.0}} {{Sourcelinkhash|5a82d750b89e72024bb0bb62cf05ea257737e0ac}}   Called when a construction unit wants to &amp;quot;use his nano beams&amp;quot;.&amp;lt;br&amp;gt;{{var|action}} is one of following:&lt;br /&gt;
* {{value|-1}} Build&lt;br /&gt;
* {{value|CMD.REPAIR}} Repair&lt;br /&gt;
* {{value|CMD.RECLAIM}} Reclaim&lt;br /&gt;
* {{value|CMD.RESTORE}} Restore&lt;br /&gt;
* {{value|CMD.RESURRECT}} Resurrect&lt;br /&gt;
* {{value|CMD.CAPTURE}} Capture&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Explosion&lt;br /&gt;
|args = weaponDefID, px, py, pz, AttackerID, ProjectileID&lt;br /&gt;
|return = {{type|bool}} noGfx&lt;br /&gt;
|info = Called when an explosion occurs. If it returns {{value|true}} then no graphical effects are drawn by the engine for this explosion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TerraformComplete&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&lt;br /&gt;
|return = {{type|bool}} stop&lt;br /&gt;
|info = Called when pre-building terrain levelling terraforms are completed (c.f. {{xtaglink|Gamedev:UnitDefs|levelGround}}). If the return value is {{value|true}} the current build order is terminated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MoveCtrlNotify&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, data&lt;br /&gt;
|return = {{type|bool}} moveCtrlComplete&lt;br /&gt;
|info = Enable both [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetCollideStop]] and [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetTrackGround]] to enable this call-in, data was supposed to indicate the type of notification but currently never has a value other than {{value|1}} (&amp;quot;unit hit the ground&amp;quot;). The return value determines whether or not the unit should remain script-controlled ({{value|false}}) or return to engine controlled movement ({{value|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvLuaMsg&lt;br /&gt;
|args = msg, playerID&lt;br /&gt;
|info = Receives messages from unsynced sent via [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaRulesMsg]] or [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaUIMsg]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Load&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called after {{name|GamePreload}} and before {{name|GameStart}}. See [[Lua_SaveLoad#Load_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Damage Controllers ===&lt;br /&gt;
For the following callins, in addition to being a regular weapon, {{var|weaponDefID}} may be one of the following:&lt;br /&gt;
* {{value|-1}} - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* {{value|-2}} - ground collision&lt;br /&gt;
* {{value|-3}} - object collision&lt;br /&gt;
* {{value|-4}} - fire damage&lt;br /&gt;
* {{value|-5}} - water damage&lt;br /&gt;
* {{value|-6}} - kill damage&lt;br /&gt;
* {{value|-7}} - crush damage&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitPreDamaged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the unit, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ShieldPreDamaged&lt;br /&gt;
|I recommend looking up the CallIns in Sourcecode, because the Lua-Documentation, generated from the lua handle of them is seriously flawed and not regenerated.&lt;br /&gt;
|Lua-Handler documented from version&lt;br /&gt;
|args = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|https://github.com/spring/spring/blob/d085e297416bd963ec25eaa3dbf0796ba22a3582/rts/Lua/LuaHandleSynced.h#L106&lt;br /&gt;
|Actual CallIn: &lt;br /&gt;
|args = proID, shieldCarrier, boolBounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|return = {{type|bool}} handleCollision&lt;br /&gt;
|info = Called before any engine shield-vs-projectile logic executes. If the return value is {{value|true}} the gadget handles the collision event and the engine does not remove the projectile. If the weapon is a hitscan type ([[Gamedev:WeaponDefs#Tag:weaponType|BeamLaser]] or [[Gamedev:WeaponDefs#Tag:weaponType|LightningCanon]]) then {{var|proID}} is {{value|nil}} and {{var|beamEmitterWeaponNum}} and {{var|beamEmitterUnitID}} are populated instead. The start and hit position arguments are provided from 104.0 onwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeaturePreDamaged&lt;br /&gt;
|args = featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the feature, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11818</id>
		<title>Lua SyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedCtrl&amp;diff=11818"/>
		<updated>2022-09-17T14:15:58Z</updated>

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

		<summary type="html">&lt;p&gt;Beherith: /* Files */&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;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Although Spring can access the filesystem directly (via os module) it is more common that you&lt;br /&gt;
would want to access files included with your game or Spring. Trouble is, most of these files are&lt;br /&gt;
compressed into archives (.sdz/.sd7) so random access would generally be a difficult procedure.&lt;br /&gt;
Fortunately, the Spring Lua system automatically provides access to mod and base files via the VFS module.&lt;br /&gt;
&lt;br /&gt;
The VFS module doesn&#039;t simply open archives though. What it does is map your game files, game &lt;br /&gt;
dependencies and Spring content onto a virtual file tree. All archives start from the &#039;roots&#039; of the tree&lt;br /&gt;
and share the same virtual space, meaning that if two or more archives contain the same resource&lt;br /&gt;
file name the resources overlap and only one of the files will be retrieved. Overlapping directories&lt;br /&gt;
on the other hand are merged so the resulting virtual directory contains the contents of both. Here is&lt;br /&gt;
an example of how this works:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Archive 1 (games/mygame.sd7)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
models&amp;lt;br&amp;gt;&lt;br /&gt;
|__ model1.mdl&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Archive 2 (base/springcontent.sdz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture2.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture3.png&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture2.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture3.png&amp;lt;br&amp;gt;&lt;br /&gt;
models&amp;lt;br&amp;gt;&lt;br /&gt;
|__ model1.mdl&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This raises the question: If both archives have a texture1.png then which texture1.png is retreived&lt;br /&gt;
via the VFS? The answer depends on the order the archives are loaded and the VFS mode (more on&lt;br /&gt;
modes below). Generally however, each archive loaded overrides any archives loaded&lt;br /&gt;
before it. The standard order of loading (from first to last) is:&lt;br /&gt;
&lt;br /&gt;
#  The main Spring/ game directory.&lt;br /&gt;
#  The automatic dependencies springcontent.sdz and maphelper.sdz.&lt;br /&gt;
#  Dependencies listed in your modinfo.lua (or modinfo.tdf), in the order listed.&lt;br /&gt;
#  Your mod archive.&lt;br /&gt;
&lt;br /&gt;
= Modes =&lt;br /&gt;
&lt;br /&gt;
These modes are constants passed to VFS.Include() and friends to control the order that archives are&lt;br /&gt;
searched for a given file. They are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW&#039;&#039;&#039; Only select uncompressed files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MOD&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MAP&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.BASE&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MENU&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP&#039;&#039;&#039;   Only select compressed files (.sdz,.sd7).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_FIRST&#039;&#039;&#039;  Try uncompressed files first, then compressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_FIRST&#039;&#039;&#039;  Try compressed files first, then uncompressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.RAW)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.ZIP.)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/spring/spring/blob/develop/rts/System/FileSystem/VFSModes.h&lt;br /&gt;
&lt;br /&gt;
= Files =&lt;br /&gt;
&#039;&#039;&#039;VFS.Include&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(if enviroment=nil then use current one)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, table enviroment = nil [, number mode ] ] ) -&amp;gt;&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The environment arg sets the global environment (see generic lua refs). In almost all cases, this should be left nil to preserve Springs default.  &lt;br /&gt;
&lt;br /&gt;
If nil then the env will be _G (global environment) If the optional env argument is provided any non-local variables and functions defined in&lt;br /&gt;
filename.lua are then accessable via env or _G. Vise-versa, any variables defined in env prior to&lt;br /&gt;
passing to VFS.Include are available to code in the included file. Code running in filename.lua will&lt;br /&gt;
see the contents of env in place of the normal _G environment. &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;This loads and compiles the lua code from a file in the VFS. The path is relative to the main Spring directory, e.g. VFS.Include(&#039;LuaUI/includes/filename.lua&#039;, nil, [vfsmode]) &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;VFS modes are single char strings and can be concatenated; doing specifies an order of preference for the mode (=location) from which to include files.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.LoadFile&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; nil | string data&lt;br /&gt;
&lt;br /&gt;
This is used for loading raw text data, as it will not execute the file, like VFS.Include does, just returns a string of the file contents. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.FileExists&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; boolean&lt;br /&gt;
&amp;lt;span class=note&amp;gt;example usage: if VFS.FileExists(&amp;quot;maps/Castles.sdz&amp;quot;) then ... end &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DirList&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot; [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string filename, ... }&lt;br /&gt;
&#039;&#039;&#039;VFS.SubDirs&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot;, [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string subdir1, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAvailableAIs&#039;&#039;&#039;&lt;br /&gt;
  ( [ string gameName] [, string mapName ] )&lt;br /&gt;
    -&amp;gt; { ai1, ai2, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Gets a list of all Spring AIs. The optional gameName and mapName parameters can be used to include game/map specific LuaAIs in the list.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UseArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ], lua_function [, arg1 [,arg2 ]] )&lt;br /&gt;
    -&amp;gt; result1,result2,... of the given lua_function&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Loads an archive &#039;&#039;&#039;temporarely&#039;&#039;&#039; in the VFS and then runs the given lua_function,&amp;lt;br&amp;gt;which can make usage of the files in the archive.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;, [string checksum of archive] )&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Permanently loads an archive into the VFS (to load zipped music collections etc.). &amp;lt;br&amp;gt; Does nothing if the archive is already loaded in the VFS (won&#039;t reload even if there are &amp;lt;br&amp;gt; changes made to the archive). If checksum is given it checks if the to be loaded file is correct,&amp;lt;br&amp;gt;if not then it won&#039;t load it and return false.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnmapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 98.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;)&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Removes an already loaded archive (see VFS.MapArchive)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.CompressFolder&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;folderPath&amp;quot; [, string &amp;quot;archiveType&amp;quot; ] [, string &amp;quot;compressedFilePath&amp;quot; ] &amp;lt;br&amp;gt; [, bool includeFolder ] [, number mode ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Compresses the specified folder. &amp;lt;br&amp;gt;archiveType defines the compression type which can currently be only &amp;quot;zip&amp;quot; &amp;lt;br&amp;gt;includeFolder specifies whether the archive should have the specified folder as root (defaults to false) &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetFileAbsolutePath&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; absPath | nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveContainingFile&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; archiveNameWithVersion | nil&lt;br /&gt;
&lt;br /&gt;
= Generic hash =&lt;br /&gt;
&#039;&#039;&#039;VFS.CalculateHash&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string input, number hashType)&lt;br /&gt;
    -&amp;gt; string md5hash&lt;br /&gt;
&lt;br /&gt;
Calculates hash (in base64 form) of a given string (with md5 support initially). Note supplying 0 (MD5) as hashType is mandatory&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetMaps&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string mapName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetGames&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string gameName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAllArchives&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetLoadedArchives&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchivePath&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string archivePathOnDisk&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetNameFromRapidTag&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string rapidTag ) -&amp;gt; string archiveName&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.HasArchive&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveInfo&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) - &amp;gt;&lt;br /&gt;
     {        &lt;br /&gt;
          name = string,&lt;br /&gt;
          shortname = string,&lt;br /&gt;
          version = string,&lt;br /&gt;
          mutator = string,&lt;br /&gt;
          game = string,&lt;br /&gt;
          shortgame = string,&lt;br /&gt;
          description = string,&lt;br /&gt;
          mapfile = string,&lt;br /&gt;
          modtype = number,     &lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;modtype values:1=primary, 0=hidden, 3=map&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveChecksum&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string singleArchiveChecksum, string completeArchiveChecksum&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveDependencies&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveReplaces&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DownloadArchive&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( name, category ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Category must be one of: map, game, engine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.AbortDownload&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( id ) -&amp;gt; boolean foundAndRemoved&lt;br /&gt;
&lt;br /&gt;
Additional functions are available as part of the [[Lua_UnsyncedCtrl#.28Virtual-.29FileSystem|unsynced ctrl]].&lt;br /&gt;
&lt;br /&gt;
= Packing =&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot; style=&amp;quot;font-size:110%&amp;quot;&amp;gt;The Pack- and Unpack-functions are used to convert numbers-&amp;gt;strings and strings-&amp;gt;numbers.&lt;br /&gt;
So you can read a binary file and then convert the received strings back to numbers and the other way around. Also you can use it in combination with the SendLuaXYZMsg-functions.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( number arg1, number arg2, number arg3, ... )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( {[1]=number,[2]=number,..} )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackX( string &amp;quot;binary&amp;quot; [, number position = 1] [, number count] )&#039;&#039;&#039;&lt;br /&gt;
  -&amp;gt; number | table { [1]=number,[2]=number,.. }&lt;br /&gt;
&lt;br /&gt;
= Zlib =&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibCompress&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;uncompressedStr&amp;quot; )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;compressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibDecompress&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;available in synced, too!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;compressedStr&amp;quot; [, number uncompressed size = 65500] )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;uncompressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10814</id>
		<title>Lua:Callins</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10814"/>
		<updated>2022-08-02T20:49:02Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Units */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua Callins =&lt;br /&gt;
This page is future looking to unified widget/gadget (aka &amp;quot;addon&amp;quot;) handler, which may yet be some way off, c.f. the [https://github.com/spring/spring/blob/ebb704e008f6ea645947d07be1cfcc272af0428f/doc/changelog.txt#L71 changelog].&lt;br /&gt;
&lt;br /&gt;
Related Sourcecode :&lt;br /&gt;
[https://github.com/spring/spring/blob/d9b3927a528a876b9ab4042771e82b050267572a/rts/Lua/LuaHandle.cpp https://github.com/spring/spring/rts/Lua/LuaHandle.cpp]&lt;br /&gt;
&lt;br /&gt;
For now, to use these addons in a widget, replace addon with widget and, for a gadget, replace addon with gadget. For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
        ...  &lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some functions may differ between (synced) gadget and widgets; those are in the [[#Synced_-_Unsynced_Shared]] section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: maroon;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention:&#039;&#039;&#039;&amp;lt;/span&amp;gt; some callins will only work on the unsynced portion of the gadget. Due to the type-unsafe nature of lua parsing, those callins not firing up might be hard to trace. This document will be continuously updated to properly alert about those situations.&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Initialize&lt;br /&gt;
|info = Called when the addon is (re)loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Shutdown&lt;br /&gt;
|info = Called when the addon or the game is shutdown.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsynced Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DefaultCommand&lt;br /&gt;
|args = type, id&lt;br /&gt;
|return = {{type|number}} cmdID&lt;br /&gt;
|info = Used to set the default command when a unit is selected. First parameter is the type of the object pointed at (either &amp;quot;unit or &amp;quot;feature&amp;quot;) and the second is its {{var|unitID}} or {{var|featureID}} respectively. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandNotify&lt;br /&gt;
|args = cmdID, cmdParams, cmdOptions&lt;br /&gt;
|return = {{type|bool}} removeCmd&lt;br /&gt;
|info = Called when a command is issued. Returning {{value|true}} deletes the command and does not send it through the network.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandsChanged&lt;br /&gt;
|args = None&lt;br /&gt;
|return = ?&lt;br /&gt;
|info = Called when the command descriptions changed, e.g. when selecting or deselecting a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = WorldTooltip&lt;br /&gt;
|args = ttType, data1, data2, data3&lt;br /&gt;
|return = {{type|string}} newTooltip&lt;br /&gt;
|info = The parameters can be {{value|&amp;quot;unit&amp;quot;}}, {{var|unitID}}; {{value|&amp;quot;feature&amp;quot;}}, {{var|featureID}}; {{value|&amp;quot;ground&amp;quot;}}, {{var|posX}}, {{var|posY}}, {{var|posZ}} or {{value|&amp;quot;selection&amp;quot;}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnsyncedHeightMapUpdate&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = Called when the unsynced copy of the height-map is altered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameProgress&lt;br /&gt;
|args = serverFrameNum&lt;br /&gt;
|info = Called every 60 frames, calculating delta between GameFrame and GameProgress. Can give an ETA about catching up with simulation for mid-game join players.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameSetup&lt;br /&gt;
|args =  state, ready, playerStates&lt;br /&gt;
|return = {{type|bool}} success, {{type|bool}} newReady&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = SunChanged&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AddConsoleLine&lt;br /&gt;
|args = msg, priority&lt;br /&gt;
|info = Called when text is entered into the console (e.g. Spring.Echo).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvSkirmishAIMessage&lt;br /&gt;
|args = aiTeam, dataStr&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvFromSynced&lt;br /&gt;
|args = ...&lt;br /&gt;
|info = Receives data sent via [[Lua_System#Synced|SendToUnsynced]] callout.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Save&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called when a chat command &#039;/save&#039; or &#039;/savegame&#039; is received. The single argument is a userdatum representing the savegame zip file. See [[Lua_SaveLoad#Save_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = LoadProgress&lt;br /&gt;
|args = message, replaceLastLine&lt;br /&gt;
|info = Only available to LuaIntro.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GroupChanged&lt;br /&gt;
|args = groupID&lt;br /&gt;
|info = Called when a unit is added to or removed from a control group. Currently implemented for widgets only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ConfigureLayout&lt;br /&gt;
|args = ???&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Input ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = IsAbove&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|bool}} isAbove&lt;br /&gt;
|info = Called every Update. Must return {{value|true}} for {{name|Mouse*}} events and {{name|GetToolTip}} to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GetTooltip&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = Called when {{name|IsAbove}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyPress&lt;br /&gt;
|args = key, mods, isRepeat&lt;br /&gt;
|return = {{type|bool}} becomeOwner&lt;br /&gt;
|info = Called repeatedly when a key is pressed down. If you want an action to occur only once check for {{var|1=isRepeat == {{value|false}}}}. The {{var|mods}} parameter is a {{type|table}}, with keys {{value|&amp;quot;alt&amp;quot;}}, {{value|&amp;quot;ctrl&amp;quot;}}, {{value|&amp;quot;meta&amp;quot;}} and {{value|&amp;quot;shift&amp;quot;}} each having a boolean value. Return {{value|true}} if you don&#039;t want other callins or the engine to also receive this keypress. A list of key codes can be seen at the [https://wiki.libsdl.org/SDLKeycodeLookup SDL wiki].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyRelease&lt;br /&gt;
|args = key&lt;br /&gt;
|return = {{type|bool}}&lt;br /&gt;
|info = Called when the key is released.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TextInput&lt;br /&gt;
|args = utf8char&lt;br /&gt;
|info = Called whenever a key press results in text input. Introduced in 97.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = JoystickEvent&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MousePress&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = {{type|bool}} becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is pressed. The {{var|button}} parameter supports up to 7 buttons. Must return {{value|true}} for {{name|MouseRelease}} and other functions to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseRelease&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is released. Please note that in order to have Spring call {{name|MouseRelease}}, you need to have a {{name|MousePress}} call-in in the same addon that returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseWheel&lt;br /&gt;
|args = up, value&lt;br /&gt;
|info = Called when the mouse wheel is moved. The parameters indicate the direction and amount of travel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseMove&lt;br /&gt;
|args = x, y, dx, dy, button&lt;br /&gt;
|info = Called when the mouse is moved. The {{var|dx}} and {{var|dy}} parameters indicate the distance travelled, whereas the first two indicate the final position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Players ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerChanged&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a player&#039;s status changes e.g. becoming a spectator.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerAdded&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a new player joins the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerRemoved&lt;br /&gt;
|args = playerID, reason&lt;br /&gt;
|info = Called whenever a player is removed from the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadStarted&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download is started via [[Lua_VFS#Archives|VFS.DownloadArchive]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFinished&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download finishes successfully.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFailed&lt;br /&gt;
|args = id, errorID&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download fails to complete.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadProgress&lt;br /&gt;
|args = id, downloaded, total&lt;br /&gt;
|info = Called incrementally during a [[Pr-downloader]] download.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Drawing ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ViewResize&lt;br /&gt;
|args = viewSizeX, viewSizeY&lt;br /&gt;
|info = Called whenever the window is resized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Update&lt;br /&gt;
|args = dt&lt;br /&gt;
|info = Called for every draw frame (including when the game is paused) and at least once per sim frame except when catching up. The parameter is the time since the last update. }}&lt;br /&gt;
&lt;br /&gt;
=== Draw* Functions ===&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Avoid doing heavy calculations inside these callins; ideally, do the calculations elsewhere and use Draw callins only for drawing.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|info = Doesn&#039;t render to screen! Use this callin to update textures, shaders, etc. Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreParticles&lt;br /&gt;
|info = ??? {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreUnit&lt;br /&gt;
|info = Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorld&lt;br /&gt;
|info = Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldShadow&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldReflection&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldRefraction&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreForward&lt;br /&gt;
|info = Runs at the start of the forward pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreDeferred&lt;br /&gt;
|info = Runs at the start of the deferred pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPostDeferred&lt;br /&gt;
|info = This runs at the end of its respective deferred pass and allows proper frame compositing (with ground flashes/decals/foliage/etc, which are drawn between it and [[#API:DrawWorldPreUnit|{{name|DrawWorldPreUnit}}]]) via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnitsPostDeferred&lt;br /&gt;
|info = Runs at the end of the unit deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeaturesPostDeferred&lt;br /&gt;
|info = Runs at the end of the feature deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreen&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = ??? Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenEffects&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = Where {{var|vsx}}, {{var|vsy}} are screen coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenPost&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = {{new|104.0}} Similar to {{name|DrawScreenEffects}}, this can be used to alter the contents of a frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawLoadScreen&lt;br /&gt;
|info = {{new|95.0}} Only available to LuaIntro, draws custom load screens.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimap&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimapBackground&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Object Rendering ===&lt;br /&gt;
For the following calls {{var|drawMode}} can be one of the following, {{var|1=notDrawing = {{value|0}}}}, {{var|1=normalDraw = {{value|1}}}}, {{var|1=shadowDraw = {{value|2}}}}, {{var|1=reflectionDraw = {{value|3}}}}, {{var|1=refractionDraw = {{value|4}}}}, and finally {{var|1=gameDeferredDraw = {{value|5}}}} which was added in 102.0.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnit&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of units, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeature&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of features, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawShield&lt;br /&gt;
|args = unitID, weaponID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of [[Gamedev:WeaponDefs#Shield_(WeaponType)|shields]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawProjectile&lt;br /&gt;
|args = projectileID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of weapon (&amp;amp; other) projectiles, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unsynced Menu Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDraw&lt;br /&gt;
|return = {{type|bool}} allowDraw&lt;br /&gt;
|info = Enables Draw{Genesis,Screen,ScreenPost} callins if {{value|true}} is returned, otherwise they are called once every 30 seconds. Only active when a game isn&#039;t running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateMenu&lt;br /&gt;
|info = Called whenever LuaMenu is on with no game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateGame&lt;br /&gt;
|info = Called whenever LuaMenu is on with a game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced - Unsynced Shared ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GotChatMsg&lt;br /&gt;
|args = msg, player&lt;br /&gt;
|info = Called when a player issues a UI command e.g. types {{var|/foo}} or {{var|/luarules foo}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameID&lt;br /&gt;
|args = gameID&lt;br /&gt;
|info = Called once to deliver the {{var|gameID}}. As of 101.0+ the string is encoded in hex.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePaused&lt;br /&gt;
|info = Called when the game is paused.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|args = winningAllyTeams&lt;br /&gt;
|info = The parameter is a {{type|table}} list of winning allyTeams, if empty the game result was undecided (like when dropping from an host).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameFrame&lt;br /&gt;
|args = frame&lt;br /&gt;
|info = Called for every game simulation frame (30 per second). Starts at frame {{value|0}} in 101.0+ and {{value|1}} in previous versions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePreload&lt;br /&gt;
|info = Called before the 0 gameframe. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameStart&lt;br /&gt;
|info = Called upon the start of the game. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamChanged&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamDied&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = Called when a team dies (see [[Lua_SyncedCtrl#Game_End|Spring.KillTeam]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCreated&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, builderID&lt;br /&gt;
|info = Called at the moment the unit is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFinished&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called at the moment the unit is completed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFromFactory&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, factID, factDefID, userOrders&lt;br /&gt;
|info = Called when a factory finishes construction of a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitReverseBuilt&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a living unit becomes a nanoframe again.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitGiven&lt;br /&gt;
|args = unitID, unitDefID, newTeam, oldTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called after {{name|UnitTaken}} and in that moment unit is assigned to the &#039;&#039;&#039;newTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitTaken&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called before {{name|UnitGiven}} and in that moment unit is still assigned to the &#039;&#039;&#039;oldTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDamaged&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is damaged (after {{name|UnitPreDamaged}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RenderUnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called just before a unit is invalid, after it finishes its death animation. {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitStunned&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, stunned&lt;br /&gt;
|info = Called when a unit changes its stun status. {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnitCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when two units collide. Both units must be registered with [[Lua_System#Synced|Script.SetWatchUnit]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFeatureCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when a unit collides with a feature. The unit must be registered with [[Lua_System#Synced|Script.SetWatchUnit]] and the feature registered with [[Lua_System#Synced|Script.SetWatchFeature]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitHarvestStorageFull&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit&#039;s harvestStorage is full (according to its unitDef&#039;s entry).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called after when a unit accepts a command, after {{name|AllowCommand}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCmdDone&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called when a unit completes a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLoaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is loaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnloaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is unloaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitExperience&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, experience, oldExperience&lt;br /&gt;
|info = Called when a unit gains experience greater or equal to the minimum limit set by calling [[Lua_SyncedCtrl#Other|Spring.SetExperienceGrade]]. Should be called more reliably with small values of experience grade in 104.0+.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitIdle&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit is idle (empty command queue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit cloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDecloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit decloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoveFailed&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = StockpileChanged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&lt;br /&gt;
|info = Called when a units stockpile of weapons increases or decreases. See {{xtaglink|Gamedev:WeaponDefs|stockpile}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters LOS of an allyteam. Its called after the unit is in LOS, so you can query that unit. The allyTeam is who&#039;s LOS the unit entered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves LOS of an allyteam. For widgets, this one is called just before the unit leaves los, so you can still get the position of a unit that left los. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters radar of an allyteam. Also called when a unit enters LOS without any radar coverage. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves radar of an allyteam. Also called when a unit leaves LOS without any radar coverage. For widgets, this is called just after a unit leaves radar coverage, so widgets cannot get the position of units that left their radar. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitSeismicPing&lt;br /&gt;
|args = x, y, z, strength, allyTeam, unitID, unitDefID&lt;br /&gt;
|info = Called when a unit emits a seismic ping. See {{xtaglink|Gamedev:UnitDefs|seismicSignature}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureCreated&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDamaged&lt;br /&gt;
|args =  featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a feature is damaged.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDestroyed&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Projectiles ===&lt;br /&gt;
The following Callins are only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileCreated&lt;br /&gt;
|args = proID, proOwnerID, weaponDefID&lt;br /&gt;
|info = Called when the projectile is created. Note that {{var|weaponDefID}} is missing if the projectile is spawned as part of a burst, but [[Lua_SyncedRead#Projectiles|Spring.GetProjectileDefID]] and [[Lua_SyncedRead#Projectiles|Spring.GetProjectileName]] still work in callin scope using {{var|proID}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileDestroyed&lt;br /&gt;
|args = proID&lt;br /&gt;
|info = Called when the projectile is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced Only ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandFallback&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&lt;br /&gt;
|return = {{type|bool}} used, {{type|bool}} finished&lt;br /&gt;
|info = Called when the unit reaches an unknown command in its queue (i.e. one not handled by the engine). If no addon returns {{var|used}} as {{value|true}} the command is dropped, if an addon returns {{value|true}}, {{value|true}} the command is removed because it&#039;s done, with {{value|true}}, {{value|false}} it&#039;s kept in the queue and {{name|CommandFallback}} gets called again on the next slowupdate.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when the command is given, before the unit&#039;s queue is altered. The return value is whether it should be let into the queue. The queue remains untouched when a command is blocked, whether it would be queued or replace the queue.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitCreation&lt;br /&gt;
|args = unitDefID, builderID, builderTeam, x, y, z, facing&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before unit is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitTransfer&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam, capture&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit is transferred to a different team, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitBuildStep&lt;br /&gt;
|args = builderID, builderTeam, unitID, unitDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit progresses its build percentage, the boolean return value determines whether or not the build makes progress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureCreation&lt;br /&gt;
|args = featureDefID, teamID, x, y, z&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before feature is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureBuildStep&lt;br /&gt;
|args = builderID, builderTeam, featureID, featureDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a feature changes its build percentage, the boolean return value determines whether or not the change is permitted. Note that this is also called for resurrecting features, and for refilling features with resources before resurrection. On reclaim the part values are negative, and on refill and ressurect they are positive. Part is the percentage the feature be built or reclaimed per frame. Eg. for a 30 workertime builder, that&#039;s a build power of 1 per frame. For a 50 buildtime feature reclaimed by this builder, part will be 100/-50(/1) = -2%, or -0.02 numerically.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceLevel&lt;br /&gt;
|args = teamID, res, level&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when a team sets the sharing level of a resource, the boolean return value determines whether or not the sharing level is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceTransfer&lt;br /&gt;
|args = oldTeamID, newTeamID, res, amount&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before resources are transferred between players, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowStartPosition&lt;br /&gt;
|args = playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = {{var|clamped{X,Y,Z}}} are the coordinates clamped into start-boxes, {{var|raw}} is where player tried to place their marker. The {{var|readyState}} can be any one of &lt;br /&gt;
* {{value|0}} - player picked a position, &lt;br /&gt;
* {{value|1}} - player clicked ready, &lt;br /&gt;
* {{value|2}} - player pressed ready OR  the game was force-started (player did not click ready, but is now forcibly readied) or &lt;br /&gt;
* {{value|3}} - the player failed to load. &lt;br /&gt;
* {{new|95.0}} the default &#039;failed to choose&#039; start-position is the north-west point of their startbox, or (0,0,0) if they do not have a startbox. &lt;br /&gt;
NB: The order of the parameters changed with the addition of {{var|teamID}} in 104.0. Previouly it was:&lt;br /&gt;
{{var|clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDirectUnitControl&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, playerID&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Determines if this unit can be controlled directly in FPS view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTargetCheck&lt;br /&gt;
|args = attackerID, attackerWeaponNum, attackerWeaponDefID&lt;br /&gt;
|return = {{type|bool}} allowCheck, {{type|bool}} ignoreCheck&lt;br /&gt;
|info = Determines if this weapon can automatically generate targets itself. See also {{xtaglink|Gamedev:WeaponDefs|commandFire}} weaponDef tag. The {{var|ignoreCheck}} return value was added in 99.0 to allow ignoring the callin i.e. running normal engine check for this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTarget&lt;br /&gt;
|args = attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defPriority&lt;br /&gt;
|return = {{type|bool}} allowed, {{type|number}} newPriority&lt;br /&gt;
|info = Controls blocking of a specific target from being considered during a weapon&#039;s periodic auto-targeting sweep. The second return value is the new priority for this target (if you don&#039;t want to change it, return {{var|defPriority}}). Lower priority targets are targeted first.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponInterceptTarget&lt;br /&gt;
|args = interceptorUnitID, interceptorWeaponID, targetProjectileID&lt;br /&gt;
|return = {{type|bool}} allowed&lt;br /&gt;
|info = Controls blocking of a specific intercept target from being considered during an {{xtaglink|Gamedev:WeaponDefs|interceptor}} weapon&#039;s periodic auto-targeting sweep. Only called for {{var|weaponDefIDs}} registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowBuilderHoldFire&lt;br /&gt;
|args = unitID, unitDefID, action&lt;br /&gt;
|return = {{type|bool}} actionAllowed&lt;br /&gt;
|info = {{new|98.0}} {{Sourcelinkhash|5a82d750b89e72024bb0bb62cf05ea257737e0ac}}   Called when a construction unit wants to &amp;quot;use his nano beams&amp;quot;.&amp;lt;br&amp;gt;{{var|action}} is one of following:&lt;br /&gt;
* {{value|-1}} Build&lt;br /&gt;
* {{value|CMD.REPAIR}} Repair&lt;br /&gt;
* {{value|CMD.RECLAIM}} Reclaim&lt;br /&gt;
* {{value|CMD.RESTORE}} Restore&lt;br /&gt;
* {{value|CMD.RESURRECT}} Resurrect&lt;br /&gt;
* {{value|CMD.CAPTURE}} Capture&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Explosion&lt;br /&gt;
|args = weaponDefID, px, py, pz, AttackerID, ProjectileID&lt;br /&gt;
|return = {{type|bool}} noGfx&lt;br /&gt;
|info = Called when an explosion occurs. If it returns {{value|true}} then no graphical effects are drawn by the engine for this explosion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TerraformComplete&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&lt;br /&gt;
|return = {{type|bool}} stop&lt;br /&gt;
|info = Called when pre-building terrain levelling terraforms are completed (c.f. {{xtaglink|Gamedev:UnitDefs|levelGround}}). If the return value is {{value|true}} the current build order is terminated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MoveCtrlNotify&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, data&lt;br /&gt;
|return = {{type|bool}} moveCtrlComplete&lt;br /&gt;
|info = Enable both [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetCollideStop]] and [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetTrackGround]] to enable this call-in, data was supposed to indicate the type of notification but currently never has a value other than {{value|1}} (&amp;quot;unit hit the ground&amp;quot;). The return value determines whether or not the unit should remain script-controlled ({{value|false}}) or return to engine controlled movement ({{value|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvLuaMsg&lt;br /&gt;
|args = msg, playerID&lt;br /&gt;
|info = Receives messages from unsynced sent via [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaRulesMsg]] or [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaUIMsg]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Load&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called after {{name|GamePreload}} and before {{name|GameStart}}. See [[Lua_SaveLoad#Load_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Damage Controllers ===&lt;br /&gt;
For the following callins, in addition to being a regular weapon, {{var|weaponDefID}} may be one of the following:&lt;br /&gt;
* {{value|-1}} - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* {{value|-2}} - ground collision&lt;br /&gt;
* {{value|-3}} - object collision&lt;br /&gt;
* {{value|-4}} - fire damage&lt;br /&gt;
* {{value|-5}} - water damage&lt;br /&gt;
* {{value|-6}} - kill damage&lt;br /&gt;
* {{value|-7}} - crush damage&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitPreDamaged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the unit, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ShieldPreDamaged&lt;br /&gt;
|I recommend looking up the CallIns in Sourcecode, because the Lua-Documentation, generated from the lua handle of them is seriously flawed and not regenerated.&lt;br /&gt;
|Lua-Handler documented from version&lt;br /&gt;
|args = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|https://github.com/spring/spring/blob/d085e297416bd963ec25eaa3dbf0796ba22a3582/rts/Lua/LuaHandleSynced.h#L106&lt;br /&gt;
|Actual CallIn: &lt;br /&gt;
|args = proID, shieldCarrier, boolBounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|return = {{type|bool}} handleCollision&lt;br /&gt;
|info = Called before any engine shield-vs-projectile logic executes. If the return value is {{value|true}} the gadget handles the collision event and the engine does not remove the projectile. If the weapon is a hitscan type ([[Gamedev:WeaponDefs#Tag:weaponType|BeamLaser]] or [[Gamedev:WeaponDefs#Tag:weaponType|LightningCanon]]) then {{var|proID}} is {{value|nil}} and {{var|beamEmitterWeaponNum}} and {{var|beamEmitterUnitID}} are populated instead. The start and hit position arguments are provided from 104.0 onwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeaturePreDamaged&lt;br /&gt;
|args = featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the feature, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_MathExtra&amp;diff=11361</id>
		<title>Lua MathExtra</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_MathExtra&amp;diff=11361"/>
		<updated>2022-08-01T11:42:27Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Additional math functions */  move to luacallout format&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;
= Additional math functions=&lt;br /&gt;
&lt;br /&gt;
New in Engine Version 0.95 and up. &lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = clamp&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} min&lt;br /&gt;
|arg3 = {{type|number}} max&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} clamped&lt;br /&gt;
|info = Returns x clamped to min and max boundaries.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = diag&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} x2&lt;br /&gt;
|arg3 = {{type|number}} x3, ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} diagonal&lt;br /&gt;
|info = Returns the length of the diagonal of an n-dimensional box (or the length of an n-component vector). Rather quick method that does not handle intermediate overflows/underflows nor is made for numerical stability.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = erf&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 =&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} erf&lt;br /&gt;
|info = Returns [http://en.wikipedia.org/wiki/Error_function erf](x).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = hypot&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}} sqrt(x*x+y*y)&lt;br /&gt;
|info = Returns the length of hypotenuse of right angle triangle with sides x and y, equivalent to sqrt(x*x + y*y), but has better numerical stability and internally handles intermediate overflows/underflows, but is also slower.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = mix&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} a&lt;br /&gt;
|arg4 =&lt;br /&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+(y-x)*a)&lt;br /&gt;
|info = Returns linear interpolation between x and y with ratio a (x+(y-x)*a).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = round&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} decimals&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} rounded&lt;br /&gt;
|info = Returns x rounded to n decimals, if n is omitted or &amp;lt;=0, rounds to nearest integer. Note that Spring&#039;s Lua interpreter uses 32-bit floats for all numbers so max. precision is ~7 decimal digits.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = sgn&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} sign&lt;br /&gt;
|info = Returns 0 if x ==0, 1 if x &amp;gt; 0, -1 if x &amp;lt; 0 [http://en.wikipedia.org/wiki/Sign_function sgn](x).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = smoothstep&lt;br /&gt;
|arg1 = {{type|number}} edge0&lt;br /&gt;
|arg2 = {{type|number}} edge1&lt;br /&gt;
|arg3 = {{type|number}} x&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} smoothstep&lt;br /&gt;
|info = Returns [http://en.wikipedia.org/wiki/Smoothstep smoothstep](edge0, edge1, v). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_BitOps&amp;diff=11132</id>
		<title>Lua BitOps</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_BitOps&amp;diff=11132"/>
		<updated>2022-08-01T11:28:59Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Bit Operators */  move to luacallout format&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;
== Bit Operators ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = bit_and&lt;br /&gt;
|arg1 =  {{type|number}} a1&lt;br /&gt;
|arg2 =  {{type|number}} a2 , ...&lt;br /&gt;
|arg3 =  &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} i&lt;br /&gt;
|info = Returns the bitwise AND of all arguments. Only use up to 24 bit integers. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = bit_or&lt;br /&gt;
|arg1 =  {{type|number}} a1&lt;br /&gt;
|arg2 =  {{type|number}} a2 , ... &lt;br /&gt;
|arg3 =  &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} i&lt;br /&gt;
|info = Returns the bitwise OR of all arguments. Only use up to 24 bit integers. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = bit_xor&lt;br /&gt;
|arg1 =  {{type|number}} a1&lt;br /&gt;
|arg2 =  {{type|number}} a2 , ... &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} i&lt;br /&gt;
|info = Returns the bitwise XOR of all arguments. Only use up to 24 bit integers. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = bit_inv&lt;br /&gt;
|arg1 =  {{type|number}} a1&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} i&lt;br /&gt;
|info = Returns the bitwise NOT of the 24 bit integer argument. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = math.&lt;br /&gt;
|name = bit_bits&lt;br /&gt;
|arg1 =  {{type|number}} a1&lt;br /&gt;
|arg2 =  {{type|number}} a2 , ... &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} i&lt;br /&gt;
|info = Set each of the bits of a 24 bit integer. Returns result = result OR (1 &amp;lt;&amp;lt; a1) OR (1 &amp;lt;&amp;lt; a2) OR ...;) &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 -- Note: there are no bit shift. Use those Lua functions instead for 24 bits bitshift&lt;br /&gt;
 -- 24 bits because only the 24 bits of the mantissa can be easily used in a 32 bit float&lt;br /&gt;
 -- bitshift functions (&amp;lt;&amp;lt;, &amp;gt;&amp;gt; equivalent)&lt;br /&gt;
&lt;br /&gt;
 -- shift left&lt;br /&gt;
 local function lsh(value,shift)&lt;br /&gt;
     return (value*(2^shift)) % 2^24&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
 -- shift right&lt;br /&gt;
 local function rsh(value,shift)&lt;br /&gt;
     return math.floor(value/2^shift) % 2^24&lt;br /&gt;
 end&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_GLSL_Api&amp;diff=11327</id>
		<title>Lua GLSL Api</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_GLSL_Api&amp;diff=11327"/>
		<updated>2022-06-03T11:15:24Z</updated>

		<summary type="html">&lt;p&gt;Beherith: &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;
These functions are ONLY available if the graphics adapter supports GLSL.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Please test in your scripts if one of them exists before you use them. In headless mode, the gl. callouts are nil.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateShader&lt;br /&gt;
|arg1 = {{type|table}} shaderParams&lt;br /&gt;
|arg2 =&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} shaderID &lt;br /&gt;
|info = Create a shader from shaderParams table:&lt;br /&gt;
&lt;br /&gt;
  ({[ vertex   = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tcs      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tes      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ geometry = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ fragment = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ uniform       = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformInt    = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformFloat  = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformMatrix = { uniformName = number value, ...} ,]&lt;br /&gt;
    [ geoInputType = number inType,]&lt;br /&gt;
    [ geoOutputType = number outType,]&lt;br /&gt;
    [ geoOutputVerts = number maxVerts,]&lt;br /&gt;
    [ definitions = &amp;quot;string of shader #defines&amp;quot;, ]&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Vertex&amp;quot; or vertex-shader is your GLSL-Code as string, its written in a C-Dialect. This shader is busy deforming the geometry of a unit but it can not create new polygons. Use it for waves, wobbling surfaces etc.&lt;br /&gt;
 &lt;br /&gt;
* The &amp;quot;Geometry&amp;quot; or Geometry-shader can create new vertices and vertice-stripes from points. &lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TCS&amp;quot; or Tesselation Control Shader controls how much tessellation a particular patch gets; it also defines the size of a patch, thus allowing it to augment data. It can also filter vertex data taken from the vertex shader. The main purpose of the TCS is to feed the tessellation levels to the Tessellation primitive generator stage, as well as to feed patch data (as its output values) to the Tessellation Evaluation Shader stage. TCS shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TES&amp;quot; or Tesselation Evaluation Shader takes the abstract patch generated by the tessellation primitive generation stage, as well as the actual vertex data for the entire patch, and generates a particular vertex from it. Each TES invocation generates a single vertex. It can also take per-patch data provided by the Tessellation Control Shader. TES shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Fragment&amp;quot; or Fragment-shader (sometimes called pixel-Shader) is post processing the allready rendered picture (for example drawing stars on the sky)- remember textures are not always 2 dimensional pictures. They can contain information about the depth, or the third value marks areas and the strength at which these are processed.&lt;br /&gt;
&lt;br /&gt;
* The Uniforms are the values, you send along with the shader-program. To use them in the shader-program declare them like this: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform float frame;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* From 101.0 onwards, the engine will automatically fill in an appropriately named uniform for team colour if it is declared;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform vec4 teamColor;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Deletes a shader identified by shaderID&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ActiveShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|function}} func {{bracket}}&lt;br /&gt;
|arg3 = {{type|arg1}} {{bracket}}&lt;br /&gt;
|arg4 = {{type|arg2}} ... {{rbracket}}  {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Binds a shader program identified by shaderID, and calls the Lua func with the specified arguments. Can be used in NON-drawing events (to update uniforms etc.)!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UseShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} linked&lt;br /&gt;
|info = Binds a shader program identified by shaderID. Pass 0 to disable the shader. Returns wether the shader was successfully bound. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetShaderLog&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;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}} infoLog&lt;br /&gt;
|info = Returns the shader compilation error log. This is empty if the shader linking failed, in that case, check your in/out blocks and ensure they match. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SetGeometryShaderParameter &lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|number}} param&lt;br /&gt;
|arg3 = {{type|number}} number&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Sets the Geometry shader parameters for shaderID. Needed by geometry shader programs (check the opengl GL_ARB_geometry_shader4 extension for glProgramParameteri) &amp;lt;br&amp;gt; Was called SetShaderParameter before  104.0.1-596 (maintenance)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SetTesselationShaderParameter&lt;br /&gt;
|arg1 = {{type|number}} param&lt;br /&gt;
|arg2 = {{type|number}} number&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Sets the tesselation shader parameters for shaderID. Needed by tesselation shader programs (check the opengl GL_ARB_tessellation_shader extension for glProgramParameteri) &amp;lt;br&amp;gt; Introduced in 104.0.1-596 (maintenance)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetActiveUniforms&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;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}} ActiveUniforms = { { name = &amp;quot;name&amp;quot;, type = &amp;quot;type&amp;quot;, length = number length, size = number size }, ...}&lt;br /&gt;
|info = Query the active (actually used) uniforms of a shader and identify their names, types (float, int, uint) and sizes (float, vec4, ...). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetUniformLocation&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;name&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|number}} locationID&lt;br /&gt;
|info = Returns the locationID of a shaders uniform. Needed for changing uniform values with gl.Uniform.  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Uniform&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|number }} f1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number }} f2 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number }} f3 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number }} f4 {{rbracket}} {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the uniform float value at the locationID for the currently active shader. Shader must be activated before setting uniforms.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UniformInt&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|number }} int1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number }} int2 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number }} int3 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number }} int4 {{rbracket}} {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the uniform int value at the locationID for the currently active shader. Shader must be activated before setting uniforms.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UniformArray&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|number }} type&lt;br /&gt;
|arg3 = {{type|table }} uniforms &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the an array of uniform values at the locationID for the currently active shader. Shader must be activated before setting uniforms. Type can be one of {1 = int, 2 = float, 3 = float matrix}. In 104.0 the maximum length of the uniforms table increased from 32 entries to 1024.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UniformMatrix&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;shadows&amp;quot; {{pipe}} &amp;quot;camera&amp;quot; {{pipe}} &amp;quot;caminv&amp;quot; {{pipe}} &amp;quot;camprj&amp;quot; {{pipe}} {{type|number}} m1&lt;br /&gt;
|arg3 = {{type|number}} m2&lt;br /&gt;
|arg4 = {{type|number}} m3&lt;br /&gt;
|arg5 = {{type|number}} m4&lt;br /&gt;
|arg6 = {{type|number}} m5&lt;br /&gt;
|arg7 = {{type|number}} m6&lt;br /&gt;
|arg8 = {{type|number}} m7&lt;br /&gt;
|arg9 = {{type|number}} m8 ... , m16&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the a uniform mat4 locationID for the currently active shader. Shader must be activated before setting uniforms. Can set one one common matrix like shadow, or by passing 16 additional numbers for the matrix.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_GLSL_Api&amp;diff=11326</id>
		<title>Lua GLSL Api</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_GLSL_Api&amp;diff=11326"/>
		<updated>2022-06-03T11:14:39Z</updated>

		<summary type="html">&lt;p&gt;Beherith: finish luacallout&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;
These functions are ONLY available if the graphics adapter supports GLSL.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Please test in your scripts if one of them exists before you use them. In headless mode, the gl. callouts are nil.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = CreateShader&lt;br /&gt;
|arg1 = {{type|table}} shaderParams&lt;br /&gt;
|arg2 =&lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|number}} shaderID &lt;br /&gt;
|info = Create a shader from shaderParams table:&lt;br /&gt;
&lt;br /&gt;
  ({[ vertex   = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tcs      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tes      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ geometry = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ fragment = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ uniform       = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformInt    = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformFloat  = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformMatrix = { uniformName = number value, ...} ,]&lt;br /&gt;
    [ geoInputType = number inType,]&lt;br /&gt;
    [ geoOutputType = number outType,]&lt;br /&gt;
    [ geoOutputVerts = number maxVerts,]&lt;br /&gt;
    [ definitions = &amp;quot;string of shader #defines&amp;quot;, ]&lt;br /&gt;
  })&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Vertex&amp;quot; or vertex-shader is your GLSL-Code as string, its written in a C-Dialect. This shader is busy deforming the geometry of a unit but it can not create new polygons. Use it for waves, wobbling surfaces etc.&lt;br /&gt;
 &lt;br /&gt;
* The &amp;quot;Geometry&amp;quot; or Geometry-shader can create new vertices and vertice-stripes from points. &lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TCS&amp;quot; or Tesselation Control Shader controls how much tessellation a particular patch gets; it also defines the size of a patch, thus allowing it to augment data. It can also filter vertex data taken from the vertex shader. The main purpose of the TCS is to feed the tessellation levels to the Tessellation primitive generator stage, as well as to feed patch data (as its output values) to the Tessellation Evaluation Shader stage. TCS shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TES&amp;quot; or Tesselation Evaluation Shader takes the abstract patch generated by the tessellation primitive generation stage, as well as the actual vertex data for the entire patch, and generates a particular vertex from it. Each TES invocation generates a single vertex. It can also take per-patch data provided by the Tessellation Control Shader. TES shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Fragment&amp;quot; or Fragment-shader (sometimes called pixel-Shader) is post processing the allready rendered picture (for example drawing stars on the sky)- remember textures are not always 2 dimensional pictures. They can contain information about the depth, or the third value marks areas and the strength at which these are processed.&lt;br /&gt;
&lt;br /&gt;
* The Uniforms are the values, you send along with the shader-program. To use them in the shader-program declare them like this: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform float frame;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* From 101.0 onwards, the engine will automatically fill in an appropriately named uniform for team colour if it is declared;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform vec4 teamColor;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Deletes a shader identified by shaderID&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ActiveShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|function}} func {{bracket}}&lt;br /&gt;
|arg3 = {{type|arg1}} {{bracket}}&lt;br /&gt;
|arg4 = {{type|arg2}} ... {{rbracket}}  {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Binds a shader program identified by shaderID, and calls the Lua func with the specified arguments. Can be used in NON-drawing events (to update uniforms etc.)!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UseShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} linked&lt;br /&gt;
|info = Binds a shader program identified by shaderID. Pass 0 to disable the shader. Returns wether the shader was successfully bound. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetShaderLog&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;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}} infoLog&lt;br /&gt;
|info = Returns the shader compilation error log. This is empty if the shader linking failed, in that case, check your in/out blocks and ensure they match. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SetGeometryShaderParameter &lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|number}} param&lt;br /&gt;
|arg3 = {{type|number}} number&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Sets the Geometry shader parameters for shaderID. Needed by geometry shader programs (check the opengl GL_ARB_geometry_shader4 extension for glProgramParameteri) &amp;lt;br&amp;gt; Was called SetShaderParameter before  104.0.1-596 (maintenance)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SetTesselationShaderParameter&lt;br /&gt;
|arg1 = {{type|number}} param&lt;br /&gt;
|arg2 = {{type|number}} number&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Sets the tesselation shader parameters for shaderID. Needed by tesselation shader programs (check the opengl GL_ARB_tessellation_shader extension for glProgramParameteri) &amp;lt;br&amp;gt; Introduced in 104.0.1-596 (maintenance)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetActiveUniforms&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;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}} ActiveUniforms = { { name = &amp;quot;name&amp;quot;, type = &amp;quot;type&amp;quot;, length = number length, size = number size }, ...}&lt;br /&gt;
|info = Query the active (actually used) uniforms of a shader and identify their names, types (float, int, uint) and sizes (float, vec4, ...). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetUniformLocation&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;name&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|number}} locationID&lt;br /&gt;
|info = Returns the locationID of a shaders uniform. Needed for changing uniform values with gl.Uniform.  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = Uniform&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|number }} f1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number }} f2 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number }} f3 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number }} f4 {{rbracket}} {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the uniform float value at the locationID for the currently active shader. Shader must be activated before setting uniforms.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UniformInt&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|number }} int1 {{bracket}}&lt;br /&gt;
|arg3 = {{type|number }} int2 {{bracket}}&lt;br /&gt;
|arg4 = {{type|number }} int3 {{bracket}}&lt;br /&gt;
|arg5 = {{type|number }} int4 {{rbracket}} {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the uniform int value at the locationID for the currently active shader. Shader must be activated before setting uniforms.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UniformArray&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|number }} type&lt;br /&gt;
|arg3 = {{type|table }} uniforms &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the an array of uniform values at the locationID for the currently active shader. Shader must be activated before setting uniforms. Type can be one of {1 = int, 2 = float, 3 = float matrix}. In 104.0 the maximum length of the uniforms table increased from 32 entries to 1024.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UniformMatrix&lt;br /&gt;
|arg1 = {{type|number}} locationID &lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;shadows&amp;quot; {{pipe}} &amp;quot;camera&amp;quot; {{pipe}} &amp;quot;caminv&amp;quot; {{pipe}} &amp;quot;camprj&amp;quot; {{pipe}} {{type|number}} m1&lt;br /&gt;
|arg3 = {{type|number}} m2&lt;br /&gt;
|arg4 = {{type|number}} m3&lt;br /&gt;
|arg5 = {{type|number}} m4&lt;br /&gt;
|arg6 = {{type|number}} m5&lt;br /&gt;
|arg7 = {{type|number}} m6&lt;br /&gt;
|arg8 = {{type|number}} m7&lt;br /&gt;
|arg9 = {{type|number}} m8 ... , m16&lt;br /&gt;
|return = {{type|nil}} &lt;br /&gt;
|info = Sets the a uniform mat4 locationID for the currently active shader. Shader must be activated before setting uniforms. Can set one one common matrix like shadow, or by passing 16 additional numbers for the matrix.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_GLSL_Api&amp;diff=11325</id>
		<title>Lua GLSL Api</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_GLSL_Api&amp;diff=11325"/>
		<updated>2022-06-03T09:05:40Z</updated>

		<summary type="html">&lt;p&gt;Beherith: Move some bits to LuaCallout, clarify things&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;These functions are ONLY available if the graphic board supports GLSL.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Please test in your scripts if one of them exists before you use them!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.CreateShader&#039;&#039;&#039;&lt;br /&gt;
  ({[ vertex   = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tcs      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ tes      = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ geometry = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ fragment = &amp;quot;glsl code&amp;quot; ,]&lt;br /&gt;
    [ uniform       = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformInt    = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformFloat  = { uniformName = number value, ...} ,] &amp;lt;span class=note&amp;gt;(specify a Lua array as an argument to uniformName to initialize GLSL arrays)&amp;lt;/span&amp;gt;&lt;br /&gt;
    [ uniformMatrix = { uniformName = number value, ...} ,]&lt;br /&gt;
    [ geoInputType = number inType,]&lt;br /&gt;
    [ geoOutputType = number outType,]&lt;br /&gt;
    [ geoOutputVerts = number maxVerts,]&lt;br /&gt;
    [ definitions = &amp;quot;string of shader #defines&amp;quot;, ]&lt;br /&gt;
  }) -&amp;gt; number shaderID&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Vertex&amp;quot; or vertex-shader is your GLSL-Code as string, its written in a C-Dialect. This shader is busy deforming the geometry of a unit but it can not create new polygons. Use it for waves, wobbling surfaces etc.&lt;br /&gt;
 &lt;br /&gt;
* The &amp;quot;Geometry&amp;quot; or Geometry-shader can create new vertices and vertice-stripes from points. &lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TCS&amp;quot; or Tesselation Control Shader controls how much tessellation a particular patch gets; it also defines the size of a patch, thus allowing it to augment data. It can also filter vertex data taken from the vertex shader. The main purpose of the TCS is to feed the tessellation levels to the Tessellation primitive generator stage, as well as to feed patch data (as its output values) to the Tessellation Evaluation Shader stage. TCS shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;TES&amp;quot; or Tesselation Evaluation Shader takes the abstract patch generated by the tessellation primitive generation stage, as well as the actual vertex data for the entire patch, and generates a particular vertex from it. Each TES invocation generates a single vertex. It can also take per-patch data provided by the Tessellation Control Shader. TES shader can be used with spring version &amp;gt;= 104.0.1-596 (maintenance), it&#039;s also available in develop branch of spring.&lt;br /&gt;
&lt;br /&gt;
* The &amp;quot;Fragment&amp;quot; or Fragment-shader (sometimes called pixel-Shader) is post processing the allready rendered picture (for example drawing stars on the sky)- remember textures are not always 2 dimensional pictures. They can contain information about the depth, or the third value marks areas and the strength at which these are processed.&lt;br /&gt;
&lt;br /&gt;
* The Uniforms are the values, you send along with the shader-program. To use them in the shader-program declare them like this: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform float frame;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* From 101.0 onwards, the engine will automatically fill in an appropriately named uniform for team colour if it is declared;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;uniform vec4 teamColor;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = DeleteShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 =&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Deletes a shader identified by shaderID&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = ActiveShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|function}} func {{bracket}}&lt;br /&gt;
|arg3 = {{type|arg1}} {{bracket}}&lt;br /&gt;
|arg4 = {{type|arg2}} ... {{rbracket}}  {{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Binds a shader program identified by shaderID, and calls the Lua func with the specified arguments. Can be used in NON-drawing events (to update uniforms etc.)!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = UseShader&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|bool}} linked&lt;br /&gt;
|info = Binds a shader program identified by shaderID. Pass 0 to disable the shader. Returns wether the shader was successfully bound. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetShaderLog&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;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}} infoLog&lt;br /&gt;
|info = Returns the shader compilation error log. This is empty if the shader linking failed, in that case, check your in/out blocks and ensure they match. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SetGeometryShaderParameter &lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|number}} param&lt;br /&gt;
|arg3 = {{type|number}} number&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Sets the Geometry shader parameters for shaderID. Needed by geometry shader programs (check the opengl GL_ARB_geometry_shader4 extension for glProgramParameteri) &amp;lt;br&amp;gt; Was called SetShaderParameter before  104.0.1-596 (maintenance)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = SetTesselationShaderParameter&lt;br /&gt;
|arg1 = {{type|number}} param&lt;br /&gt;
|arg2 = {{type|number}} number&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 = &lt;br /&gt;
|return = {{type|nil}}&lt;br /&gt;
|info = Sets the tesselation shader parameters for shaderID. Needed by tesselation shader programs (check the opengl GL_ARB_tessellation_shader extension for glProgramParameteri) &amp;lt;br&amp;gt; Introduced in 104.0.1-596 (maintenance)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetActiveUniforms&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;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}} ActiveUniforms = { { name = &amp;quot;name&amp;quot;, type = &amp;quot;type&amp;quot;, length = number length, size = number size }, ...}&lt;br /&gt;
|info = Query the active (actually used) uniforms of a shader and identify their names, types (float, int, uint) and sizes (float, vec4, ...). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = gl.&lt;br /&gt;
|name = GetUniformLocation&lt;br /&gt;
|arg1 = {{type|number}} shaderID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;name&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|number}} locationID&lt;br /&gt;
|info = Returns the locationID of a shaders uniform. Needed for changing uniform values with gl.Uniform.  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.Uniform&#039;&#039;&#039;&lt;br /&gt;
  ( number locationID, number f1 [,number f2 [,number f3 [,number f4]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UniformInt&#039;&#039;&#039;&lt;br /&gt;
  ( number locationID, number int1 [,number int2 [,number int3 [,number int4]]] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UniformArray&#039;&#039;&#039; {{new|95.0}}&lt;br /&gt;
  ( number locationID, number type, table uniforms ) -&amp;gt; nil&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;type can be one of {1 = int, 2 = float, 3 = float matrix}. In 104.0 the maximum length of the uniforms table increased from 32 entries to 1024.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;gl.UniformMatrix&#039;&#039;&#039;&lt;br /&gt;
  ( number locationID, &lt;br /&gt;
    &amp;quot;shadow&amp;quot; |&lt;br /&gt;
    &amp;quot;camera&amp;quot; |&lt;br /&gt;
    &amp;quot;caminv&amp;quot; |&lt;br /&gt;
    &amp;quot;camprj&amp;quot; |&lt;br /&gt;
    number m1, number m2, number m3, number m4 |&lt;br /&gt;
    number m1, ... , number m9 |&lt;br /&gt;
    number m1, ... , number m16&lt;br /&gt;
  ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12330</id>
		<title>Lua UnsyncedCtrl</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedCtrl&amp;diff=12330"/>
		<updated>2022-06-02T15:22:03Z</updated>

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

		<summary type="html">&lt;p&gt;Beherith: /* Time */&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 = Speed factors are by default 1.0, (the default simulation gamespeed) but are not 0 when the game is paused. Factor at 10x gamespeed is 10.0. {{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 = Gets globalRendering-&amp;gt;timeOffset, which contains the offset of the current draw frame from the last sim frame, expressed in fractions of a frame. Ideally, when running 30hz sim, and 60hz rendering, the draw frames should have and offset of either 0.0 frames, or 0.5 frames. When draw frames are not integer multiples of sim frames, some interpolation happens, and this timeoffset shows how far along it is. &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 = This function returns a timer type object, which we can use a pair of to calculate the time difference between two timer objects with DiffTimers. However, this time is at best millisecond resolution. &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 = {{bracket}} {{type|bool}} lastFrameTime {{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|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. If given an optional boolean true, then it returns the game-&amp;gt;lastFrameTime instead of the lastFrameStart&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>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12424</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=12424"/>
		<updated>2022-04-20T14:09:16Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Time */&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 = Gets globalRendering-&amp;gt;timeOffset, which contains the offset of the current draw frame from the last sim frame, expressed in fractions of a frame. Ideally, when running 30hz sim, and 60hz rendering, the draw frames should have and offset of either 0.0 frames, or 0.5 frames. When draw frames are not integer multiples of sim frames, some interpolation happens, and this timeoffset shows how far along it is. &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 = This function returns a timer type object, which we can use a pair of to calculate the time difference between two timer objects with DiffTimers. However, this time is at best millisecond resolution. &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 = {{bracket}} {{type|bool}} lastFrameTime {{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|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. If given an optional boolean true, then it returns the game-&amp;gt;lastFrameTime instead of the lastFrameStart&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>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12423</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=12423"/>
		<updated>2022-04-20T14:08:26Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Time */&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 = Gets globalRendering-&amp;gt;timeOffset, which contains the offset of the current draw frame from the last sim frame, expressed in fractions of a frame. Ideally, when running 30hz sim, and 60hz rendering, the draw frames should have and offset of either 0.0 frames, or 0.5 frames. When draw frames are not integer multiples of sim frames, some interpolation happens, and this timeoffset shows how far along it is. &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 = This function returns a timer type object, which we can use a pair of to calculate the time difference between two timer objects with DiffTimers. However, this time is at best millisecond resolution. &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 =  {{type|bool}} lastFrameTime{{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|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. If given a boolean true, then it returns the game-&amp;gt;lastFrameTime instead of the lastFrameStart&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>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Balanced_Annihilation&amp;diff=2603</id>
		<title>Balanced Annihilation</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Balanced_Annihilation&amp;diff=2603"/>
		<updated>2022-03-20T19:03:03Z</updated>

		<summary type="html">&lt;p&gt;Beherith: Do not falsify information in the wiki regarding past maintainers of a project. Perform your edits to the tournament information separately.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:Games]][[category:Balanced Annihilation]]&lt;br /&gt;
&#039;&#039;&#039;[[Games|&amp;lt;--Back to Games]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://balancedannihilation.com/balanced-annihilation.png&lt;br /&gt;
&lt;br /&gt;
===Links===&lt;br /&gt;
* [https://balancedannihilation.com/ BA website]&lt;br /&gt;
* [https://discord.gg/jvFCZHBXTU BA Discord]&lt;br /&gt;
* [https://springrts.com/phpbb/viewforum.php?f=44 BA forum]&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
[https://balancedannihilation.com/ Balanced Annihilation] is a Total Annihilation mod remastered with improved graphics and balance. The philosophy of Balanced Annihilation follows three principles:  &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Refined Total Annihilation mod:&#039;&#039;&#039; BA&#039;s lineage traces back to Total Annihilation and the mods that refined its classic graphics and gameplay across decades. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Competitive Gameplay:&#039;&#039;&#039; BA has matured through over 15 years of playtesting by veteran players in both casual and tournament settings. Faction and unit choices offer many unique tactical possibilities.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Stable Balance:&#039;&#039;&#039; BA is conservatively balanced to favour strategic play. Every unit has a role and few units get truly obsolete as the game progresses.&lt;br /&gt;
&lt;br /&gt;
===Tournaments===&lt;br /&gt;
Balanced Annihilation runs competitive 1v1 tournaments that attract many dedicated players. At 42 players the [https://challonge.com/CROWN_CUP_2 2021 Crown Cup 2 tournament] was the largest tournament in Spring&#039;s 16 year history. Players battle for the BA crown, a unique in-game item for the commander that can only be aquired by winning the event.&lt;br /&gt;
&lt;br /&gt;
*Crown Cup 1 https://challonge.com/CROWN_CUP &#039;&#039;&#039;1st Cartouche, 2nd PRO_rANDY, 3rd Teddy&#039;&#039;&#039;&lt;br /&gt;
*Crown Cup 2 https://challonge.com/CROWN_CUP_2 &#039;&#039;&#039;1st Cartouche, 2nd Teddy, 3rd PtaQ &#039;&#039;&#039;&lt;br /&gt;
*Crown Cup 3, &#039;&#039;&#039;Upcoming Event&#039;&#039;&#039; 12th March 2022 https://challonge.com/CROWN_CUP_3&lt;br /&gt;
&lt;br /&gt;
===History===&lt;br /&gt;
&lt;br /&gt;
Balanced Annihilation is a Total Annihilation remake built using the [https://en.wikipedia.org/wiki/Spring_Engine Spring engine] whose history traces back to the mod [[Absolute_Annihilation|Absolute Annihilation]] by Caydr (2002-2006). AA was based on [http://bsr.tauniverse.com/faq.html ÜberHack] by Brave Sir Robin (1998-2002). The [https://www.clan-sy.com/frame.html Swedish Yankspankers] work on the TA Demo Recorder (1999-2004) made it possible for AA to be ported to 3D and these efforts led to the creation of Balanced Annihilation in 2006. Zero-K and BAR were both forked from Balanced Annihilation in the past.&lt;br /&gt;
&lt;br /&gt;
===Development===&lt;br /&gt;
&lt;br /&gt;
The current developer is [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=10773 Ares] (2020). The previous maintainers, who shouldn&#039;t be forgotten, were: &lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=2568 Shox] (2019)&lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=10555 Floris] (2015-19)&lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=9073 Decay] (2015-16)&lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=7229 Silentwings] (2012-15) &lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=5958 Beherith] (2011-12) &lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=7403 Niobium] (2011)&lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=4460 TheFatController] (2010-11)&lt;br /&gt;
* [https://springrts.com/phpbb/memberlist.php?mode=viewprofile&amp;amp;u=326 NOiZE]. (2006-11)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Games|&amp;lt;--Back to Games]]&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12072</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=12072"/>
		<updated>2022-02-26T21:09:42Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* GetUnits */&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. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1 {{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>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10812</id>
		<title>Lua:Callins</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10812"/>
		<updated>2022-02-21T11:30:15Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Units */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua Callins =&lt;br /&gt;
This page is future looking to unified widget/gadget (aka &amp;quot;addon&amp;quot;) handler, which may yet be some way off, c.f. the [https://github.com/spring/spring/blob/ebb704e008f6ea645947d07be1cfcc272af0428f/doc/changelog.txt#L71 changelog].&lt;br /&gt;
&lt;br /&gt;
Related Sourcecode :&lt;br /&gt;
[https://github.com/spring/spring/blob/d9b3927a528a876b9ab4042771e82b050267572a/rts/Lua/LuaHandle.cpp https://github.com/spring/spring/rts/Lua/LuaHandle.cpp]&lt;br /&gt;
&lt;br /&gt;
For now, to use these addons in a widget, replace addon with widget and, for a gadget, replace addon with gadget. For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
        ...  &lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some functions may differ between (synced) gadget and widgets; those are in the [[#Synced_-_Unsynced_Shared]] section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: maroon;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention:&#039;&#039;&#039;&amp;lt;/span&amp;gt; some callins will only work on the unsynced portion of the gadget. Due to the type-unsafe nature of lua parsing, those callins not firing up might be hard to trace. This document will be continuously updated to properly alert about those situations.&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Initialize&lt;br /&gt;
|info = Called when the addon is (re)loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Shutdown&lt;br /&gt;
|info = Called when the addon or the game is shutdown.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsynced Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DefaultCommand&lt;br /&gt;
|args = type, id&lt;br /&gt;
|return = {{type|number}} cmdID&lt;br /&gt;
|info = Used to set the default command when a unit is selected. First parameter is the type of the object pointed at (either &amp;quot;unit or &amp;quot;feature&amp;quot;) and the second is its {{var|unitID}} or {{var|featureID}} respectively. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandNotify&lt;br /&gt;
|args = cmdID, cmdParams, cmdOptions&lt;br /&gt;
|return = {{type|bool}} removeCmd&lt;br /&gt;
|info = Called when a command is issued. Returning {{value|true}} deletes the command and does not send it through the network.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandsChanged&lt;br /&gt;
|args = None&lt;br /&gt;
|return = ?&lt;br /&gt;
|info = Called when the command descriptions changed, e.g. when selecting or deselecting a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = WorldTooltip&lt;br /&gt;
|args = ttType, data1, data2, data3&lt;br /&gt;
|return = {{type|string}} newTooltip&lt;br /&gt;
|info = The parameters can be {{value|&amp;quot;unit&amp;quot;}}, {{var|unitID}}; {{value|&amp;quot;feature&amp;quot;}}, {{var|featureID}}; {{value|&amp;quot;ground&amp;quot;}}, {{var|posX}}, {{var|posY}}, {{var|posZ}} or {{value|&amp;quot;selection&amp;quot;}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnsyncedHeightMapUpdate&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = Called when the unsynced copy of the height-map is altered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameProgress&lt;br /&gt;
|args = serverFrameNum&lt;br /&gt;
|info = Called every 60 frames, calculating delta between GameFrame and GameProgress. Can give an ETA about catching up with simulation for mid-game join players.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameSetup&lt;br /&gt;
|args =  state, ready, playerStates&lt;br /&gt;
|return = {{type|bool}} success, {{type|bool}} newReady&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = SunChanged&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AddConsoleLine&lt;br /&gt;
|args = msg, priority&lt;br /&gt;
|info = Called when text is entered into the console (e.g. Spring.Echo).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvSkirmishAIMessage&lt;br /&gt;
|args = aiTeam, dataStr&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvFromSynced&lt;br /&gt;
|args = ...&lt;br /&gt;
|info = Receives data sent via [[Lua_System#Synced|SendToUnsynced]] callout.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Save&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called when a chat command &#039;/save&#039; or &#039;/savegame&#039; is received. The single argument is a userdatum representing the savegame zip file. See [[Lua_SaveLoad#Save_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = LoadProgress&lt;br /&gt;
|args = message, replaceLastLine&lt;br /&gt;
|info = Only available to LuaIntro.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GroupChanged&lt;br /&gt;
|args = groupID&lt;br /&gt;
|info = Called when a unit is added to or removed from a control group. Currently implemented for widgets only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ConfigureLayout&lt;br /&gt;
|args = ???&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Input ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = IsAbove&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|bool}} isAbove&lt;br /&gt;
|info = Called every Update. Must return {{value|true}} for {{name|Mouse*}} events and {{name|GetToolTip}} to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GetTooltip&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = Called when {{name|IsAbove}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyPress&lt;br /&gt;
|args = key, mods, isRepeat&lt;br /&gt;
|return = {{type|bool}} becomeOwner&lt;br /&gt;
|info = Called repeatedly when a key is pressed down. If you want an action to occur only once check for {{var|1=isRepeat == {{value|false}}}}. The {{var|mods}} parameter is a {{type|table}}, with keys {{value|&amp;quot;alt&amp;quot;}}, {{value|&amp;quot;ctrl&amp;quot;}}, {{value|&amp;quot;meta&amp;quot;}} and {{value|&amp;quot;shift&amp;quot;}} each having a boolean value. Return {{value|true}} if you don&#039;t want other callins or the engine to also receive this keypress. A list of key codes can be seen at the [https://wiki.libsdl.org/SDLKeycodeLookup SDL wiki].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyRelease&lt;br /&gt;
|args = key&lt;br /&gt;
|return = {{type|bool}}&lt;br /&gt;
|info = Called when the key is released.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TextInput&lt;br /&gt;
|args = utf8char&lt;br /&gt;
|info = Called whenever a key press results in text input. Introduced in 97.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = JoystickEvent&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MousePress&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = {{type|bool}} becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is pressed. The {{var|button}} parameter supports up to 7 buttons. Must return {{value|true}} for {{name|MouseRelease}} and other functions to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseRelease&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is released. Please note that in order to have Spring call {{name|MouseRelease}}, you need to have a {{name|MousePress}} call-in in the same addon that returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseWheel&lt;br /&gt;
|args = up, value&lt;br /&gt;
|info = Called when the mouse wheel is moved. The parameters indicate the direction and amount of travel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseMove&lt;br /&gt;
|args = x, y, dx, dy, button&lt;br /&gt;
|info = Called when the mouse is moved. The {{var|dx}} and {{var|dy}} parameters indicate the distance travelled, whereas the first two indicate the final position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Players ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerChanged&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a player&#039;s status changes e.g. becoming a spectator.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerAdded&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a new player joins the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerRemoved&lt;br /&gt;
|args = playerID, reason&lt;br /&gt;
|info = Called whenever a player is removed from the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadStarted&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download is started via [[Lua_VFS#Archives|VFS.DownloadArchive]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFinished&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download finishes successfully.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFailed&lt;br /&gt;
|args = id, errorID&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download fails to complete.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadProgress&lt;br /&gt;
|args = id, downloaded, total&lt;br /&gt;
|info = Called incrementally during a [[Pr-downloader]] download.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Drawing ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ViewResize&lt;br /&gt;
|args = viewSizeX, viewSizeY&lt;br /&gt;
|info = Called whenever the window is resized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Update&lt;br /&gt;
|args = dt&lt;br /&gt;
|info = Called for every draw frame (including when the game is paused) and at least once per sim frame except when catching up. The parameter is the time since the last update. }}&lt;br /&gt;
&lt;br /&gt;
=== Draw* Functions ===&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Avoid doing heavy calculations inside these callins; ideally, do the calculations elsewhere and use Draw callins only for drawing.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|info = Doesn&#039;t render to screen! Use this callin to update textures, shaders, etc. Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreParticles&lt;br /&gt;
|info = ??? {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreUnit&lt;br /&gt;
|info = Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorld&lt;br /&gt;
|info = Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldShadow&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldReflection&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldRefraction&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreForward&lt;br /&gt;
|info = Runs at the start of the forward pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreDeferred&lt;br /&gt;
|info = Runs at the start of the deferred pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPostDeferred&lt;br /&gt;
|info = This runs at the end of its respective deferred pass and allows proper frame compositing (with ground flashes/decals/foliage/etc, which are drawn between it and [[#API:DrawWorldPreUnit|{{name|DrawWorldPreUnit}}]]) via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnitsPostDeferred&lt;br /&gt;
|info = Runs at the end of the unit deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeaturesPostDeferred&lt;br /&gt;
|info = Runs at the end of the feature deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreen&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = ??? Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenEffects&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = Where {{var|vsx}}, {{var|vsy}} are screen coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenPost&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = {{new|104.0}} Similar to {{name|DrawScreenEffects}}, this can be used to alter the contents of a frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawLoadScreen&lt;br /&gt;
|info = {{new|95.0}} Only available to LuaIntro, draws custom load screens.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimap&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimapBackground&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Object Rendering ===&lt;br /&gt;
For the following calls {{var|drawMode}} can be one of the following, {{var|1=notDrawing = {{value|0}}}}, {{var|1=normalDraw = {{value|1}}}}, {{var|1=shadowDraw = {{value|2}}}}, {{var|1=reflectionDraw = {{value|3}}}}, {{var|1=refractionDraw = {{value|4}}}}, and finally {{var|1=gameDeferredDraw = {{value|5}}}} which was added in 102.0.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnit&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of units, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeature&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of features, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawShield&lt;br /&gt;
|args = unitID, weaponID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of [[Gamedev:WeaponDefs#Shield_(WeaponType)|shields]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawProjectile&lt;br /&gt;
|args = projectileID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of weapon (&amp;amp; other) projectiles, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unsynced Menu Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDraw&lt;br /&gt;
|return = {{type|bool}} allowDraw&lt;br /&gt;
|info = Enables Draw{Genesis,Screen,ScreenPost} callins if {{value|true}} is returned, otherwise they are called once every 30 seconds. Only active when a game isn&#039;t running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateMenu&lt;br /&gt;
|info = Called whenever LuaMenu is on with no game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateGame&lt;br /&gt;
|info = Called whenever LuaMenu is on with a game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced - Unsynced Shared ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GotChatMsg&lt;br /&gt;
|args = msg, player&lt;br /&gt;
|info = Called when a player issues a UI command e.g. types {{var|/foo}} or {{var|/luarules foo}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameID&lt;br /&gt;
|args = gameID&lt;br /&gt;
|info = Called once to deliver the {{var|gameID}}. As of 101.0+ the string is encoded in hex.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePaused&lt;br /&gt;
|info = Called when the game is paused.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|args = winningAllyTeams&lt;br /&gt;
|info = The parameter is a {{type|table}} list of winning allyTeams, if empty the game result was undecided (like when dropping from an host).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameFrame&lt;br /&gt;
|args = frame&lt;br /&gt;
|info = Called for every game simulation frame (30 per second). Starts at frame {{value|0}} in 101.0+ and {{value|1}} in previous versions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePreload&lt;br /&gt;
|info = Called before the 0 gameframe. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameStart&lt;br /&gt;
|info = Called upon the start of the game. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamChanged&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamDied&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = Called when a team dies (see [[Lua_SyncedCtrl#Game_End|Spring.KillTeam]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCreated&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, builderID&lt;br /&gt;
|info = Called at the moment the unit is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFinished&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called at the moment the unit is completed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFromFactory&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, factID, factDefID, userOrders&lt;br /&gt;
|info = Called when a factory finishes construction of a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitReverseBuilt&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a living unit becomes a nanoframe again.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitGiven&lt;br /&gt;
|args = unitID, unitDefID, newTeam, oldTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called after {{name|UnitTaken}} and in that moment unit is assigned to the &#039;&#039;&#039;newTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitTaken&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called before {{name|UnitGiven}} and in that moment unit is still assigned to the &#039;&#039;&#039;oldTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDamaged&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is damaged (after {{name|UnitPreDamaged}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RenderUnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called just before a unit is invalid, after it finishes its death animation. {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitStunned&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, stunned&lt;br /&gt;
|info = Called when a unit changes its stun status. {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnitCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when two units collide. Both units must be registered with [[Lua_System#Synced|Script.SetWatchUnit]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFeatureCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when a unit collides with a feature. The unit must be registered with [[Lua_System#Synced|Script.SetWatchUnit]] and the feature registered with [[Lua_System#Synced|Script.SetWatchFeature]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitHarvestStorageFull&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit&#039;s harvestStorage is full (according to its unitDef&#039;s entry).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called after when a unit accepts a command, after {{name|AllowCommand}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCmdDone&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called when a unit completes a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLoaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is loaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnloaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is unloaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitExperience&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, experience, oldExperience&lt;br /&gt;
|info = Called when a unit gains experience greater or equal to the minimum limit set by calling [[Lua_SyncedCtrl#Other|Spring.SetExperienceGrade]]. Should be called more reliably with small values of experience grade in 104.0+.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitIdle&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit is idle (empty command queue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit cloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDecloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit decloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoveFailed&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = StockpileChanged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&lt;br /&gt;
|info = Called when a units stockpile of weapons increases or decreases. See {{xtaglink|Gamedev:WeaponDefs|stockpile}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters LOS of an allyteam. Its called after the unit is in LOS, so you can query that unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves LOS of an allyteam. For widgets, this one is called just before the unit leaves los, so you can still get the position of a unit that left los. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters radar of an allyteam. Also called when a unit enters LOS without any radar coverage. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves radar of an allyteam. Also called when a unit leaves LOS without any radar coverage. For widgets, this is called just after a unit leaves radar coverage, so widgets cannot get the position of units that left their radar. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitSeismicPing&lt;br /&gt;
|args = x, y, z, strength, allyTeam, unitID, unitDefID&lt;br /&gt;
|info = Called when a unit emits a seismic ping. See {{xtaglink|Gamedev:UnitDefs|seismicSignature}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureCreated&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDamaged&lt;br /&gt;
|args =  featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a feature is damaged.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDestroyed&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Projectiles ===&lt;br /&gt;
The following Callins are only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileCreated&lt;br /&gt;
|args = proID, proOwnerID, weaponDefID&lt;br /&gt;
|info = Called when the projectile is created. Note that {{var|weaponDefID}} is missing if the projectile is spawned as part of a burst, but [[Lua_SyncedRead#Projectiles|Spring.GetProjectileDefID]] and [[Lua_SyncedRead#Projectiles|Spring.GetProjectileName]] still work in callin scope using {{var|proID}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileDestroyed&lt;br /&gt;
|args = proID&lt;br /&gt;
|info = Called when the projectile is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced Only ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandFallback&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&lt;br /&gt;
|return = {{type|bool}} used, {{type|bool}} finished&lt;br /&gt;
|info = Called when the unit reaches an unknown command in its queue (i.e. one not handled by the engine). If no addon returns {{var|used}} as {{value|true}} the command is dropped, if an addon returns {{value|true}}, {{value|true}} the command is removed because it&#039;s done, with {{value|true}}, {{value|false}} it&#039;s kept in the queue and {{name|CommandFallback}} gets called again on the next slowupdate.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when the command is given, before the unit&#039;s queue is altered. The return value is whether it should be let into the queue. The queue remains untouched when a command is blocked, whether it would be queued or replace the queue.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitCreation&lt;br /&gt;
|args = unitDefID, builderID, builderTeam, x, y, z, facing&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before unit is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitTransfer&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam, capture&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit is transferred to a different team, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitBuildStep&lt;br /&gt;
|args = builderID, builderTeam, unitID, unitDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit progresses its build percentage, the boolean return value determines whether or not the build makes progress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureCreation&lt;br /&gt;
|args = featureDefID, teamID, x, y, z&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before feature is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureBuildStep&lt;br /&gt;
|args = builderID, builderTeam, featureID, featureDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a feature progresses its build percentage, the boolean return value determines whether or not the progress change is permitted. Note that this is also called for resurrecting features, and for refilling features with resources before resurrection. On reclaim the part values are negative, and on refill and reclaim they are positive. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceLevel&lt;br /&gt;
|args = teamID, res, level&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when a team sets the sharing level of a resource, the boolean return value determines whether or not the sharing level is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceTransfer&lt;br /&gt;
|args = oldTeamID, newTeamID, res, amount&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before resources are transferred between players, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowStartPosition&lt;br /&gt;
|args = playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = {{var|clamped{X,Y,Z}}} are the coordinates clamped into start-boxes, {{var|raw}} is where player tried to place their marker. The {{var|readyState}} can be any one of &lt;br /&gt;
* {{value|0}} - player picked a position, &lt;br /&gt;
* {{value|1}} - player clicked ready, &lt;br /&gt;
* {{value|2}} - player pressed ready OR  the game was force-started (player did not click ready, but is now forcibly readied) or &lt;br /&gt;
* {{value|3}} - the player failed to load. &lt;br /&gt;
* {{new|95.0}} the default &#039;failed to choose&#039; start-position is the north-west point of their startbox, or (0,0,0) if they do not have a startbox. &lt;br /&gt;
NB: The order of the parameters changed with the addition of {{var|teamID}} in 104.0. Previouly it was:&lt;br /&gt;
{{var|clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDirectUnitControl&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, playerID&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Determines if this unit can be controlled directly in FPS view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTargetCheck&lt;br /&gt;
|args = attackerID, attackerWeaponNum, attackerWeaponDefID&lt;br /&gt;
|return = {{type|bool}} allowCheck, {{type|bool}} ignoreCheck&lt;br /&gt;
|info = Determines if this weapon can automatically generate targets itself. See also {{xtaglink|Gamedev:WeaponDefs|commandFire}} weaponDef tag. The {{var|ignoreCheck}} return value was added in 99.0 to allow ignoring the callin i.e. running normal engine check for this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTarget&lt;br /&gt;
|args = attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defPriority&lt;br /&gt;
|return = {{type|bool}} allowed, {{type|number}} newPriority&lt;br /&gt;
|info = Controls blocking of a specific target from being considered during a weapon&#039;s periodic auto-targeting sweep. The second return value is the new priority for this target (if you don&#039;t want to change it, return {{var|defPriority}}). Lower priority targets are targeted first.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponInterceptTarget&lt;br /&gt;
|args = interceptorUnitID, interceptorWeaponID, targetProjectileID&lt;br /&gt;
|return = {{type|bool}} allowed&lt;br /&gt;
|info = Controls blocking of a specific intercept target from being considered during an {{xtaglink|Gamedev:WeaponDefs|interceptor}} weapon&#039;s periodic auto-targeting sweep. Only called for {{var|weaponDefIDs}} registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowBuilderHoldFire&lt;br /&gt;
|args = unitID, unitDefID, action&lt;br /&gt;
|return = {{type|bool}} actionAllowed&lt;br /&gt;
|info = {{new|98.0}} {{Sourcelinkhash|5a82d750b89e72024bb0bb62cf05ea257737e0ac}}   Called when a construction unit wants to &amp;quot;use his nano beams&amp;quot;.&amp;lt;br&amp;gt;{{var|action}} is one of following:&lt;br /&gt;
* {{value|-1}} Build&lt;br /&gt;
* {{value|CMD.REPAIR}} Repair&lt;br /&gt;
* {{value|CMD.RECLAIM}} Reclaim&lt;br /&gt;
* {{value|CMD.RESTORE}} Restore&lt;br /&gt;
* {{value|CMD.RESURRECT}} Resurrect&lt;br /&gt;
* {{value|CMD.CAPTURE}} Capture&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Explosion&lt;br /&gt;
|args = weaponDefID, px, py, pz, AttackerID, ProjectileID&lt;br /&gt;
|return = {{type|bool}} noGfx&lt;br /&gt;
|info = Called when an explosion occurs. If it returns {{value|true}} then no graphical effects are drawn by the engine for this explosion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TerraformComplete&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&lt;br /&gt;
|return = {{type|bool}} stop&lt;br /&gt;
|info = Called when pre-building terrain levelling terraforms are completed (c.f. {{xtaglink|Gamedev:UnitDefs|levelGround}}). If the return value is {{value|true}} the current build order is terminated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MoveCtrlNotify&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, data&lt;br /&gt;
|return = {{type|bool}} moveCtrlComplete&lt;br /&gt;
|info = Enable both [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetCollideStop]] and [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetTrackGround]] to enable this call-in, data was supposed to indicate the type of notification but currently never has a value other than {{value|1}} (&amp;quot;unit hit the ground&amp;quot;). The return value determines whether or not the unit should remain script-controlled ({{value|false}}) or return to engine controlled movement ({{value|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvLuaMsg&lt;br /&gt;
|args = msg, playerID&lt;br /&gt;
|info = Receives messages from unsynced sent via [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaRulesMsg]] or [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaUIMsg]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Load&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called after {{name|GamePreload}} and before {{name|GameStart}}. See [[Lua_SaveLoad#Load_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Damage Controllers ===&lt;br /&gt;
For the following callins, in addition to being a regular weapon, {{var|weaponDefID}} may be one of the following:&lt;br /&gt;
* {{value|-1}} - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* {{value|-2}} - ground collision&lt;br /&gt;
* {{value|-3}} - object collision&lt;br /&gt;
* {{value|-4}} - fire damage&lt;br /&gt;
* {{value|-5}} - water damage&lt;br /&gt;
* {{value|-6}} - kill damage&lt;br /&gt;
* {{value|-7}} - crush damage&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitPreDamaged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the unit, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ShieldPreDamaged&lt;br /&gt;
|I recommend looking up the CallIns in Sourcecode, because the Lua-Documentation, generated from the lua handle of them is seriously flawed and not regenerated.&lt;br /&gt;
|Lua-Handler documented from version&lt;br /&gt;
|args = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|https://github.com/spring/spring/blob/d085e297416bd963ec25eaa3dbf0796ba22a3582/rts/Lua/LuaHandleSynced.h#L106&lt;br /&gt;
|Actual CallIn: &lt;br /&gt;
|args = proID, shieldCarrier, boolBounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|return = {{type|bool}} handleCollision&lt;br /&gt;
|info = Called before any engine shield-vs-projectile logic executes. If the return value is {{value|true}} the gadget handles the collision event and the engine does not remove the projectile. If the weapon is a hitscan type ([[Gamedev:WeaponDefs#Tag:weaponType|BeamLaser]] or [[Gamedev:WeaponDefs#Tag:weaponType|LightningCanon]]) then {{var|proID}} is {{value|nil}} and {{var|beamEmitterWeaponNum}} and {{var|beamEmitterUnitID}} are populated instead. The start and hit position arguments are provided from 104.0 onwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeaturePreDamaged&lt;br /&gt;
|args = featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the feature, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10811</id>
		<title>Lua:Callins</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua:Callins&amp;diff=10811"/>
		<updated>2022-02-21T11:28:51Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Units */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua Callins =&lt;br /&gt;
This page is future looking to unified widget/gadget (aka &amp;quot;addon&amp;quot;) handler, which may yet be some way off, c.f. the [https://github.com/spring/spring/blob/ebb704e008f6ea645947d07be1cfcc272af0428f/doc/changelog.txt#L71 changelog].&lt;br /&gt;
&lt;br /&gt;
Related Sourcecode :&lt;br /&gt;
[https://github.com/spring/spring/blob/d9b3927a528a876b9ab4042771e82b050267572a/rts/Lua/LuaHandle.cpp https://github.com/spring/spring/rts/Lua/LuaHandle.cpp]&lt;br /&gt;
&lt;br /&gt;
For now, to use these addons in a widget, replace addon with widget and, for a gadget, replace addon with gadget. For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
        ...  &lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some functions may differ between (synced) gadget and widgets; those are in the [[#Synced_-_Unsynced_Shared]] section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: maroon;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention:&#039;&#039;&#039;&amp;lt;/span&amp;gt; some callins will only work on the unsynced portion of the gadget. Due to the type-unsafe nature of lua parsing, those callins not firing up might be hard to trace. This document will be continuously updated to properly alert about those situations.&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Initialize&lt;br /&gt;
|info = Called when the addon is (re)loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Shutdown&lt;br /&gt;
|info = Called when the addon or the game is shutdown.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsynced Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DefaultCommand&lt;br /&gt;
|args = type, id&lt;br /&gt;
|return = {{type|number}} cmdID&lt;br /&gt;
|info = Used to set the default command when a unit is selected. First parameter is the type of the object pointed at (either &amp;quot;unit or &amp;quot;feature&amp;quot;) and the second is its {{var|unitID}} or {{var|featureID}} respectively. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandNotify&lt;br /&gt;
|args = cmdID, cmdParams, cmdOptions&lt;br /&gt;
|return = {{type|bool}} removeCmd&lt;br /&gt;
|info = Called when a command is issued. Returning {{value|true}} deletes the command and does not send it through the network.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandsChanged&lt;br /&gt;
|args = None&lt;br /&gt;
|return = ?&lt;br /&gt;
|info = Called when the command descriptions changed, e.g. when selecting or deselecting a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = WorldTooltip&lt;br /&gt;
|args = ttType, data1, data2, data3&lt;br /&gt;
|return = {{type|string}} newTooltip&lt;br /&gt;
|info = The parameters can be {{value|&amp;quot;unit&amp;quot;}}, {{var|unitID}}; {{value|&amp;quot;feature&amp;quot;}}, {{var|featureID}}; {{value|&amp;quot;ground&amp;quot;}}, {{var|posX}}, {{var|posY}}, {{var|posZ}} or {{value|&amp;quot;selection&amp;quot;}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnsyncedHeightMapUpdate&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = Called when the unsynced copy of the height-map is altered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameProgress&lt;br /&gt;
|args = serverFrameNum&lt;br /&gt;
|info = Called every 60 frames, calculating delta between GameFrame and GameProgress. Can give an ETA about catching up with simulation for mid-game join players.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameSetup&lt;br /&gt;
|args =  state, ready, playerStates&lt;br /&gt;
|return = {{type|bool}} success, {{type|bool}} newReady&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = SunChanged&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AddConsoleLine&lt;br /&gt;
|args = msg, priority&lt;br /&gt;
|info = Called when text is entered into the console (e.g. Spring.Echo).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvSkirmishAIMessage&lt;br /&gt;
|args = aiTeam, dataStr&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvFromSynced&lt;br /&gt;
|args = ...&lt;br /&gt;
|info = Receives data sent via [[Lua_System#Synced|SendToUnsynced]] callout.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Save&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called when a chat command &#039;/save&#039; or &#039;/savegame&#039; is received. The single argument is a userdatum representing the savegame zip file. See [[Lua_SaveLoad#Save_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = LoadProgress&lt;br /&gt;
|args = message, replaceLastLine&lt;br /&gt;
|info = Only available to LuaIntro.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GroupChanged&lt;br /&gt;
|args = groupID&lt;br /&gt;
|info = Called when a unit is added to or removed from a control group. Currently implemented for widgets only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ConfigureLayout&lt;br /&gt;
|args = ???&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Input ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = IsAbove&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|bool}} isAbove&lt;br /&gt;
|info = Called every Update. Must return {{value|true}} for {{name|Mouse*}} events and {{name|GetToolTip}} to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GetTooltip&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = Called when {{name|IsAbove}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyPress&lt;br /&gt;
|args = key, mods, isRepeat&lt;br /&gt;
|return = {{type|bool}} becomeOwner&lt;br /&gt;
|info = Called repeatedly when a key is pressed down. If you want an action to occur only once check for {{var|1=isRepeat == {{value|false}}}}. The {{var|mods}} parameter is a {{type|table}}, with keys {{value|&amp;quot;alt&amp;quot;}}, {{value|&amp;quot;ctrl&amp;quot;}}, {{value|&amp;quot;meta&amp;quot;}} and {{value|&amp;quot;shift&amp;quot;}} each having a boolean value. Return {{value|true}} if you don&#039;t want other callins or the engine to also receive this keypress. A list of key codes can be seen at the [https://wiki.libsdl.org/SDLKeycodeLookup SDL wiki].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyRelease&lt;br /&gt;
|args = key&lt;br /&gt;
|return = {{type|bool}}&lt;br /&gt;
|info = Called when the key is released.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TextInput&lt;br /&gt;
|args = utf8char&lt;br /&gt;
|info = Called whenever a key press results in text input. Introduced in 97.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = JoystickEvent&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MousePress&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = {{type|bool}} becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is pressed. The {{var|button}} parameter supports up to 7 buttons. Must return {{value|true}} for {{name|MouseRelease}} and other functions to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseRelease&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is released. Please note that in order to have Spring call {{name|MouseRelease}}, you need to have a {{name|MousePress}} call-in in the same addon that returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseWheel&lt;br /&gt;
|args = up, value&lt;br /&gt;
|info = Called when the mouse wheel is moved. The parameters indicate the direction and amount of travel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseMove&lt;br /&gt;
|args = x, y, dx, dy, button&lt;br /&gt;
|info = Called when the mouse is moved. The {{var|dx}} and {{var|dy}} parameters indicate the distance travelled, whereas the first two indicate the final position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Players ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerChanged&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a player&#039;s status changes e.g. becoming a spectator.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerAdded&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a new player joins the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerRemoved&lt;br /&gt;
|args = playerID, reason&lt;br /&gt;
|info = Called whenever a player is removed from the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadStarted&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download is started via [[Lua_VFS#Archives|VFS.DownloadArchive]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFinished&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download finishes successfully.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFailed&lt;br /&gt;
|args = id, errorID&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download fails to complete.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadProgress&lt;br /&gt;
|args = id, downloaded, total&lt;br /&gt;
|info = Called incrementally during a [[Pr-downloader]] download.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Drawing ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ViewResize&lt;br /&gt;
|args = viewSizeX, viewSizeY&lt;br /&gt;
|info = Called whenever the window is resized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Update&lt;br /&gt;
|args = dt&lt;br /&gt;
|info = Called for every draw frame (including when the game is paused) and at least once per sim frame except when catching up. The parameter is the time since the last update. }}&lt;br /&gt;
&lt;br /&gt;
=== Draw* Functions ===&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Avoid doing heavy calculations inside these callins; ideally, do the calculations elsewhere and use Draw callins only for drawing.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|info = Doesn&#039;t render to screen! Use this callin to update textures, shaders, etc. Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreParticles&lt;br /&gt;
|info = ??? {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreUnit&lt;br /&gt;
|info = Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorld&lt;br /&gt;
|info = Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldShadow&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldReflection&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldRefraction&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreForward&lt;br /&gt;
|info = Runs at the start of the forward pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreDeferred&lt;br /&gt;
|info = Runs at the start of the deferred pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPostDeferred&lt;br /&gt;
|info = This runs at the end of its respective deferred pass and allows proper frame compositing (with ground flashes/decals/foliage/etc, which are drawn between it and [[#API:DrawWorldPreUnit|{{name|DrawWorldPreUnit}}]]) via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnitsPostDeferred&lt;br /&gt;
|info = Runs at the end of the unit deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeaturesPostDeferred&lt;br /&gt;
|info = Runs at the end of the feature deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreen&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = ??? Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenEffects&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = Where {{var|vsx}}, {{var|vsy}} are screen coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenPost&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = {{new|104.0}} Similar to {{name|DrawScreenEffects}}, this can be used to alter the contents of a frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawLoadScreen&lt;br /&gt;
|info = {{new|95.0}} Only available to LuaIntro, draws custom load screens.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimap&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimapBackground&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Object Rendering ===&lt;br /&gt;
For the following calls {{var|drawMode}} can be one of the following, {{var|1=notDrawing = {{value|0}}}}, {{var|1=normalDraw = {{value|1}}}}, {{var|1=shadowDraw = {{value|2}}}}, {{var|1=reflectionDraw = {{value|3}}}}, {{var|1=refractionDraw = {{value|4}}}}, and finally {{var|1=gameDeferredDraw = {{value|5}}}} which was added in 102.0.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnit&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of units, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeature&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of features, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawShield&lt;br /&gt;
|args = unitID, weaponID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of [[Gamedev:WeaponDefs#Shield_(WeaponType)|shields]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawProjectile&lt;br /&gt;
|args = projectileID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of weapon (&amp;amp; other) projectiles, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unsynced Menu Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDraw&lt;br /&gt;
|return = {{type|bool}} allowDraw&lt;br /&gt;
|info = Enables Draw{Genesis,Screen,ScreenPost} callins if {{value|true}} is returned, otherwise they are called once every 30 seconds. Only active when a game isn&#039;t running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateMenu&lt;br /&gt;
|info = Called whenever LuaMenu is on with no game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateGame&lt;br /&gt;
|info = Called whenever LuaMenu is on with a game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced - Unsynced Shared ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GotChatMsg&lt;br /&gt;
|args = msg, player&lt;br /&gt;
|info = Called when a player issues a UI command e.g. types {{var|/foo}} or {{var|/luarules foo}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameID&lt;br /&gt;
|args = gameID&lt;br /&gt;
|info = Called once to deliver the {{var|gameID}}. As of 101.0+ the string is encoded in hex.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePaused&lt;br /&gt;
|info = Called when the game is paused.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|args = winningAllyTeams&lt;br /&gt;
|info = The parameter is a {{type|table}} list of winning allyTeams, if empty the game result was undecided (like when dropping from an host).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameFrame&lt;br /&gt;
|args = frame&lt;br /&gt;
|info = Called for every game simulation frame (30 per second). Starts at frame {{value|0}} in 101.0+ and {{value|1}} in previous versions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePreload&lt;br /&gt;
|info = Called before the 0 gameframe. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameStart&lt;br /&gt;
|info = Called upon the start of the game. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamChanged&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamDied&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = Called when a team dies (see [[Lua_SyncedCtrl#Game_End|Spring.KillTeam]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCreated&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, builderID&lt;br /&gt;
|info = Called at the moment the unit is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFinished&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called at the moment the unit is completed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFromFactory&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, factID, factDefID, userOrders&lt;br /&gt;
|info = Called when a factory finishes construction of a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitReverseBuilt&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a living unit becomes a nanoframe again.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitGiven&lt;br /&gt;
|args = unitID, unitDefID, newTeam, oldTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called after {{name|UnitTaken}} and in that moment unit is assigned to the &#039;&#039;&#039;newTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitTaken&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called before {{name|UnitGiven}} and in that moment unit is still assigned to the &#039;&#039;&#039;oldTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDamaged&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is damaged (after {{name|UnitPreDamaged}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RenderUnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called just before a unit is invalid, after it finishes its death animation. {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitStunned&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, stunned&lt;br /&gt;
|info = Called when a unit changes its stun status. {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnitCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when two units collide. Both units must be registered with [[Lua_System#Synced|Script.SetWatchUnit]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFeatureCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when a unit collides with a feature. The unit must be registered with [[Lua_System#Synced|Script.SetWatchUnit]] and the feature registered with [[Lua_System#Synced|Script.SetWatchFeature]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitHarvestStorageFull&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit&#039;s harvestStorage is full (according to its unitDef&#039;s entry).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called after when a unit accepts a command, after {{name|AllowCommand}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCmdDone&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called when a unit completes a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLoaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is loaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnloaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is unloaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitExperience&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, experience, oldExperience&lt;br /&gt;
|info = Called when a unit gains experience greater or equal to the minimum limit set by calling [[Lua_SyncedCtrl#Other|Spring.SetExperienceGrade]]. Should be called more reliably with small values of experience grade in 104.0+.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitIdle&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit is idle (empty command queue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit cloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDecloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit decloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoveFailed&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = StockpileChanged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&lt;br /&gt;
|info = Called when a units stockpile of weapons increases or decreases. See {{xtaglink|Gamedev:WeaponDefs|stockpile}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters LOS of an allyteam. Its called after the unit is in LOS, so you can query that unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves LOS of an allyteam. For widgets, this one is called just before the unit leaves los, so you can still get the position of a unit that left los. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters radar of an allyteam. Also called when a unit enters LOS without any radar coverage. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves radar of an allyteam. For widgets, this is called just after a unit leaves radar coverage, so widgets cannot get the position of units that left their radar. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitSeismicPing&lt;br /&gt;
|args = x, y, z, strength, allyTeam, unitID, unitDefID&lt;br /&gt;
|info = Called when a unit emits a seismic ping. See {{xtaglink|Gamedev:UnitDefs|seismicSignature}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureCreated&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDamaged&lt;br /&gt;
|args =  featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a feature is damaged.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDestroyed&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Projectiles ===&lt;br /&gt;
The following Callins are only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileCreated&lt;br /&gt;
|args = proID, proOwnerID, weaponDefID&lt;br /&gt;
|info = Called when the projectile is created. Note that {{var|weaponDefID}} is missing if the projectile is spawned as part of a burst, but [[Lua_SyncedRead#Projectiles|Spring.GetProjectileDefID]] and [[Lua_SyncedRead#Projectiles|Spring.GetProjectileName]] still work in callin scope using {{var|proID}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileDestroyed&lt;br /&gt;
|args = proID&lt;br /&gt;
|info = Called when the projectile is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced Only ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandFallback&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&lt;br /&gt;
|return = {{type|bool}} used, {{type|bool}} finished&lt;br /&gt;
|info = Called when the unit reaches an unknown command in its queue (i.e. one not handled by the engine). If no addon returns {{var|used}} as {{value|true}} the command is dropped, if an addon returns {{value|true}}, {{value|true}} the command is removed because it&#039;s done, with {{value|true}}, {{value|false}} it&#039;s kept in the queue and {{name|CommandFallback}} gets called again on the next slowupdate.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when the command is given, before the unit&#039;s queue is altered. The return value is whether it should be let into the queue. The queue remains untouched when a command is blocked, whether it would be queued or replace the queue.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitCreation&lt;br /&gt;
|args = unitDefID, builderID, builderTeam, x, y, z, facing&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before unit is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitTransfer&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam, capture&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit is transferred to a different team, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitBuildStep&lt;br /&gt;
|args = builderID, builderTeam, unitID, unitDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit progresses its build percentage, the boolean return value determines whether or not the build makes progress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureCreation&lt;br /&gt;
|args = featureDefID, teamID, x, y, z&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before feature is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureBuildStep&lt;br /&gt;
|args = builderID, builderTeam, featureID, featureDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a feature progresses its build percentage, the boolean return value determines whether or not the progress change is permitted. Note that this is also called for resurrecting features, and for refilling features with resources before resurrection. On reclaim the part values are negative, and on refill and reclaim they are positive. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceLevel&lt;br /&gt;
|args = teamID, res, level&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when a team sets the sharing level of a resource, the boolean return value determines whether or not the sharing level is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceTransfer&lt;br /&gt;
|args = oldTeamID, newTeamID, res, amount&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before resources are transferred between players, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowStartPosition&lt;br /&gt;
|args = playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = {{var|clamped{X,Y,Z}}} are the coordinates clamped into start-boxes, {{var|raw}} is where player tried to place their marker. The {{var|readyState}} can be any one of &lt;br /&gt;
* {{value|0}} - player picked a position, &lt;br /&gt;
* {{value|1}} - player clicked ready, &lt;br /&gt;
* {{value|2}} - player pressed ready OR  the game was force-started (player did not click ready, but is now forcibly readied) or &lt;br /&gt;
* {{value|3}} - the player failed to load. &lt;br /&gt;
* {{new|95.0}} the default &#039;failed to choose&#039; start-position is the north-west point of their startbox, or (0,0,0) if they do not have a startbox. &lt;br /&gt;
NB: The order of the parameters changed with the addition of {{var|teamID}} in 104.0. Previouly it was:&lt;br /&gt;
{{var|clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDirectUnitControl&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, playerID&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Determines if this unit can be controlled directly in FPS view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTargetCheck&lt;br /&gt;
|args = attackerID, attackerWeaponNum, attackerWeaponDefID&lt;br /&gt;
|return = {{type|bool}} allowCheck, {{type|bool}} ignoreCheck&lt;br /&gt;
|info = Determines if this weapon can automatically generate targets itself. See also {{xtaglink|Gamedev:WeaponDefs|commandFire}} weaponDef tag. The {{var|ignoreCheck}} return value was added in 99.0 to allow ignoring the callin i.e. running normal engine check for this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTarget&lt;br /&gt;
|args = attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defPriority&lt;br /&gt;
|return = {{type|bool}} allowed, {{type|number}} newPriority&lt;br /&gt;
|info = Controls blocking of a specific target from being considered during a weapon&#039;s periodic auto-targeting sweep. The second return value is the new priority for this target (if you don&#039;t want to change it, return {{var|defPriority}}). Lower priority targets are targeted first.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponInterceptTarget&lt;br /&gt;
|args = interceptorUnitID, interceptorWeaponID, targetProjectileID&lt;br /&gt;
|return = {{type|bool}} allowed&lt;br /&gt;
|info = Controls blocking of a specific intercept target from being considered during an {{xtaglink|Gamedev:WeaponDefs|interceptor}} weapon&#039;s periodic auto-targeting sweep. Only called for {{var|weaponDefIDs}} registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowBuilderHoldFire&lt;br /&gt;
|args = unitID, unitDefID, action&lt;br /&gt;
|return = {{type|bool}} actionAllowed&lt;br /&gt;
|info = {{new|98.0}} {{Sourcelinkhash|5a82d750b89e72024bb0bb62cf05ea257737e0ac}}   Called when a construction unit wants to &amp;quot;use his nano beams&amp;quot;.&amp;lt;br&amp;gt;{{var|action}} is one of following:&lt;br /&gt;
* {{value|-1}} Build&lt;br /&gt;
* {{value|CMD.REPAIR}} Repair&lt;br /&gt;
* {{value|CMD.RECLAIM}} Reclaim&lt;br /&gt;
* {{value|CMD.RESTORE}} Restore&lt;br /&gt;
* {{value|CMD.RESURRECT}} Resurrect&lt;br /&gt;
* {{value|CMD.CAPTURE}} Capture&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Explosion&lt;br /&gt;
|args = weaponDefID, px, py, pz, AttackerID, ProjectileID&lt;br /&gt;
|return = {{type|bool}} noGfx&lt;br /&gt;
|info = Called when an explosion occurs. If it returns {{value|true}} then no graphical effects are drawn by the engine for this explosion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TerraformComplete&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&lt;br /&gt;
|return = {{type|bool}} stop&lt;br /&gt;
|info = Called when pre-building terrain levelling terraforms are completed (c.f. {{xtaglink|Gamedev:UnitDefs|levelGround}}). If the return value is {{value|true}} the current build order is terminated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MoveCtrlNotify&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, data&lt;br /&gt;
|return = {{type|bool}} moveCtrlComplete&lt;br /&gt;
|info = Enable both [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetCollideStop]] and [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetTrackGround]] to enable this call-in, data was supposed to indicate the type of notification but currently never has a value other than {{value|1}} (&amp;quot;unit hit the ground&amp;quot;). The return value determines whether or not the unit should remain script-controlled ({{value|false}}) or return to engine controlled movement ({{value|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvLuaMsg&lt;br /&gt;
|args = msg, playerID&lt;br /&gt;
|info = Receives messages from unsynced sent via [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaRulesMsg]] or [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaUIMsg]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Load&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called after {{name|GamePreload}} and before {{name|GameStart}}. See [[Lua_SaveLoad#Load_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Damage Controllers ===&lt;br /&gt;
For the following callins, in addition to being a regular weapon, {{var|weaponDefID}} may be one of the following:&lt;br /&gt;
* {{value|-1}} - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* {{value|-2}} - ground collision&lt;br /&gt;
* {{value|-3}} - object collision&lt;br /&gt;
* {{value|-4}} - fire damage&lt;br /&gt;
* {{value|-5}} - water damage&lt;br /&gt;
* {{value|-6}} - kill damage&lt;br /&gt;
* {{value|-7}} - crush damage&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitPreDamaged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the unit, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ShieldPreDamaged&lt;br /&gt;
|I recommend looking up the CallIns in Sourcecode, because the Lua-Documentation, generated from the lua handle of them is seriously flawed and not regenerated.&lt;br /&gt;
|Lua-Handler documented from version&lt;br /&gt;
|args = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|https://github.com/spring/spring/blob/d085e297416bd963ec25eaa3dbf0796ba22a3582/rts/Lua/LuaHandleSynced.h#L106&lt;br /&gt;
|Actual CallIn: &lt;br /&gt;
|args = proID, shieldCarrier, boolBounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|return = {{type|bool}} handleCollision&lt;br /&gt;
|info = Called before any engine shield-vs-projectile logic executes. If the return value is {{value|true}} the gadget handles the collision event and the engine does not remove the projectile. If the weapon is a hitscan type ([[Gamedev:WeaponDefs#Tag:weaponType|BeamLaser]] or [[Gamedev:WeaponDefs#Tag:weaponType|LightningCanon]]) then {{var|proID}} is {{value|nil}} and {{var|beamEmitterWeaponNum}} and {{var|beamEmitterUnitID}} are populated instead. The start and hit position arguments are provided from 104.0 onwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeaturePreDamaged&lt;br /&gt;
|args = featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the feature, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12071</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=12071"/>
		<updated>2022-02-20T21:03:12Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Unit Informations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ). 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. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1 {{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>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12070</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=12070"/>
		<updated>2022-02-18T08:33:29Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Unit Informations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Lua_Scripting|Lua Scripting]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Game ==&lt;br /&gt;
&lt;br /&gt;
=== Special TeamID Variables ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot; style=&amp;quot;font-weight:600&amp;quot;&amp;gt;The following special TeamIDs are not supported by all functions. For Widgets, instead of Spring.MY_UNITS, use Spring.GetLocalTeamID().&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALL_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.MY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ALLY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaConstant&lt;br /&gt;
|type = number&lt;br /&gt;
|name = Spring.ENEMY_UNITS&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGaiaTeamID&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== GameStates ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGodModeEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsCheatingEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsDevLuaEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsEditDefsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreHelperAIsEnabled&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FixedAllies&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsGameOver&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} enabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== RulesParams ===&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The following functions allow to save data per game, team and unit. The advantage of it is that it can be read from anywhere (even from LuaUI and AIs!)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;String values are new since 95.0.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParam&lt;br /&gt;
|arg1 = {{type|number}} ruleIndex {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameRulesParams&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParam&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamRulesParams&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParam&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitRulesParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParam&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} index {{pipe}} {{type|string}} ruleName &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|string}} value &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRulesParams&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|ruleName1}} = {{type|number}} value1 {{pipe}} {{type|string}} value1, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod-/Map-Options ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetModOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMapOptions&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { } {{pipe}} { &amp;quot;keyName1&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, &amp;quot;keyName2&amp;quot; = {{type|string}} &amp;quot;value&amp;quot;, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Warning:&amp;lt;/span&amp;gt; boolean values are not transfered from C to Lua correctly. For this reason the respective option has to be converted to a number and checked accordingly via an IF statement as shown below:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;if (tonumber(Spring.GetModOptions.exampleOption) == 1) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
The following check therefore is insufficient!&lt;br /&gt;
&amp;lt;pre&amp;gt;if (Spring.GetModOptions.exampleOption) then...end&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Speed/Time ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSpeed&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} userSpeedFactor, {{type|number}} speedFactor, {{type|bool}} paused&lt;br /&gt;
|info = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;As of 98.0 moved to [[Lua_UnsyncedRead]] due to desyncs in replays/demos&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameFrame&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} frameNum%dayFrames, {{type|number}} frameNum/dayFrames&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGameSeconds&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} seconds&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Vectors ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetWind&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ, {{type|number}} strength, {{type|number}} normDirX, {{type|number}} normDirY, {{type|number}} normDirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetHeadingFromVector&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetVectorFromHeading&lt;br /&gt;
|arg1 = {{type|number}} heading &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sides/Factions ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|string}} sideName &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = {{type|number}} sideID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} sideName, {{type|string}} startUnit, {{type|string}} caseSensitiveSideName&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSideData&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = { sideName = {{type|string}}, caseName = {{type|string}}, startUnit = {{type|string}}} }, {{bracket|2}} = { ..., ..., ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Teams ==&lt;br /&gt;
=== StartBoxes/StartPositions ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamStartBox&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} xMin, {{type|number}} zMin, {{type|number}} xMax, {{type|number}} zMax&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamStartPosition&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Player,Team,Ally Lists/Info ===&lt;br /&gt;
&lt;br /&gt;
Note: AIs are associated to teamIDs (and do not have playerIDs). Code to cycle through AI teamIDs can be found [https://springrts.com/phpbb/viewtopic.php?f=21&amp;amp;t=36873#p586026 here] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} teamID = -1 {{pipe}} {{type|bool}} onlyActive = false {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} teamID {{pipe}} {{type|bool}} onlyActive {{rbracket}} {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} playerID, etc... }&lt;br /&gt;
|info = From 104.0 onwards spectators will be ignored if a valid (&amp;gt;=0) teamID is given.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamList&lt;br /&gt;
|arg1 = {{bracket}} {{type|number}} allyTeamID = -1  {{rbracket}}&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamList&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}} teamID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerInfo&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|bool}} active, {{type|bool}} spectator, {{type|number}} teamID, {{type|number}} allyTeamID, {{type|number}} pingTime, {{type|number}} cpuUsage, {{type|string}} &amp;quot;country&amp;quot;, {{type|number}} rank, {{type|table}} customPlayerKeys&lt;br /&gt;
|info = PRE-83.0: in synced code &amp;quot;name&amp;quot; is &amp;quot;SYNCED_NONAME&amp;quot;!&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetPlayerControlledUnit&lt;br /&gt;
|arg1 = {{type|number}} playerID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAIInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} skirmishAIID, {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hostingPlayerID, {{type|string}} &amp;quot;shortName&amp;quot;, {{type|string}} &amp;quot;version&amp;quot;, {{type|table}} options&lt;br /&gt;
|info = Note: Before 0.82, the first argument was teamID, and then every other argument with a shifted position.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;shortName, &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOSHORTNAME&amp;quot;; non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;version,   &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced =&amp;gt; &amp;quot;SYNCED_NOVERSION&amp;quot;;   non-local =&amp;gt; &amp;quot;UNKNOWN&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;options    &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;(synced &amp;amp; non-local =&amp;gt; empty-table)&amp;lt;/span&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllyTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} allyteamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamInfo&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID, {{type|number}} leader, {{type|bool}} isDead, {{type|bool}} isAiTeam, {{type|string}} &amp;quot;side&amp;quot;, {{type|number}} allyTeam, {{type|number}} incomeMultiplier, {{type|table}} customTeamKeys&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamResources&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} currentLevel, {{type|number}} storage, {{type|number}} pull, {{type|number}} income, {{type|number}} expense, {{type|number}} share, {{type|number}} sent, {{type|number}} received&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} killed, {{type|number}} died, {{type|number}} capturedBy, {{type|number}} capturedFrom, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|string}} &amp;quot;metal&amp;quot; {{pipe}} &amp;quot;energy&amp;quot; &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} used, {{type|number}} produced, {{type|number}} excessed, {{type|number}} received, {{type|number}} sent&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} cur_max_index&lt;br /&gt;
|info = cur_max_index is possible range for startIndex/endIndex :={1..cur_max_index}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitStats&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex = startIndex {{rbracket}}&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} stats (see below for table content description)&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt; table stats = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;time&amp;quot;             = number,&lt;br /&gt;
        &amp;quot;frame&amp;quot;            = number,&lt;br /&gt;
        &amp;quot;metalUsed&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;metalProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalExcess&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;metalReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;metalSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;energyUsed&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;energyProduced&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energyExcess&amp;quot;     = number,&lt;br /&gt;
        &amp;quot;energyReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;energySent&amp;quot;       = number,&lt;br /&gt;
        &amp;quot;damageDealt&amp;quot;      = number,&lt;br /&gt;
        &amp;quot;damageReceived&amp;quot;   = number,&lt;br /&gt;
        &amp;quot;unitsProduced&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsDied&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsReceived&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsSent&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;unitsCaptured&amp;quot;    = number,&lt;br /&gt;
        &amp;quot;unitsOutCaptured&amp;quot; = number,&lt;br /&gt;
        &amp;quot;unitsKilled&amp;quot;      = number&lt;br /&gt;
      }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamLuaAI&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;luaAI&amp;quot;&lt;br /&gt;
|info = Returns string containing name of AI defined in file LuaAI.lua as name=&amp;quot;&amp;lt;AI name&amp;gt;&amp;quot;. Maybe it returns whole table with all values there, but in my LuaAI.lua name is on first position...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams/PlayersAllied ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = AreTeamsAllied&lt;br /&gt;
|arg1 = {{type|number}} teamID1&lt;br /&gt;
|arg2 = {{type|number}} teamID2&lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ArePlayersAllied&lt;br /&gt;
|arg1 = {{type|number}} playerID1&lt;br /&gt;
|arg2 = {{type|number}} playerID2 &lt;br /&gt;
|arg3 = ...&lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isAllied&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Units ==&lt;br /&gt;
=== GetUnits ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllUnits&lt;br /&gt;
|arg1 =&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnits&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsSorted&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitDefTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = { {{bracket|1}} = {{type|number}} unitID, ... }, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsCounts&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} countTable = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = count, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitsByDefs&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID {{pipe}} tableUnitDefs = { {{type|number}} unitDefID1, ... }&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, ... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitDefCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = {{type|number}} unitDefID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTeamUnitCount&lt;br /&gt;
|arg1 = {{type|number}} teamID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 =&lt;br /&gt;
|arg5 =&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} count&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xmin&lt;br /&gt;
|arg2 = {{type|number}} zmin&lt;br /&gt;
|arg3 = {{type|number}} xmax&lt;br /&gt;
|arg4 = {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInBox&lt;br /&gt;
|arg1 = {{type|number}} xmin, {{type|number}} ymin, {{type|number}} zmin&lt;br /&gt;
|arg2 = {{type|number}} xmax, {{type|number}} ymax, {{type|number}} zmax {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInSphere&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} y, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x, {{type|number}} z&lt;br /&gt;
|arg2 = {{type|number}} radius {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} teamID {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitsInPlanes&lt;br /&gt;
|arg1 = {{type|table}} planes = { {{bracket|1}} = {{type|number}} normalVecX, {{type|number}} normalVecY, {{type|number}} normalVecZ, {{type|number}} d }, etc... }&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} unitTable = { {{bracket|1}} = {{type|number}} unitID, etc... }&lt;br /&gt;
|info = Plane normals point towards accepted space, so the acceptance criteria for each plane is:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;    radius     = unit radius&lt;br /&gt;
    px, py, pz = unit position&lt;br /&gt;
    [(nx * px) + (ny * py) + (nz * pz) + (d - radius)]  &amp;lt;=  0&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestAlly&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitNearestEnemy&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} range {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} useLOS {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = Post 95.0 this no longer returns neutral units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidUnitID&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} valid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitIsDead&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isDead&lt;br /&gt;
|info = Returns false if unit exists and is alive, true for a brief period of time after unit dies, nil otherwise. Keep this in mind when using (not Spring.GetUnitIsDead() ). 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.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID1 &lt;br /&gt;
|arg2 = {{type|number}} unitID2 {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{bracket}}&lt;br /&gt;
|arg4 = {{type|bool}} surfaceDist {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = SurfaceDist new in 95.0. Returns the distance of two units. SurfaceDist calculates the distance between the unitsphere surfaces instead of their midpos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} featureID {{bracket}} &lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitDefDimensions&lt;br /&gt;
|arg1 = {{type|number}} unitDefID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} defDimensions&lt;br /&gt;
|info = DefDimensions table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;defDimensions =    {&lt;br /&gt;
      &amp;quot;height&amp;quot; = number,&lt;br /&gt;
      &amp;quot;radius&amp;quot; = number,&lt;br /&gt;
      &amp;quot;midx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxx&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;miny&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxy&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;midz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;minz&amp;quot;   = number,&lt;br /&gt;
      &amp;quot;maxz&amp;quot;   = number&lt;br /&gt;
    }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttacker&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitMoveTypeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} movetypeData&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit Weapon Informations ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} angleGood, {{type|bool}} loaded, {{type|number}} reloadFrame, {{type|number}} salvoLeft, {{type|number}} numStockpiled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponState&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;reloadState&amp;quot; == &amp;quot;reloadFrame&amp;quot;&lt;br /&gt;
  &amp;quot;reloadTime&amp;quot;&lt;br /&gt;
  &amp;quot;accuracy&amp;quot;&lt;br /&gt;
  &amp;quot;sprayAngle&amp;quot;&lt;br /&gt;
  &amp;quot;range&amp;quot;&lt;br /&gt;
  &amp;quot;projectileSpeed&amp;quot;&lt;br /&gt;
  &amp;quot;burst&amp;quot;&lt;br /&gt;
  &amp;quot;burstRate&amp;quot;&lt;br /&gt;
  &amp;quot;projectiles&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  The following 4 tags were added in 104.0:&lt;br /&gt;
  &amp;quot;salvoError&amp;quot;&lt;br /&gt;
  &amp;quot;salvoLeft&amp;quot;&lt;br /&gt;
  &amp;quot;nextSalvo&amp;quot;&lt;br /&gt;
  &amp;quot;targetMoveError&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponDamages&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum {{pipe}} {{type|string}} &amp;quot;selfDestruct&amp;quot; {{pipe}} {{type|string}} &amp;quot;explode&amp;quot;&lt;br /&gt;
|arg3 = {{type|string}} tag&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} tagVariable&lt;br /&gt;
|info = String argument &amp;quot;tag&amp;quot; can return a specific variable. Possilbe tags are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;  &amp;quot;paralyzeDamageTime&amp;quot;&lt;br /&gt;
  &amp;quot;impulseFactor&amp;quot;&lt;br /&gt;
  &amp;quot;impulseBoost&amp;quot;&lt;br /&gt;
  &amp;quot;craterMult&amp;quot;&lt;br /&gt;
  &amp;quot;craterBoost&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageExp&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageMin&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageRange&amp;quot;&lt;br /&gt;
  &amp;quot;dynDamageInverted&amp;quot;&lt;br /&gt;
  &amp;quot;craterAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;damageAreaOfEffect&amp;quot;&lt;br /&gt;
  &amp;quot;edgeEffectiveness&amp;quot;&lt;br /&gt;
  &amp;quot;explosionSpeed&amp;quot;&lt;br /&gt;
  - or -&lt;br /&gt;
  an armor type index to get the damage against it.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTryTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;For a position it just checks if the weapon can attackGround. For a unit existance, category, death status, crashing status, LOS status, neutral status, ally status and transport status are checked.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks TryTarget, TestRange, and that weapon emit point is not below ground, then checks FreeLineOfFire.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTestRange&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Checks if target is in range including height modifiers and cylinder targeting if set.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|94.0}}&amp;lt;br&amp;gt;Runs a raytrace from unit aimpoint respecting collision flags.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponHaveFreeLineOfFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = {{type|number}} targetID {{pipe}} {{bracket}} {{type|number}} srcPosX {{bracket}}&lt;br /&gt;
|arg4 = {{type|number}} srcPosY {{bracket}}&lt;br /&gt;
|arg5 = {{type|number}} srcPosZ {{bracket}}&lt;br /&gt;
|arg6 = {{type|number}} tgtPosX {{bracket}}&lt;br /&gt;
|arg7 = {{type|number}} tgtPosY {{bracket}}&lt;br /&gt;
|arg8 = {{type|number}} tgtPosZ {{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}{{rbracket}}&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} success&lt;br /&gt;
|info = {{new|104.0}}&amp;lt;br&amp;gt;The param list was changed so that the source firing position can also be passed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponCanFire&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} canFire&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitWeaponTarget&lt;br /&gt;
|arg1 = {{type|number}} unitID &lt;br /&gt;
|arg2 = {{type|number}} weaponNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} 0 {{pipe}} {{type|number}} 1, {{type|bool}} isUserTarget, {{type|number}} unitID {{pipe}} {{type|number}} 2, {{type|bool}} isUserTarget, { {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ } {{pipe}} {{type|number}} 3, {{type|bool}} isUserTarget, {{type|number}} projectileID&lt;br /&gt;
|info = {{new|95.0}}&amp;lt;br&amp;gt;Returned number of args is always 3 if targetType != None.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRadarErrorParams&lt;br /&gt;
|arg1 = {{type|number}} allyTeamID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyteamErrorSize, {{type|number}} baseErrorSize, {{type|number}} baseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPosErrorParams&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posErrorVector.x, {{type|number}} posErrorVector.y, {{type|number}} posErrorVector.z, {{type|number}} posErrorDelta.x, {{type|number}} posErrorDelta.y, {{type|number}} posErrorDelta.z, {{type|number}} nextPosErrorUpdatebaseErrorMult&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Unit LOS ====&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInAirLos&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inAirLOS&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInRadar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inRadar&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = IsUnitInJammer&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} allyID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} inJammer&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unit Pieces ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitVectors&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} { {{type|number}} frontX, {{type|number}} frontY, {{type|number}} frontZ } , { {{type|number}} upX, {{type|number}} upY, {{type|number}} upZ } , { {{type|number}} rightX, {{type|number}} rightY, {{type|number}} rightZ }&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosition&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceDirection&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceList&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceMap&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceInfo&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptPiece&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} scriptPiece {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{bracket}} {{type|number}} scriptPieceNum = {{type|number}} modelPieceNum {{rbracket}} {{pipe}} {{type|number}} modelPieceNum&lt;br /&gt;
|info = This functions translate the COB ScriptPiece numbers into the ModelPiece numbers (the set of ScriptPieces is a subset of the ModelPieces, means #ScriptPieces &amp;lt;= #ModelPieces), which is used in all other functions (the &amp;quot;number piece&amp;quot; means always the modelpiece). So if you get a pieceID via Cob2Lua you have to translate it with this function. Btw. the COB ScriptPiece number is equal with the piece position in the &amp;lt;i&amp;gt;piece&amp;lt;/i&amp;gt; definition in your cob/bos.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitScriptNames&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;cobpiecename1&amp;quot; = {{type|number}} ScriptPieceNum1, ... , {{type|string}} &amp;quot;cobpiecenameN&amp;quot; = {{type|number}} ScriptPieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitPieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} scaleX,{{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = As of 101.0 this is 1-based piece index argument (was 0-based).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CommandQueues ===&lt;br /&gt;
&lt;br /&gt;
Spring.GetCommandQueue function is identical to Spring.GetUnitCommands function. Here only Spring.GetUnitCommands will be listed:&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = This function can trigger an error if called too often without passing a second parameter. Refer to [https://github.com/spring/spring/blob/92c54d5b15775c39a8c67b203c28fe9b9db51cea/rts/Lua/LuaSyncedRead.cpp#L3983-L3996 LuaSyncedRead.cpp#L3983-L3996].&amp;lt;br&amp;gt;CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFullBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetRealBuildQueue&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} buildOrders = { {{bracket|1}} = { {{bracket}}{{type|number}} unitDefID{{rbracket}} = {{type|number}} count },  etc... }&lt;br /&gt;
|info = Cleans the buildqueue of things the unit can&#039;t build itself.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} count = 0 &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} commandQueueSize &lt;br /&gt;
|info =&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCommands&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count = -1 {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable &lt;br /&gt;
|info = CommandQueueTable table arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandQueueTable = {&lt;br /&gt;
     [1] = {&lt;br /&gt;
       &amp;quot;id&amp;quot;      = number,&lt;br /&gt;
       &amp;quot;params&amp;quot;  = { [1] = number, ...},&lt;br /&gt;
       &amp;quot;options&amp;quot; = {&lt;br /&gt;
         &amp;quot;coded&amp;quot;    = number,&lt;br /&gt;
         &amp;quot;alt&amp;quot;      = boolean,&lt;br /&gt;
         &amp;quot;ctrl&amp;quot;     = boolean,&lt;br /&gt;
         &amp;quot;shift&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;right&amp;quot;    = boolean,&lt;br /&gt;
         &amp;quot;internal&amp;quot; = boolean,&lt;br /&gt;
         &amp;quot;meta&amp;quot;    = boolean&lt;br /&gt;
       }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFactoryCounts&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} count {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} addCMDs {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandQueueTable = { {{bracket|2}} = { {{bracket}}{{type|number}} unitDefID {{pipe}} {{type|number}} -cmdID{{rbracket}} = {{type|number}} count }, ...   }&lt;br /&gt;
|info = Gets the buildqueue of a factory.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Command Descriptions/Buttons ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetUnitCmdDescs&lt;br /&gt;
|arg1 = {{type|number}} unitID {{bracket}}&lt;br /&gt;
|arg2 = {{type|number}} startIndex {{bracket}}&lt;br /&gt;
|arg3 = {{type|number}} endIndex {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} commandDescTable&lt;br /&gt;
|info = CommandDescTable arguments are:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;commandDescTable = {&lt;br /&gt;
      [1] = {&lt;br /&gt;
        &amp;quot;id&amp;quot;          = number,&lt;br /&gt;
        &amp;quot;type&amp;quot;        = number,&lt;br /&gt;
        &amp;quot;name&amp;quot;        = string,&lt;br /&gt;
        &amp;quot;action&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;tooltip&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;texture&amp;quot;     = string,&lt;br /&gt;
        &amp;quot;cursor&amp;quot;      = string,&lt;br /&gt;
        &amp;quot;hidden&amp;quot;      = boolean,&lt;br /&gt;
        &amp;quot;disabled&amp;quot;    = boolean,&lt;br /&gt;
        &amp;quot;showUnique&amp;quot;  = boolean,&lt;br /&gt;
        &amp;quot;onlyTexture&amp;quot; = boolean,&lt;br /&gt;
&lt;br /&gt;
        &amp;quot;params&amp;quot;      = { [1] = string, ... }&lt;br /&gt;
     }, ...&lt;br /&gt;
   }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = FindUnitCmdDesc&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} cmdID &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} index&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
=== GetFeatures ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInRectangle&lt;br /&gt;
|arg1 = {{type|number}} xMin&lt;br /&gt;
|arg2 = {{type|number}} zMin&lt;br /&gt;
|arg3 = {{type|number}} xMax&lt;br /&gt;
|arg4 = {{type|number}} zMax &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInSphere&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} y&lt;br /&gt;
|arg3 = {{type|number}} z&lt;br /&gt;
|arg4 = {{type|number}} radius&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturesInCylinder&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = {{type|number}} radius&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetAllFeatures&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} featureTable = { {{bracket|1}} = {{type|number}} featureID, etc... }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Informations ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = ValidFeatureID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|bool}} isValid&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDefID&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} featureDefID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} teamID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureAllyTeam&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} allyID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHealth&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} health, {{type|number}} maxHealth, {{type|number}} resurrectProgress&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeight&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} height&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRadius&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} radius&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureMass&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} mass&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureSeparation&lt;br /&gt;
|arg1 = {{type|number}} featureID1&lt;br /&gt;
|arg2 = {{type|number}} featureID2 {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} 2D {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} distance&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} midPos {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} aimPos {{rbracket}}{{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} bpX, {{type|number}} bpY, {{type|number}} bpZ {{bracket}}, {{type|number}} mpX, {{type|number}} mpY, {{type|number}} mpZ {{bracket}}, {{type|number}} apX, {{type|number}} apY, {{type|number}} apZ {{rbracket}}{{rbracket}}&lt;br /&gt;
|info = Since 89.0, returns the base (default), middle or aim position of the feature.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureVelocity&lt;br /&gt;
|arg1 = {{type|number}} featureID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} norm {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} velX, {{type|number}} velY, {{type|number}} velZ, {{type|number}} velLength&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureRotation&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} pitch, {{type|number}} yaw, {{type|number}} roll&lt;br /&gt;
|info = {{New|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureHeading&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} heading&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResources&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} RemainingMetal, {{type|number}} maxMetal, {{type|number}} RemainingEnergy, {{type|number}} maxEnergy, {{type|number}} reclaimLeft, {{type|number}} reclaimTime&lt;br /&gt;
|info = reclaimTime {{new|105.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureNoSelect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} noSelect&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureResurrect&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} UnitDefName, {{type|number}} buildFacing&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceCollisionVolumeData&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = {{type|number}} pieceID&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ, {{type|number}} offsetX, {{type|number}} offsetY, {{type|number}} offsetZ, {{type|number}} volumeType, {{type|number}} testType, {{type|number}} primaryAxis, {{type|bool}} disabled&lt;br /&gt;
|info = {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureBlocking&lt;br /&gt;
|arg1 = {{type|number}} featureID &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|bool}} isBlocking, {{type|bool}} isSolidObjectCollidable, {{type|bool}} isProjectileCollidable, {{type|bool}} isRaySegmentCollidable, {{type|bool}} crushable, {{type|bool}} blockEnemyPushing, {{type|bool}} blockHeightChanges&lt;br /&gt;
|info = {{new|95.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Feature Pieces ===&lt;br /&gt;
&lt;br /&gt;
Works analogue to #Unit_Pieces&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeatureLastAttackedPiece&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 =&lt;br /&gt;
|arg7 =&lt;br /&gt;
|arg8 =&lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} pieceName, {{type|number}} gameframe&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMap&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{type|string}} &amp;quot;piecename1&amp;quot; = {{type|number}} pieceNum1, ... , {{type|string}} &amp;quot;piecenameN&amp;quot; = {{type|number}} pieceNumN }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceList&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|string}} &amp;quot;piecename&amp;quot;, ... , {{bracket|pieceNumN}} = {{type|string}} &amp;quot;piecename&amp;quot; }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceInfo&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|table}} pieceInfo&lt;br /&gt;
|info = {{new|95.0}} &amp;quot;parent&amp;quot; field&amp;lt;br&amp;gt;{{new|101.0}} parent for root pieces is now &amp;quot;[null]&amp;quot; instead of &amp;quot;&amp;quot;&amp;lt;br&amp;gt; table pieceInfo contains:&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;pre&amp;gt;pieceInfo = {&lt;br /&gt;
    &amp;quot;name&amp;quot;     = string &amp;quot;piecename&amp;quot;,&lt;br /&gt;
    &amp;quot;isEmpty&amp;quot;  = boolean,&lt;br /&gt;
    &amp;quot;children&amp;quot; = { [1] = string &amp;quot;piecename&amp;quot;, ... },&lt;br /&gt;
    &amp;quot;min&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;max&amp;quot;      = { [1] = number x, [2] = number y, [3] = number z },&lt;br /&gt;
    &amp;quot;offset&amp;quot;   = { [1] = number x, [2] = number y, [3] = number z }, &lt;br /&gt;
    &amp;quot;parent&amp;quot; = string &amp;quot;parentpiecename&amp;quot;,   &lt;br /&gt;
  }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosition&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ&lt;br /&gt;
|info = Returns piece position in unit space. Also remember to multiply the x-axis value with -1 if you want to move a piece to another piece.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceDirection&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Fixed since 101. Now returns the same direction as Spring.GetUnitPiecePosDir.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePiecePosDir&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} pieceNum &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} posX, {{type|number}} posY, {{type|number}} posZ, {{type|number}} dirX, {{type|number}} dirY, {{type|number}} dirZ&lt;br /&gt;
|info = Returns piece position and direction in world space. The direction (dirX, dirY, dirZ) is not necessarily normalized. The position is defined as the position of the first vertex of the piece and it defines direction as the direction in which the line from the first vertex to the second vertex points.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetFeaturePieceMatrix&lt;br /&gt;
|arg1 = {{type|number}} featureID&lt;br /&gt;
|arg2 = {{type|number}} piece&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = { {{bracket|1}} = {{type|number}}, ... , {{bracket|16}} = {{type|number}} }&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== COB ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBUnitVar&lt;br /&gt;
|arg1 = {{type|number}} unitID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBTeamVar&lt;br /&gt;
|arg1 = {{type|number}} teamID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBAllyTeamVar&lt;br /&gt;
|arg1 = {{type|number}} allyID&lt;br /&gt;
|arg2 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetCOBGlobalVar&lt;br /&gt;
|arg1 = {{type|number}} varID {{bracket}}&lt;br /&gt;
|arg2 = {{type|bool}} unpack = false {{rbracket}}&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} value {{pipe}} {{type|number}} unpackedX, {{type|number}} unpackedY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Ground ==&lt;br /&gt;
&amp;lt;font color=&amp;quot;#55ee99&amp;quot;&amp;gt;Elevation is y. Water level is always at y=0. Ground height can be changed during play (terraform or deformation).&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundOrigHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = This returns the ground&#039;s original height (i.e. before terraforming) at a given x,z position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundNormal&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z {{bracket}}&lt;br /&gt;
|arg3 = {{type|bool}} smoothedNormal = false {{rbracket}}&lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} x, {{type|number}} y, {{type|number}} z, {{type|number}} slope&lt;br /&gt;
|info = {{new|100.0}}: smoothedNormal and slope&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundInfo&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|string}} &amp;quot;Type&amp;quot;, {{type|number}} metal, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundBlocked&lt;br /&gt;
|arg1 = {{type|number}} x1&lt;br /&gt;
|arg2 = {{type|number}} z1&lt;br /&gt;
|arg3 = {{type|number}} x2&lt;br /&gt;
|arg4 = {{type|number}} z2&lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;feature&amp;quot;, {{type|number}} featureID {{pipe}} {{type|string}} &amp;quot;unit&amp;quot;, {{type|number}} unitID&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGroundExtremes&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|number}} minHeight, {{type|number}} maxHeight&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetSmoothMeshHeight&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} y&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalMapSize&lt;br /&gt;
|arg1 = &lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} sizeX, {{type|number}} sizeY&lt;br /&gt;
|info = &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalAmount&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} metalAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetMetalExtraction&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} extractionAmount &lt;br /&gt;
|info = With x &amp;amp; z in metal map coordinates (worldspace/16)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetTerrainTypeData&lt;br /&gt;
|arg1 = {{type|number}} i&lt;br /&gt;
|arg2 = &lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|nil}} {{pipe}} {{type|string}} &amp;quot;name&amp;quot;, {{type|number}} hardness, {{type|number}} tankSpeed, {{type|number}} kbotSpeed, {{type|number}} hoverSpeed, {{type|number}} shipSpeed, {{type|bool}} receiveTracks&lt;br /&gt;
|info = {{new|92.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallout&lt;br /&gt;
|prefix = Spring.&lt;br /&gt;
|name = GetGrass&lt;br /&gt;
|arg1 = {{type|number}} x&lt;br /&gt;
|arg2 = {{type|number}} z&lt;br /&gt;
|arg3 = &lt;br /&gt;
|arg4 = &lt;br /&gt;
|arg5 = &lt;br /&gt;
|arg6 = &lt;br /&gt;
|arg7 = &lt;br /&gt;
|arg8 = &lt;br /&gt;
|arg9 =&lt;br /&gt;
|return = {{type|number}} 0 {{pipe}} {{type|number}} 1 {{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>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_UnsyncedRead&amp;diff=12422</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=12422"/>
		<updated>2022-01-23T20:08:23Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Time */&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 = Gets globalRendering-&amp;gt;timeOffset, which contains the offset of the current draw frame from the last sim frame, expressed in fractions of a frame. Ideally, when running 30hz sim, and 60hz rendering, the draw frames should have and offset of either 0.0 frames, or 0.5 frames. When draw frames are not integer multiples of sim frames, some interpolation happens, and this timeoffset shows how far along it is. &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>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12477</id>
		<title>Lua VFS</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12477"/>
		<updated>2022-01-14T11:17:23Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Files */&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;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Although Spring can access the filesystem directly (via os module) it is more common that you&lt;br /&gt;
would want to access files included with your game or Spring. Trouble is, most of these files are&lt;br /&gt;
compressed into archives (.sdz/.sd7) so random access would generally be a difficult procedure.&lt;br /&gt;
Fortunately, the Spring Lua system automatically provides access to mod and base files via the VFS module.&lt;br /&gt;
&lt;br /&gt;
The VFS module doesn&#039;t simply open archives though. What it does is map your game files, game &lt;br /&gt;
dependencies and Spring content onto a virtual file tree. All archives start from the &#039;roots&#039; of the tree&lt;br /&gt;
and share the same virtual space, meaning that if two or more archives contain the same resource&lt;br /&gt;
file name the resources overlap and only one of the files will be retrieved. Overlapping directories&lt;br /&gt;
on the other hand are merged so the resulting virtual directory contains the contents of both. Here is&lt;br /&gt;
an example of how this works:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Archive 1 (games/mygame.sd7)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
models&amp;lt;br&amp;gt;&lt;br /&gt;
|__ model1.mdl&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Archive 2 (base/springcontent.sdz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture2.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture3.png&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture2.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture3.png&amp;lt;br&amp;gt;&lt;br /&gt;
models&amp;lt;br&amp;gt;&lt;br /&gt;
|__ model1.mdl&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This raises the question: If both archives have a texture1.png then which texture1.png is retreived&lt;br /&gt;
via the VFS? The answer depends on the order the archives are loaded and the VFS mode (more on&lt;br /&gt;
modes below). Generally however, each archive loaded overrides any archives loaded&lt;br /&gt;
before it. The standard order of loading (from first to last) is:&lt;br /&gt;
&lt;br /&gt;
#  The main Spring/ game directory.&lt;br /&gt;
#  The automatic dependencies springcontent.sdz and maphelper.sdz.&lt;br /&gt;
#  Dependencies listed in your modinfo.lua (or modinfo.tdf), in the order listed.&lt;br /&gt;
#  Your mod archive.&lt;br /&gt;
&lt;br /&gt;
= Modes =&lt;br /&gt;
&lt;br /&gt;
These modes are constants passed to VFS.Include() and friends to control the order that archives are&lt;br /&gt;
searched for a given file. They are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW&#039;&#039;&#039; Only select uncompressed files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MOD&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MAP&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.BASE&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MENU&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP&#039;&#039;&#039;   Only select compressed files (.sdz,.sd7).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_FIRST&#039;&#039;&#039;  Try uncompressed files first, then compressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_FIRST&#039;&#039;&#039;  Try compressed files first, then uncompressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.RAW)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.ZIP.)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/spring/spring/blob/develop/rts/System/FileSystem/VFSModes.h&lt;br /&gt;
&lt;br /&gt;
= Files =&lt;br /&gt;
&#039;&#039;&#039;VFS.Include&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(if enviroment=nil then use current one)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, table enviroment = nil [, number mode ] ] ) -&amp;gt;&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The environment arg sets the global environment (see generic lua refs). In almost all cases, this should be left nil to preserve Springs default.  &lt;br /&gt;
&lt;br /&gt;
If nil then the env will be _G (global environment) If the optional env argument is provided any non-local variables and functions defined in&lt;br /&gt;
filename.lua are then accessable via env or _G. Vise-versa, any variables defined in env prior to&lt;br /&gt;
passing to VFS.Include are available to code in the included file. Code running in filename.lua will&lt;br /&gt;
see the contents of env in place of the normal _G environment. &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;This loads and compiles the lua code from a file in the VFS. The path is relative to the main Spring directory, e.g. VFS.Include(&#039;LuaUI/includes/filename.lua&#039;, nil, [vfsmode]) &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;VFS modes are single char strings and can be concatenated; doing specifies an order of preference for the mode (=location) from which to include files.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.LoadFile&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; nil | string data&lt;br /&gt;
&#039;&#039;&#039;VFS.FileExists&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; boolean&lt;br /&gt;
&amp;lt;span class=note&amp;gt;example usage: if VFS.FileExists(&amp;quot;maps/Castles.sdz&amp;quot;) then ... end &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DirList&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot; [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string filename, ... }&lt;br /&gt;
&#039;&#039;&#039;VFS.SubDirs&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot;, [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string subdir1, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAvailableAIs&#039;&#039;&#039;&lt;br /&gt;
  ( [ string gameName] [, string mapName ] )&lt;br /&gt;
    -&amp;gt; { ai1, ai2, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Gets a list of all Spring AIs. The optional gameName and mapName parameters can be used to include game/map specific LuaAIs in the list.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UseArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ], lua_function [, arg1 [,arg2 ]] )&lt;br /&gt;
    -&amp;gt; result1,result2,... of the given lua_function&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Loads an archive &#039;&#039;&#039;temporarely&#039;&#039;&#039; in the VFS and then runs the given lua_function,&amp;lt;br&amp;gt;which can make usage of the files in the archive.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;, [string checksum of archive] )&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Permanently loads an archive into the VFS (to load zipped music collections etc.). &amp;lt;br&amp;gt; Does nothing if the archive is already loaded in the VFS (won&#039;t reload even if there are &amp;lt;br&amp;gt; changes made to the archive). If checksum is given it checks if the to be loaded file is correct,&amp;lt;br&amp;gt;if not then it won&#039;t load it and return false.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnmapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 98.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;)&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Removes an already loaded archive (see VFS.MapArchive)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.CompressFolder&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;folderPath&amp;quot; [, string &amp;quot;archiveType&amp;quot; ] [, string &amp;quot;compressedFilePath&amp;quot; ] &amp;lt;br&amp;gt; [, bool includeFolder ] [, number mode ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Compresses the specified folder. &amp;lt;br&amp;gt;archiveType defines the compression type which can currently be only &amp;quot;zip&amp;quot; &amp;lt;br&amp;gt;includeFolder specifies whether the archive should have the specified folder as root (defaults to false) &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetFileAbsolutePath&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; absPath | nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveContainingFile&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; archiveNameWithVersion | nil&lt;br /&gt;
&lt;br /&gt;
= Generic hash =&lt;br /&gt;
&#039;&#039;&#039;VFS.CalculateHash&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string input, number hashType)&lt;br /&gt;
    -&amp;gt; string md5hash&lt;br /&gt;
&lt;br /&gt;
Calculates hash (in base64 form) of a given string (with md5 support initially). Note supplying 0 (MD5) as hashType is mandatory&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetMaps&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string mapName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetGames&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string gameName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAllArchives&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetLoadedArchives&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchivePath&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string archivePathOnDisk&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetNameFromRapidTag&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string rapidTag ) -&amp;gt; string archiveName&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.HasArchive&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveInfo&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) - &amp;gt;&lt;br /&gt;
     {        &lt;br /&gt;
          name = string,&lt;br /&gt;
          shortname = string,&lt;br /&gt;
          version = string,&lt;br /&gt;
          mutator = string,&lt;br /&gt;
          game = string,&lt;br /&gt;
          shortgame = string,&lt;br /&gt;
          description = string,&lt;br /&gt;
          mapfile = string,&lt;br /&gt;
          modtype = number,     &lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;modtype values:1=primary, 0=hidden, 3=map&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveChecksum&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string singleArchiveChecksum, string completeArchiveChecksum&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveDependencies&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveReplaces&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DownloadArchive&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( name, category ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Category must be one of: map, game, engine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.AbortDownload&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( id ) -&amp;gt; boolean foundAndRemoved&lt;br /&gt;
&lt;br /&gt;
Additional functions are available as part of the [[Lua_UnsyncedCtrl#.28Virtual-.29FileSystem|unsynced ctrl]].&lt;br /&gt;
&lt;br /&gt;
= Packing =&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot; style=&amp;quot;font-size:110%&amp;quot;&amp;gt;The Pack- and Unpack-functions are used to convert numbers-&amp;gt;strings and strings-&amp;gt;numbers.&lt;br /&gt;
So you can read a binary file and then convert the received strings back to numbers and the other way around. Also you can use it in combination with the SendLuaXYZMsg-functions.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( number arg1, number arg2, number arg3, ... )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( {[1]=number,[2]=number,..} )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackX( string &amp;quot;binary&amp;quot; [, number position = 1] [, number count] )&#039;&#039;&#039;&lt;br /&gt;
  -&amp;gt; number | table { [1]=number,[2]=number,.. }&lt;br /&gt;
&lt;br /&gt;
= Zlib =&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibCompress&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;uncompressedStr&amp;quot; )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;compressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibDecompress&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;available in synced, too!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;compressedStr&amp;quot; [, number uncompressed size = 65500] )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;uncompressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12476</id>
		<title>Lua VFS</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12476"/>
		<updated>2022-01-14T11:13:41Z</updated>

		<summary type="html">&lt;p&gt;Beherith: &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;
= Overview =&lt;br /&gt;
&lt;br /&gt;
Although Spring can access the filesystem directly (via os module) it is more common that you&lt;br /&gt;
would want to access files included with your game or Spring. Trouble is, most of these files are&lt;br /&gt;
compressed into archives (.sdz/.sd7) so random access would generally be a difficult procedure.&lt;br /&gt;
Fortunately, the Spring Lua system automatically provides access to mod and base files via the VFS module.&lt;br /&gt;
&lt;br /&gt;
The VFS module doesn&#039;t simply open archives though. What it does is map your game files, game &lt;br /&gt;
dependencies and Spring content onto a virtual file tree. All archives start from the &#039;roots&#039; of the tree&lt;br /&gt;
and share the same virtual space, meaning that if two or more archives contain the same resource&lt;br /&gt;
file name the resources overlap and only one of the files will be retrieved. Overlapping directories&lt;br /&gt;
on the other hand are merged so the resulting virtual directory contains the contents of both. Here is&lt;br /&gt;
an example of how this works:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Archive 1 (games/mygame.sd7)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
models&amp;lt;br&amp;gt;&lt;br /&gt;
|__ model1.mdl&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Archive 2 (base/springcontent.sdz&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture2.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture3.png&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
textures&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture1.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture2.png&amp;lt;br&amp;gt;&lt;br /&gt;
|__ texture3.png&amp;lt;br&amp;gt;&lt;br /&gt;
models&amp;lt;br&amp;gt;&lt;br /&gt;
|__ model1.mdl&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This raises the question: If both archives have a texture1.png then which texture1.png is retreived&lt;br /&gt;
via the VFS? The answer depends on the order the archives are loaded and the VFS mode (more on&lt;br /&gt;
modes below). Generally however, each archive loaded overrides any archives loaded&lt;br /&gt;
before it. The standard order of loading (from first to last) is:&lt;br /&gt;
&lt;br /&gt;
#  The main Spring/ game directory.&lt;br /&gt;
#  The automatic dependencies springcontent.sdz and maphelper.sdz.&lt;br /&gt;
#  Dependencies listed in your modinfo.lua (or modinfo.tdf), in the order listed.&lt;br /&gt;
#  Your mod archive.&lt;br /&gt;
&lt;br /&gt;
= Modes =&lt;br /&gt;
&lt;br /&gt;
These modes are constants passed to VFS.Include() and friends to control the order that archives are&lt;br /&gt;
searched for a given file. They are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW&#039;&#039;&#039; Only select uncompressed files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MOD&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MAP&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.BASE&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MENU&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP&#039;&#039;&#039;   Only select compressed files (.sdz,.sd7).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_FIRST&#039;&#039;&#039;  Try uncompressed files first, then compressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_FIRST&#039;&#039;&#039;  Try compressed files first, then uncompressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.RAW)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.ZIP.)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/spring/spring/blob/develop/rts/System/FileSystem/VFSModes.h&lt;br /&gt;
&lt;br /&gt;
= Files =&lt;br /&gt;
&#039;&#039;&#039;VFS.Include&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(if enviroment=nil then use current one)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, table enviroment = nil [, number mode ] ] ) -&amp;gt;&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The environment arg sets the global environment (see generic lua refs). In almost all cases, this should be left nil to preserve Springs default.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;VFS modes are single char strings and can be concatenated; doing specifies an order of preference for the mode (=location) from which to include files.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.LoadFile&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; nil | string data&lt;br /&gt;
&#039;&#039;&#039;VFS.FileExists&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; boolean&lt;br /&gt;
&amp;lt;span class=note&amp;gt;example usage: if VFS.FileExists(&amp;quot;maps/Castles.sdz&amp;quot;) then ... end &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DirList&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot; [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string filename, ... }&lt;br /&gt;
&#039;&#039;&#039;VFS.SubDirs&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot;, [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string subdir1, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAvailableAIs&#039;&#039;&#039;&lt;br /&gt;
  ( [ string gameName] [, string mapName ] )&lt;br /&gt;
    -&amp;gt; { ai1, ai2, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Gets a list of all Spring AIs. The optional gameName and mapName parameters can be used to include game/map specific LuaAIs in the list.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UseArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ], lua_function [, arg1 [,arg2 ]] )&lt;br /&gt;
    -&amp;gt; result1,result2,... of the given lua_function&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Loads an archive &#039;&#039;&#039;temporarely&#039;&#039;&#039; in the VFS and then runs the given lua_function,&amp;lt;br&amp;gt;which can make usage of the files in the archive.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;, [string checksum of archive] )&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Permanently loads an archive into the VFS (to load zipped music collections etc.). &amp;lt;br&amp;gt; Does nothing if the archive is already loaded in the VFS (won&#039;t reload even if there are &amp;lt;br&amp;gt; changes made to the archive). If checksum is given it checks if the to be loaded file is correct,&amp;lt;br&amp;gt;if not then it won&#039;t load it and return false.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnmapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 98.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;)&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Removes an already loaded archive (see VFS.MapArchive)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.CompressFolder&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;folderPath&amp;quot; [, string &amp;quot;archiveType&amp;quot; ] [, string &amp;quot;compressedFilePath&amp;quot; ] &amp;lt;br&amp;gt; [, bool includeFolder ] [, number mode ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Compresses the specified folder. &amp;lt;br&amp;gt;archiveType defines the compression type which can currently be only &amp;quot;zip&amp;quot; &amp;lt;br&amp;gt;includeFolder specifies whether the archive should have the specified folder as root (defaults to false) &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetFileAbsolutePath&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; absPath | nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveContainingFile&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; archiveNameWithVersion | nil&lt;br /&gt;
&lt;br /&gt;
= Generic hash =&lt;br /&gt;
&#039;&#039;&#039;VFS.CalculateHash&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string input, number hashType)&lt;br /&gt;
    -&amp;gt; string md5hash&lt;br /&gt;
&lt;br /&gt;
Calculates hash (in base64 form) of a given string (with md5 support initially). Note supplying 0 (MD5) as hashType is mandatory&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetMaps&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string mapName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetGames&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string gameName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAllArchives&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetLoadedArchives&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchivePath&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string archivePathOnDisk&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetNameFromRapidTag&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string rapidTag ) -&amp;gt; string archiveName&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.HasArchive&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveInfo&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) - &amp;gt;&lt;br /&gt;
     {        &lt;br /&gt;
          name = string,&lt;br /&gt;
          shortname = string,&lt;br /&gt;
          version = string,&lt;br /&gt;
          mutator = string,&lt;br /&gt;
          game = string,&lt;br /&gt;
          shortgame = string,&lt;br /&gt;
          description = string,&lt;br /&gt;
          mapfile = string,&lt;br /&gt;
          modtype = number,     &lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;modtype values:1=primary, 0=hidden, 3=map&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveChecksum&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string singleArchiveChecksum, string completeArchiveChecksum&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveDependencies&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveReplaces&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DownloadArchive&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( name, category ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Category must be one of: map, game, engine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.AbortDownload&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( id ) -&amp;gt; boolean foundAndRemoved&lt;br /&gt;
&lt;br /&gt;
Additional functions are available as part of the [[Lua_UnsyncedCtrl#.28Virtual-.29FileSystem|unsynced ctrl]].&lt;br /&gt;
&lt;br /&gt;
= Packing =&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot; style=&amp;quot;font-size:110%&amp;quot;&amp;gt;The Pack- and Unpack-functions are used to convert numbers-&amp;gt;strings and strings-&amp;gt;numbers.&lt;br /&gt;
So you can read a binary file and then convert the received strings back to numbers and the other way around. Also you can use it in combination with the SendLuaXYZMsg-functions.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( number arg1, number arg2, number arg3, ... )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( {[1]=number,[2]=number,..} )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackX( string &amp;quot;binary&amp;quot; [, number position = 1] [, number count] )&#039;&#039;&#039;&lt;br /&gt;
  -&amp;gt; number | table { [1]=number,[2]=number,.. }&lt;br /&gt;
&lt;br /&gt;
= Zlib =&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibCompress&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;uncompressedStr&amp;quot; )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;compressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibDecompress&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;available in synced, too!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;compressedStr&amp;quot; [, number uncompressed size = 65500] )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;uncompressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12475</id>
		<title>Lua VFS</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_VFS&amp;diff=12475"/>
		<updated>2022-01-14T11:05:32Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Modes */&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;
= Modes =&lt;br /&gt;
&lt;br /&gt;
These modes are constants passed to VFS.Include() and friends to control the order that archives are&lt;br /&gt;
searched for a given file. They are case-sensitive.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW&#039;&#039;&#039; Only select uncompressed files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MOD&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MAP&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.BASE&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MENU&#039;&#039;&#039;  {{new|104.0}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP&#039;&#039;&#039;   Only select compressed files (.sdz,.sd7).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_FIRST&#039;&#039;&#039;  Try uncompressed files first, then compressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_FIRST&#039;&#039;&#039;  Try compressed files first, then uncompressed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.RAW_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.RAW)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZIP_ONLY&#039;&#039;&#039; &amp;lt;font color=#55ee99&amp;gt;(Deprecated. Same as VFS.ZIP.)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also: https://github.com/spring/spring/blob/develop/rts/System/FileSystem/VFSModes.h&lt;br /&gt;
&lt;br /&gt;
= Files =&lt;br /&gt;
&#039;&#039;&#039;VFS.Include&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;(if enviroment=nil then use current one)&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, table enviroment = nil [, number mode ] ] ) -&amp;gt;&lt;br /&gt;
&amp;lt;span class=note&amp;gt;The environment arg sets the global environment (see generic lua refs). In almost all cases, this should be left nil to preserve Springs default.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;VFS modes are single char strings and can be concatenated; doing specifies an order of preference for the mode (=location) from which to include files.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.LoadFile&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; nil | string data&lt;br /&gt;
&#039;&#039;&#039;VFS.FileExists&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; boolean&lt;br /&gt;
&amp;lt;span class=note&amp;gt;example usage: if VFS.FileExists(&amp;quot;maps/Castles.sdz&amp;quot;) then ... end &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DirList&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot; [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string filename, ... }&lt;br /&gt;
&#039;&#039;&#039;VFS.SubDirs&#039;&#039;&#039;&lt;br /&gt;
  ( string &amp;quot;directory&amp;quot;, [, string &amp;quot;pattern&amp;quot; = &amp;quot;*&amp;quot;  [, number mode ] ] )&lt;br /&gt;
    -&amp;gt; { [1] = string subdir1, ... }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAvailableAIs&#039;&#039;&#039;&lt;br /&gt;
  ( [ string gameName] [, string mapName ] )&lt;br /&gt;
    -&amp;gt; { ai1, ai2, ... }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;Gets a list of all Spring AIs. The optional gameName and mapName parameters can be used to include game/map specific LuaAIs in the list.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UseArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ], lua_function [, arg1 [,arg2 ]] )&lt;br /&gt;
    -&amp;gt; result1,result2,... of the given lua_function&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Loads an archive &#039;&#039;&#039;temporarely&#039;&#039;&#039; in the VFS and then runs the given lua_function,&amp;lt;br&amp;gt;which can make usage of the files in the archive.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.MapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;, [string checksum of archive] )&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Permanently loads an archive into the VFS (to load zipped music collections etc.). &amp;lt;br&amp;gt; Does nothing if the archive is already loaded in the VFS (won&#039;t reload even if there are &amp;lt;br&amp;gt; changes made to the archive). If checksum is given it checks if the to be loaded file is correct,&amp;lt;br&amp;gt;if not then it won&#039;t load it and return false.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnmapArchive&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 98.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename/modname of archive&amp;quot;)&lt;br /&gt;
    -&amp;gt; bool&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Removes an already loaded archive (see VFS.MapArchive)&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.CompressFolder&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;folderPath&amp;quot; [, string &amp;quot;archiveType&amp;quot; ] [, string &amp;quot;compressedFilePath&amp;quot; ] &amp;lt;br&amp;gt; [, bool includeFolder ] [, number mode ] ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;Compresses the specified folder. &amp;lt;br&amp;gt;archiveType defines the compression type which can currently be only &amp;quot;zip&amp;quot; &amp;lt;br&amp;gt;includeFolder specifies whether the archive should have the specified folder as root (defaults to false) &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetFileAbsolutePath&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; absPath | nil&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveContainingFile&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only! available in 105.0&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;filename&amp;quot; [, number mode ] ) -&amp;gt; archiveNameWithVersion | nil&lt;br /&gt;
&lt;br /&gt;
= Generic hash =&lt;br /&gt;
&#039;&#039;&#039;VFS.CalculateHash&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( string input, number hashType)&lt;br /&gt;
    -&amp;gt; string md5hash&lt;br /&gt;
&lt;br /&gt;
Calculates hash (in base64 form) of a given string (with md5 support initially). Note supplying 0 (MD5) as hashType is mandatory&lt;br /&gt;
&lt;br /&gt;
= Archives =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetMaps&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string mapName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetGames&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string gameName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetAllArchives&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetLoadedArchives&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( ) -&amp;gt; {&lt;br /&gt;
   [1] = string archiveName, ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchivePath&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string archivePathOnDisk&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetNameFromRapidTag&#039;&#039;&#039; {{new|105.0}}&lt;br /&gt;
  ( string rapidTag ) -&amp;gt; string archiveName&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.HasArchive&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; boolean&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveInfo&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) - &amp;gt;&lt;br /&gt;
     {        &lt;br /&gt;
          name = string,&lt;br /&gt;
          shortname = string,&lt;br /&gt;
          version = string,&lt;br /&gt;
          mutator = string,&lt;br /&gt;
          game = string,&lt;br /&gt;
          shortgame = string,&lt;br /&gt;
          description = string,&lt;br /&gt;
          mapfile = string,&lt;br /&gt;
          modtype = number,     &lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;modtype values:1=primary, 0=hidden, 3=map&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveChecksum&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; string singleArchiveChecksum, string completeArchiveChecksum&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveDependencies&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.GetArchiveReplaces&#039;&#039;&#039; {{new|98.0}}&lt;br /&gt;
  ( string archiveName ) -&amp;gt; { &lt;br /&gt;
    [1] = string archiveName, ... &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.DownloadArchive&#039;&#039;&#039; {{new|101.0}}&lt;br /&gt;
  ( name, category ) -&amp;gt; nil&lt;br /&gt;
&lt;br /&gt;
Category must be one of: map, game, engine.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.AbortDownload&#039;&#039;&#039; {{new|104.0}}&lt;br /&gt;
  ( id ) -&amp;gt; boolean foundAndRemoved&lt;br /&gt;
&lt;br /&gt;
Additional functions are available as part of the [[Lua_UnsyncedCtrl#.28Virtual-.29FileSystem|unsynced ctrl]].&lt;br /&gt;
&lt;br /&gt;
= Packing =&lt;br /&gt;
&amp;lt;span class=&amp;quot;note&amp;quot; style=&amp;quot;font-size:110%&amp;quot;&amp;gt;The Pack- and Unpack-functions are used to convert numbers-&amp;gt;strings and strings-&amp;gt;numbers.&lt;br /&gt;
So you can read a binary file and then convert the received strings back to numbers and the other way around. Also you can use it in combination with the SendLuaXYZMsg-functions.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( number arg1, number arg2, number arg3, ... )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.PackX( {[1]=number,[2]=number,..} )&#039;&#039;&#039; -&amp;gt; string&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackU32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS16&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackS32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackF32&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=note&amp;gt;arguments are:&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.UnpackX( string &amp;quot;binary&amp;quot; [, number position = 1] [, number count] )&#039;&#039;&#039;&lt;br /&gt;
  -&amp;gt; number | table { [1]=number,[2]=number,.. }&lt;br /&gt;
&lt;br /&gt;
= Zlib =&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibCompress&#039;&#039;&#039; &amp;lt;span class=warning&amp;gt;unsynced only!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;uncompressedStr&amp;quot; )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;compressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VFS.ZlibDecompress&#039;&#039;&#039; &amp;lt;span class=note&amp;gt;available in synced, too!&amp;lt;/span&amp;gt;&lt;br /&gt;
  ( string &amp;quot;compressedStr&amp;quot; [, number uncompressed size = 65500] )&lt;br /&gt;
    -&amp;gt; nil | string &amp;quot;uncompressedStr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12069</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=12069"/>
		<updated>2021-12-14T13:11:15Z</updated>

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

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

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

		<summary type="html">&lt;p&gt;Beherith: /* Synced Only */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lua Callins =&lt;br /&gt;
This page is future looking to unified widget/gadget (aka &amp;quot;addon&amp;quot;) handler, which may yet be some way off, c.f. the [https://github.com/spring/spring/blob/ebb704e008f6ea645947d07be1cfcc272af0428f/doc/changelog.txt#L71 changelog].&lt;br /&gt;
&lt;br /&gt;
Related Sourcecode :&lt;br /&gt;
[https://github.com/spring/spring/blob/d9b3927a528a876b9ab4042771e82b050267572a/rts/Lua/LuaHandle.cpp https://github.com/spring/spring/rts/Lua/LuaHandle.cpp]&lt;br /&gt;
&lt;br /&gt;
For now, to use these addons in a widget, replace addon with widget and, for a gadget, replace addon with gadget. For example,&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
    function widget:UnitCreated(unitID, unitDefID, unitTeam, builderID)&lt;br /&gt;
        ...  &lt;br /&gt;
    end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some functions may differ between (synced) gadget and widgets; those are in the [[#Synced_-_Unsynced_Shared]] section. Essentially the reason is that all information should be available to synced (game logic controlling) gadgets, but restricted to unsynced gadget/widget (e.g. information about an enemy unit only detected via radar and not yet in LOS). In such cases the full (synced) param list is documented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: maroon;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention:&#039;&#039;&#039;&amp;lt;/span&amp;gt; some callins will only work on the unsynced portion of the gadget. Due to the type-unsafe nature of lua parsing, those callins not firing up might be hard to trace. This document will be continuously updated to properly alert about those situations.&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Initialize&lt;br /&gt;
|info = Called when the addon is (re)loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Shutdown&lt;br /&gt;
|info = Called when the addon or the game is shutdown.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Unsynced Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DefaultCommand&lt;br /&gt;
|args = type, id&lt;br /&gt;
|return = {{type|number}} cmdID&lt;br /&gt;
|info = Used to set the default command when a unit is selected. First parameter is the type of the object pointed at (either &amp;quot;unit or &amp;quot;feature&amp;quot;) and the second is its {{var|unitID}} or {{var|featureID}} respectively. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandNotify&lt;br /&gt;
|args = cmdID, cmdParams, cmdOptions&lt;br /&gt;
|return = {{type|bool}} removeCmd&lt;br /&gt;
|info = Called when a command is issued. Returning {{value|true}} deletes the command and does not send it through the network.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandsChanged&lt;br /&gt;
|args = None&lt;br /&gt;
|return = ?&lt;br /&gt;
|info = Called when the command descriptions changed, e.g. when selecting or deselecting a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = WorldTooltip&lt;br /&gt;
|args = ttType, data1, data2, data3&lt;br /&gt;
|return = {{type|string}} newTooltip&lt;br /&gt;
|info = The parameters can be {{value|&amp;quot;unit&amp;quot;}}, {{var|unitID}}; {{value|&amp;quot;feature&amp;quot;}}, {{var|featureID}}; {{value|&amp;quot;ground&amp;quot;}}, {{var|posX}}, {{var|posY}}, {{var|posZ}} or {{value|&amp;quot;selection&amp;quot;}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnsyncedHeightMapUpdate&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = Called when the unsynced copy of the height-map is altered.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameProgress&lt;br /&gt;
|args = serverFrameNum&lt;br /&gt;
|info = Called every 60 frames, calculating delta between GameFrame and GameProgress. Can give an ETA about catching up with simulation for mid-game join players.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameSetup&lt;br /&gt;
|args =  state, ready, playerStates&lt;br /&gt;
|return = {{type|bool}} success, {{type|bool}} newReady&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = SunChanged&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AddConsoleLine&lt;br /&gt;
|args = msg, priority&lt;br /&gt;
|info = Called when text is entered into the console (e.g. Spring.Echo).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvSkirmishAIMessage&lt;br /&gt;
|args = aiTeam, dataStr&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvFromSynced&lt;br /&gt;
|args = ...&lt;br /&gt;
|info = Receives data sent via [[Lua_System#Synced|SendToUnsynced]] callout.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Save&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called when a chat command &#039;/save&#039; or &#039;/savegame&#039; is received. The single argument is a userdatum representing the savegame zip file. See [[Lua_SaveLoad#Save_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = LoadProgress&lt;br /&gt;
|args = message, replaceLastLine&lt;br /&gt;
|info = Only available to LuaIntro.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GroupChanged&lt;br /&gt;
|args = groupID&lt;br /&gt;
|info = Called when a unit is added to or removed from a control group. Currently implemented for widgets only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ConfigureLayout&lt;br /&gt;
|args = ???&lt;br /&gt;
|return = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Input ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = IsAbove&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|bool}} isAbove&lt;br /&gt;
|info = Called every Update. Must return {{value|true}} for {{name|Mouse*}} events and {{name|GetToolTip}} to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GetTooltip&lt;br /&gt;
|args = x, y&lt;br /&gt;
|return = {{type|string}} tooltip&lt;br /&gt;
|info = Called when {{name|IsAbove}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyPress&lt;br /&gt;
|args = key, mods, isRepeat&lt;br /&gt;
|return = {{type|bool}} becomeOwner&lt;br /&gt;
|info = Called repeatedly when a key is pressed down. If you want an action to occur only once check for {{var|1=isRepeat == {{value|false}}}}. The {{var|mods}} parameter is a {{type|table}}, with keys {{value|&amp;quot;alt&amp;quot;}}, {{value|&amp;quot;ctrl&amp;quot;}}, {{value|&amp;quot;meta&amp;quot;}} and {{value|&amp;quot;shift&amp;quot;}} each having a boolean value. Return {{value|true}} if you don&#039;t want other callins or the engine to also receive this keypress. A list of key codes can be seen at the [https://wiki.libsdl.org/SDLKeycodeLookup SDL wiki].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = KeyRelease&lt;br /&gt;
|args = key&lt;br /&gt;
|return = {{type|bool}}&lt;br /&gt;
|info = Called when the key is released.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TextInput&lt;br /&gt;
|args = utf8char&lt;br /&gt;
|info = Called whenever a key press results in text input. Introduced in 97.0.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = JoystickEvent&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MousePress&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = {{type|bool}} becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is pressed. The {{var|button}} parameter supports up to 7 buttons. Must return {{value|true}} for {{name|MouseRelease}} and other functions to be called.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseRelease&lt;br /&gt;
|args = x, y, button&lt;br /&gt;
|return = bool becomeMouseOwner&lt;br /&gt;
|info = Called when a mouse button is released. Please note that in order to have Spring call {{name|MouseRelease}}, you need to have a {{name|MousePress}} call-in in the same addon that returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseWheel&lt;br /&gt;
|args = up, value&lt;br /&gt;
|info = Called when the mouse wheel is moved. The parameters indicate the direction and amount of travel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MouseMove&lt;br /&gt;
|args = x, y, dx, dy, button&lt;br /&gt;
|info = Called when the mouse is moved. The {{var|dx}} and {{var|dy}} parameters indicate the distance travelled, whereas the first two indicate the final position.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Players ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerChanged&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a player&#039;s status changes e.g. becoming a spectator.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerAdded&lt;br /&gt;
|args = playerID&lt;br /&gt;
|info = Called whenever a new player joins the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = PlayerRemoved&lt;br /&gt;
|args = playerID, reason&lt;br /&gt;
|info = Called whenever a player is removed from the game.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Downloads ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadStarted&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download is started via [[Lua_VFS#Archives|VFS.DownloadArchive]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFinished&lt;br /&gt;
|args = id&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download finishes successfully.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadFailed&lt;br /&gt;
|args = id, errorID&lt;br /&gt;
|info = Called when a [[Pr-downloader]] download fails to complete.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DownloadProgress&lt;br /&gt;
|args = id, downloaded, total&lt;br /&gt;
|info = Called incrementally during a [[Pr-downloader]] download.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Drawing ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ViewResize&lt;br /&gt;
|args = viewSizeX, viewSizeY&lt;br /&gt;
|info = Called whenever the window is resized.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Update&lt;br /&gt;
|args = dt&lt;br /&gt;
|info = Called for every draw frame (including when the game is paused) and at least once per sim frame except when catching up. The parameter is the time since the last update. }}&lt;br /&gt;
&lt;br /&gt;
=== Draw* Functions ===&lt;br /&gt;
Inside the Draw* functions, you can use the [[Lua_OpenGL_Api | Lua OpenGL Api]] to draw graphics.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Avoid doing heavy calculations inside these callins; ideally, do the calculations elsewhere and use Draw callins only for drawing.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGenesis&lt;br /&gt;
|info = Doesn&#039;t render to screen! Use this callin to update textures, shaders, etc. Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreParticles&lt;br /&gt;
|info = ??? {{new|104.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldPreUnit&lt;br /&gt;
|info = Spring draws units, features, some water types, cloaked units, and the sun.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorld&lt;br /&gt;
|info = Spring draws command queues, &#039;map stuff&#039;, and map marks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldShadow&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldReflection&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawWorldRefraction&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreForward&lt;br /&gt;
|info = Runs at the start of the forward pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPreDeferred&lt;br /&gt;
|info = Runs at the start of the deferred pass when a custom map shader has been assigned via [[Lua_UnsyncedCtrl#Map|{{name|Spring.SetMapShader}}]] (convenient for setting uniforms).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawGroundPostDeferred&lt;br /&gt;
|info = This runs at the end of its respective deferred pass and allows proper frame compositing (with ground flashes/decals/foliage/etc, which are drawn between it and [[#API:DrawWorldPreUnit|{{name|DrawWorldPreUnit}}]]) via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnitsPostDeferred&lt;br /&gt;
|info = Runs at the end of the unit deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeaturesPostDeferred&lt;br /&gt;
|info = Runs at the end of the feature deferred pass to inform Lua code it should make use of the {{value|$model_gbuffer_*}} textures before another pass overwrites them (and to allow proper blending with e.g. cloaked objects which are drawn between these events and [[#API:DrawWorld|{{name|DrawWorld}}]] via [[Lua_OpenGL_Api#Textures|{{name|gl.CopyToTexture}}]]). N.B. The *PostDeferred events are only sent (and only have a real purpose) if forward drawing is disabled.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreen&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = ??? Also available to LuaMenu.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenEffects&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = Where {{var|vsx}}, {{var|vsy}} are screen coordinates.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawScreenPost&lt;br /&gt;
|args = vsx, vsy&lt;br /&gt;
|info = {{new|104.0}} Similar to {{name|DrawScreenEffects}}, this can be used to alter the contents of a frame after it has been completely rendered (i.e. World, MiniMap, Menu, UI).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawLoadScreen&lt;br /&gt;
|info = {{new|95.0}} Only available to LuaIntro, draws custom load screens.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimap&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawInMinimapBackground&lt;br /&gt;
|args = sx, sy&lt;br /&gt;
|info = Where {{var|sx}}, {{var|sy}} are values relative to the minimap&#039;s position and scale.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Object Rendering ===&lt;br /&gt;
For the following calls {{var|drawMode}} can be one of the following, {{var|1=notDrawing = {{value|0}}}}, {{var|1=normalDraw = {{value|1}}}}, {{var|1=shadowDraw = {{value|2}}}}, {{var|1=reflectionDraw = {{value|3}}}}, {{var|1=refractionDraw = {{value|4}}}}, and finally {{var|1=gameDeferredDraw = {{value|5}}}} which was added in 102.0.&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawUnit&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of units, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawFeature&lt;br /&gt;
|args = unitID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of features, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].	&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawShield&lt;br /&gt;
|args = unitID, weaponID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of [[Gamedev:WeaponDefs#Shield_(WeaponType)|shields]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = DrawProjectile&lt;br /&gt;
|args = projectileID, drawMode&lt;br /&gt;
|return = {{type|bool}} suppressEngineDraw&lt;br /&gt;
|info = For custom rendering of weapon (&amp;amp; other) projectiles, [[Lua_UnitRendering#Lua.27s_DrawXYZ-Callin|enabled here]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Unsynced Menu Only ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDraw&lt;br /&gt;
|return = {{type|bool}} allowDraw&lt;br /&gt;
|info = Enables Draw{Genesis,Screen,ScreenPost} callins if {{value|true}} is returned, otherwise they are called once every 30 seconds. Only active when a game isn&#039;t running.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateMenu&lt;br /&gt;
|info = Called whenever LuaMenu is on with no game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ActivateGame&lt;br /&gt;
|info = Called whenever LuaMenu is on with a game loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced - Unsynced Shared ==&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GotChatMsg&lt;br /&gt;
|args = msg, player&lt;br /&gt;
|info = Called when a player issues a UI command e.g. types {{var|/foo}} or {{var|/luarules foo}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Game ===&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameID&lt;br /&gt;
|args = gameID&lt;br /&gt;
|info = Called once to deliver the {{var|gameID}}. As of 101.0+ the string is encoded in hex.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePaused&lt;br /&gt;
|info = Called when the game is paused.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameOver&lt;br /&gt;
|args = winningAllyTeams&lt;br /&gt;
|info = The parameter is a {{type|table}} list of winning allyTeams, if empty the game result was undecided (like when dropping from an host).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameFrame&lt;br /&gt;
|args = frame&lt;br /&gt;
|info = Called for every game simulation frame (30 per second). Starts at frame {{value|0}} in 101.0+ and {{value|1}} in previous versions.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GamePreload&lt;br /&gt;
|info = Called before the 0 gameframe. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = GameStart&lt;br /&gt;
|info = Called upon the start of the game. From 104.0 onwards, will not be called when a saved game is loaded.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Teams ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamChanged&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TeamDied&lt;br /&gt;
|args = teamID&lt;br /&gt;
|info = Called when a team dies (see [[Lua_SyncedCtrl#Game_End|Spring.KillTeam]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Units ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCreated&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, builderID&lt;br /&gt;
|info = Called at the moment the unit is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFinished&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called at the moment the unit is completed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFromFactory&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, factID, factDefID, userOrders&lt;br /&gt;
|info = Called when a factory finishes construction of a unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitReverseBuilt&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a living unit becomes a nanoframe again.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitGiven&lt;br /&gt;
|args = unitID, unitDefID, newTeam, oldTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called after {{name|UnitTaken}} and in that moment unit is assigned to the &#039;&#039;&#039;newTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitTaken&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam&lt;br /&gt;
|info = Called when a unit is transferred between teams. This is called before {{name|UnitGiven}} and in that moment unit is still assigned to the &#039;&#039;&#039;oldTeam&#039;&#039;&#039;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDamaged&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is damaged (after {{name|UnitPreDamaged}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a unit is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RenderUnitDestroyed&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called just before a unit is invalid, after it finishes its death animation. {{new|101.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitStunned&lt;br /&gt;
|args =  unitID, unitDefID, unitTeam, stunned&lt;br /&gt;
|info = Called when a unit changes its stun status. {{new|99.0}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnitCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when two units collide. Both units must be registered with [[Lua_System#Synced|Script.SetWatchUnit]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitFeatureCollision&lt;br /&gt;
|args = colliderID, collideeID&lt;br /&gt;
|info = Called when a unit collides with a feature. The unit must be registered with [[Lua_System#Synced|Script.SetWatchUnit]] and the feature registered with [[Lua_System#Synced|Script.SetWatchFeature]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called after when a unit accepts a command, after {{name|AllowCommand}} returns {{value|true}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCmdDone&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOpts, cmdTag&lt;br /&gt;
|info = Called when a unit completes a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLoaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is loaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitUnloaded&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, transportID, transportTeam&lt;br /&gt;
|info = Called when a unit is unloaded by a transport.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitExperience&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, experience, oldExperience&lt;br /&gt;
|info = Called when a unit gains experience greater or equal to the minimum limit set by calling [[Lua_SyncedCtrl#Other|Spring.SetExperienceGrade]]. Should be called more reliably with small values of experience grade in 104.0+.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitIdle&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit is idle (empty command queue).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitCloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit cloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitDecloaked&lt;br /&gt;
|args = unitID, unitDefID, unitTeam&lt;br /&gt;
|info = Called when a unit decloaks.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitMoveFailed&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented in base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = StockpileChanged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, weaponNum, oldCount, newCount&lt;br /&gt;
|info = Called when a units stockpile of weapons increases or decreases. See {{xtaglink|Gamedev:WeaponDefs|stockpile}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters LOS of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftLos&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves LOS of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit enters radar of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftRadar&lt;br /&gt;
|args = unitID, unitTeam, allyTeam, unitDefID&lt;br /&gt;
|info = Called when a unit leaves radar of an allyteam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftAir&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitEnteredWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitLeftWater&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ??? Not implemented by base handler&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitSeismicPing&lt;br /&gt;
|args = x, y, z, strength, allyTeam, unitID, unitDefID&lt;br /&gt;
|info = Called when a unit emits a seismic ping. See {{xtaglink|Gamedev:UnitDefs|seismicSignature}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureCreated&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is created.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDamaged&lt;br /&gt;
|args =  featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|info = Called when a feature is damaged.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureDestroyed&lt;br /&gt;
|args = featureID, allyTeamID&lt;br /&gt;
|info = Called when a feature is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeatureMoved&lt;br /&gt;
|args = ???&lt;br /&gt;
|info = ???&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Projectiles ===&lt;br /&gt;
The following Callins are only called for weaponDefIDs registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileCreated&lt;br /&gt;
|args = proID, proOwnerID, weaponDefID&lt;br /&gt;
|info = Called when the projectile is created. Note that {{var|weaponDefID}} is missing if the projectile is spawned as part of a burst, but [[Lua_SyncedRead#Projectiles|Spring.GetProjectileDefID]] and [[Lua_SyncedRead#Projectiles|Spring.GetProjectileName]] still work in callin scope using {{var|proID}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ProjectileDestroyed&lt;br /&gt;
|args = proID&lt;br /&gt;
|info = Called when the projectile is destroyed.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Synced Only ==&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = CommandFallback&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag&lt;br /&gt;
|return = {{type|bool}} used, {{type|bool}} finished&lt;br /&gt;
|info = Called when the unit reaches an unknown command in its queue (i.e. one not handled by the engine). If no addon returns {{var|used}} as {{value|true}} the command is dropped, if an addon returns {{value|true}}, {{value|true}} the command is removed because it&#039;s done, with {{value|true}}, {{value|false}} it&#039;s kept in the queue and {{name|CommandFallback}} gets called again on the next slowupdate.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowCommand&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, cmdID, cmdParams, cmdOptions, cmdTag, synced&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when the command is given, before the unit&#039;s queue is altered. The return value is whether it should be let into the queue. The queue remains untouched when a command is blocked, whether it would be queued or replace the queue.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitCreation&lt;br /&gt;
|args = unitDefID, builderID, builderTeam, x, y, z, facing&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before unit is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitTransfer&lt;br /&gt;
|args = unitID, unitDefID, oldTeam, newTeam, capture&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit is transferred to a different team, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowUnitBuildStep&lt;br /&gt;
|args = builderID, builderTeam, unitID, unitDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a unit progresses its build percentage, the boolean return value determines whether or not the build makes progress.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureCreation&lt;br /&gt;
|args = featureDefID, teamID, x, y, z&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before feature is created, the boolean return value determines whether or not the creation is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowFeatureBuildStep&lt;br /&gt;
|args = builderID, builderTeam, featureID, featureDefID, part&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before a feature progresses its build percentage, the boolean return value determines whether or not the progress change is permitted. Note that this is also called for resurrecting features, and for refilling features with resources before resurrection. On reclaim the part values are negative, and on refill and reclaim they are positive. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceLevel&lt;br /&gt;
|args = teamID, res, level&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called when a team sets the sharing level of a resource, the boolean return value determines whether or not the sharing level is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowResourceTransfer&lt;br /&gt;
|args = oldTeamID, newTeamID, res, amount&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Called just before resources are transferred between players, the boolean return value determines whether or not the transfer is permitted.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowStartPosition&lt;br /&gt;
|args = playerID, teamID, readyState, clampedX, clampedY, clampedZ, rawX, rawY, rawZ&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = {{var|clamped{X,Y,Z}}} are the coordinates clamped into start-boxes, {{var|raw}} is where player tried to place their marker. The {{var|readyState}} can be any one of &lt;br /&gt;
* {{value|0}} - player picked a position, &lt;br /&gt;
* {{value|1}} - player clicked ready, &lt;br /&gt;
* {{value|2}} - player pressed ready OR  the game was force-started (player did not click ready, but is now forcibly readied) or &lt;br /&gt;
* {{value|3}} - the player failed to load. &lt;br /&gt;
* {{new|95.0}} the default &#039;failed to choose&#039; start-position is the north-west point of their startbox, or (0,0,0) if they do not have a startbox. &lt;br /&gt;
NB: The order of the parameters changed with the addition of {{var|teamID}} in 104.0. Previouly it was:&lt;br /&gt;
{{var|clampedX, clampedY, clampedZ, playerID, readyState, rawX, rawY, rawZ}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowDirectUnitControl&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, playerID&lt;br /&gt;
|return = {{type|bool}} allow&lt;br /&gt;
|info = Determines if this unit can be controlled directly in FPS view.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTargetCheck&lt;br /&gt;
|args = attackerID, attackerWeaponNum, attackerWeaponDefID&lt;br /&gt;
|return = {{type|bool}} allowCheck, {{type|bool}} ignoreCheck&lt;br /&gt;
|info = Determines if this weapon can automatically generate targets itself. See also {{xtaglink|Gamedev:WeaponDefs|commandFire}} weaponDef tag. The {{var|ignoreCheck}} return value was added in 99.0 to allow ignoring the callin i.e. running normal engine check for this weapon.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponTarget&lt;br /&gt;
|args = attackerID, targetID, attackerWeaponNum, attackerWeaponDefID, defPriority&lt;br /&gt;
|return = {{type|bool}} allowed, {{type|number}} newPriority&lt;br /&gt;
|info = Controls blocking of a specific target from being considered during a weapon&#039;s periodic auto-targeting sweep. The second return value is the new priority for this target (if you don&#039;t want to change it, return {{var|defPriority}}). Lower priority targets are targeted first.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowWeaponInterceptTarget&lt;br /&gt;
|args = interceptorUnitID, interceptorWeaponID, targetProjectileID&lt;br /&gt;
|return = {{type|bool}} allowed&lt;br /&gt;
|info = Controls blocking of a specific intercept target from being considered during an {{xtaglink|Gamedev:WeaponDefs|interceptor}} weapon&#039;s periodic auto-targeting sweep. Only called for {{var|weaponDefIDs}} registered via [[Lua_System#Synced|Script.SetWatchWeapon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = AllowBuilderHoldFire&lt;br /&gt;
|args = unitID, unitDefID, action&lt;br /&gt;
|return = {{type|bool}} actionAllowed&lt;br /&gt;
|info = {{new|98.0}} {{Sourcelinkhash|5a82d750b89e72024bb0bb62cf05ea257737e0ac}}   Called when a construction unit wants to &amp;quot;use his nano beams&amp;quot;.&amp;lt;br&amp;gt;{{var|action}} is one of following:&lt;br /&gt;
* {{value|-1}} Build&lt;br /&gt;
* {{value|CMD.REPAIR}} Repair&lt;br /&gt;
* {{value|CMD.RECLAIM}} Reclaim&lt;br /&gt;
* {{value|CMD.RESTORE}} Restore&lt;br /&gt;
* {{value|CMD.RESURRECT}} Resurrect&lt;br /&gt;
* {{value|CMD.CAPTURE}} Capture&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Explosion&lt;br /&gt;
|args = weaponDefID, px, py, pz, AttackerID, ProjectileID&lt;br /&gt;
|return = {{type|bool}} noGfx&lt;br /&gt;
|info = Called when an explosion occurs. If it returns {{value|true}} then no graphical effects are drawn by the engine for this explosion.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = TerraformComplete&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, buildUnitID, buildUnitDefID, buildUnitTeam&lt;br /&gt;
|return = {{type|bool}} stop&lt;br /&gt;
|info = Called when pre-building terrain levelling terraforms are completed (c.f. {{xtaglink|Gamedev:UnitDefs|levelGround}}). If the return value is {{value|true}} the current build order is terminated.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = MoveCtrlNotify&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, data&lt;br /&gt;
|return = {{type|bool}} moveCtrlComplete&lt;br /&gt;
|info = Enable both [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetCollideStop]] and [[Lua_MoveCtrl#Options|Spring.MoveCtrl.SetTrackGround]] to enable this call-in, data was supposed to indicate the type of notification but currently never has a value other than {{value|1}} (&amp;quot;unit hit the ground&amp;quot;). The return value determines whether or not the unit should remain script-controlled ({{value|false}}) or return to engine controlled movement ({{value|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = RecvLuaMsg&lt;br /&gt;
|args = msg, playerID&lt;br /&gt;
|info = Receives messages from unsynced sent via [[Lua_UnsyncedCtrl#SendLuaMessage|Spring.SendLuaRulesMsg]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = Load&lt;br /&gt;
|args = zip&lt;br /&gt;
|info = Called after {{name|GamePreload}} and before {{name|GameStart}}. See [[Lua_SaveLoad#Load_.28_zip_.29_-.3E_nil|Lua_SaveLoad]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Damage Controllers ===&lt;br /&gt;
For the following callins, in addition to being a regular weapon, {{var|weaponDefID}} may be one of the following:&lt;br /&gt;
* {{value|-1}} - debris collision, also default of [[Lua_SyncedCtrl#Unit_Control|Spring.AddUnitDamage]]&lt;br /&gt;
* {{value|-2}} - ground collision&lt;br /&gt;
* {{value|-3}} - object collision&lt;br /&gt;
* {{value|-4}} - fire damage&lt;br /&gt;
* {{value|-5}} - water damage&lt;br /&gt;
* {{value|-6}} - kill damage&lt;br /&gt;
* {{value|-7}} - crush damage&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = UnitPreDamaged&lt;br /&gt;
|args = unitID, unitDefID, unitTeam, damage, paralyzer, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the unit, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = ShieldPreDamaged&lt;br /&gt;
|I recommend looking up the CallIns in Sourcecode, because the Lua-Documentation, generated from the lua handle of them is seriously flawed and not regenerated.&lt;br /&gt;
|Lua-Handler documented from version&lt;br /&gt;
|args = proID, proOwnerID, shieldEmitterWeaponNum, shieldCarrierUnitID, bounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|https://github.com/spring/spring/blob/d085e297416bd963ec25eaa3dbf0796ba22a3582/rts/Lua/LuaHandleSynced.h#L106&lt;br /&gt;
|Actual CallIn: &lt;br /&gt;
|args = proID, shieldCarrier, boolBounceProjectile, beamEmitterWeaponNum, beamEmitterUnitID, startX, startY, startZ, hitX, hitY, hitZ&lt;br /&gt;
|return = {{type|bool}} handleCollision&lt;br /&gt;
|info = Called before any engine shield-vs-projectile logic executes. If the return value is {{value|true}} the gadget handles the collision event and the engine does not remove the projectile. If the weapon is a hitscan type ([[Gamedev:WeaponDefs#Tag:weaponType|BeamLaser]] or [[Gamedev:WeaponDefs#Tag:weaponType|LightningCanon]]) then {{var|proID}} is {{value|nil}} and {{var|beamEmitterWeaponNum}} and {{var|beamEmitterUnitID}} are populated instead. The start and hit position arguments are provided from 104.0 onwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{LuaCallin&lt;br /&gt;
|name = FeaturePreDamaged&lt;br /&gt;
|args = featureID, featureDefID, featureTeam, damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam&lt;br /&gt;
|return = {{type|number}} newDamage, {{type|number}} impulseMult&lt;br /&gt;
|info = Called before damage is applied to the feature, allows fine control over how much damage and [http://en.wikipedia.org/wiki/Impulse_(physics) impulse] is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Lua]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:UnitDefs&amp;diff=8609</id>
		<title>Gamedev:UnitDefs</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Gamedev:UnitDefs&amp;diff=8609"/>
		<updated>2021-09-29T14:49:49Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gamedev:Main|Development]] &amp;lt; [[Gamedev:Main]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
==Location==&lt;br /&gt;
UnitDef files are .lua files stored in the &amp;lt;code&amp;gt;Units/&amp;lt;/code&amp;gt; directory of a Spring Game.&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
UnitDef files have one purpose; to define the properties of units. They are the main description file for what attributes your unit should have and how it should behave.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which loads the tags from these files is viewable here:&lt;br /&gt;
&lt;br /&gt;
* {{sourcelink|file=rts/Sim/Units/UnitDef.cpp}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The engine source which reads the [[#sounds]] subtable can be found here:&lt;br /&gt;
&lt;br /&gt;
* {{sourcelink|file=rts/Sim/Units/UnitDefHandler.cpp}}&lt;br /&gt;
&lt;br /&gt;
==Data Types==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
There follows a comprehensive (certain deprecated tags are not present) list of the tags available, their data type, default value and a brief description of what they do. Bear in mind that the source code linked above is the ultimate reference when dealing with these tags. &lt;br /&gt;
&lt;br /&gt;
In lua tables keys (i.e. the tags) should be lower case, here they are represented in camelCase for readability. In your files you may use the &amp;lt;code&amp;gt;lowerkeys&amp;lt;/code&amp;gt; function on your final table to ensure the keys are properly cased.&lt;br /&gt;
&lt;br /&gt;
It is usual to name the returned UnitDef table the internal &amp;lt;code&amp;gt;unitName&amp;lt;/code&amp;gt; desired for the unit.&lt;br /&gt;
&lt;br /&gt;
===General===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = name&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = humanName&lt;br /&gt;
|description = This is simply the name of the unit as it appears to the player.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = description&lt;br /&gt;
|type = string&lt;br /&gt;
|default = name&lt;br /&gt;
|lua = tooltip&lt;br /&gt;
|description = This is the tooltip description of the unit seen by the player. It defaults to the {{taglink|name}} of the unit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildPic&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = buildPicName&lt;br /&gt;
|description = The filename of the image to be used as the build picture, assumes &amp;lt;code&amp;gt;Unitpics/&amp;lt;/code&amp;gt; directory (see [[Gamedev:Buildpics]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = objectName&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = modelname&lt;br /&gt;
|description = The filename of the 3D model file for this unit, assumes &amp;lt;code&amp;gt;Objects3D/&amp;lt;/code&amp;gt; directory.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = script&lt;br /&gt;
|type = string&lt;br /&gt;
|default = unitName + &amp;quot;.cob&amp;quot;&lt;br /&gt;
|lua = scriptName&lt;br /&gt;
|description = The filename of the animation script file for this unit, assumes &amp;lt;code&amp;gt;Scripts/&amp;lt;/code&amp;gt; directory. Default assumes .cob file but [[Animation-LuaScripting | LUS]] should be preferred.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxDamage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = health&lt;br /&gt;
|description = The base &#039;hitpoints&#039; the unit will have.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = autoHeal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How much health the unit will regain every second.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = idleAutoHeal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 10.0&lt;br /&gt;
|description = How much health the unit will regain every second whilst it is idle.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = idleTime&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 600&lt;br /&gt;
|description = The time in [[frames]] taken until a unit is considered to be idle.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildCostMetal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|lua = metalCost&lt;br /&gt;
|description = The amount of metal resource the unit costs to build. Cannot be below &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildCostEnergy&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = energyCost&lt;br /&gt;
|description = The amount of energy resource the unit costs to build.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The time taken to build the unit, in conjunction with the {{taglink|workerTime}} of the constructor. In [[Gamedev:UnitsOfMeasurement#Time|Resource Frames]], &amp;lt;code&amp;gt;Time to build = (buildTime / workerTime)&amp;lt;/code&amp;gt;. Defaults to &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; but cannot actually be below &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = mass&lt;br /&gt;
|type = float&lt;br /&gt;
|default = buildCostMetal&lt;br /&gt;
|description = The mass of the unit, used in weapon impulse calculations. Cannot be less than &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = reclaimable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be reclaimed by a builder?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = capturable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can a unit be stolen by a builder using the capture command?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = repairable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be repaired by a builder?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxRepairSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1e20&lt;br /&gt;
|description = The maximum cumulative speed at which this unit type can repair a single target.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = iconType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;default&amp;quot;&lt;br /&gt;
|description = The name of the radar icon type this unit should use (see [[Icontypes.lua]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = corpse&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = wreckName&lt;br /&gt;
|description = The name of the feature this unit should leave behind as a wreck when it dies (see [[Gamedev:FeatureDefs]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = explodeAs&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of the weapon this unit should explode as when it is killed (see [[Gamedev:WeaponDefs]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = selfDestructAs&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The name of the weapon this unit should explode as when it self destructs (see [[Gamedev:WeaponDefs]]). Also used as the {{taglink|kamikaze}} weapon.}}&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = harvestStorage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = {{new|97.0}}&lt;br /&gt;
|description = How much of the metal resource a unit can store when used as an engine-assisted resource &#039;harvester&#039;. See also [[Lua_SyncedRead#Unit_Informations|Spring.GetUnitHarvestStorage]] and [[Lua_SyncedCtrl#Unit_Resourcing|Spring.SetUnitHarvestStorage]] callouts.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalStorage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the metal resource storage the unit contributes.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyStorage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource storage the unit contributes.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = extractsMetal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the metal resource the unit extracts from the ground. The amount extracted depends on the metal map defined in the map itself. Works only for structures.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = windGenerator&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The maximum amount of the energy resource the unit generates which is dependant on the map wind. Works only for structures. If wind speed is higher than this, the unit will still only produce this much. If wind speed is less, it will produce as much as windspeed is.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = tidalGenerator&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource the unit generates which is dependant on the maps tidal power. Clearly, this only works on water structures.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalUse&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = metalUpkeep&lt;br /&gt;
|description = The amount of the metal resource the unit consumes per game &#039;tick&#039; when activated.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyUse&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = energyUpkeep&lt;br /&gt;
|description = The amount of the energy resource the unit consumes per game &#039;tick&#039; when activated.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = metalMake&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the metal resource the unit generates unconditionally per game &#039;tick&#039;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = energyMake&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource the unit generates unconditionally per game &#039;tick&#039;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = makesMetal&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The amount of the energy resource the unit turns into the metal resource per game &#039;tick&#039;.}}&lt;br /&gt;
&lt;br /&gt;
===Sensors===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = onOffable&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit have an on/off button? Currently the activation status tied to this button also turns sensors (other than LOS) on and off.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = activateWhenBuilt&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the unit&#039;s activation status be on or off when it is created?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sightDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = losRadius&lt;br /&gt;
|description = The radius of the units sight (LOS is circular in Spring). &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = airSightDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.5 * sightDistance&lt;br /&gt;
|lua = airLosRadius&lt;br /&gt;
|description = How far away the unit can see aircraft (and some FX).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = losEmitHeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 20.0&lt;br /&gt;
|lua = losHeight &lt;br /&gt;
|special = {{new|83.0}}&lt;br /&gt;
|description = How high up the unit is the point used to calculate it&#039;s LOS vs. the terrain?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radarEmitHeight&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 20.0&lt;br /&gt;
|lua = radarHeight&lt;br /&gt;
|special = {{new|83.0}}&lt;br /&gt;
|description = How high up the unit is the point used to calculate it&#039;s radar vs. the terrain?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radarDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = radarRadius&lt;br /&gt;
|description = The radius of the units radar.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sonarDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = sonarRadius&lt;br /&gt;
|description = The radius of the units sonar.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = radarDistanceJam&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = jammerRadius&lt;br /&gt;
|description = The radius of the units radar jamming.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sonarDistanceJam&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = sonarJamRadius&lt;br /&gt;
|description = The radius of the units sonar jamming.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = stealth&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the unit undetectable by radar?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = sonarStealth&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Is the unit undetectable by sonar?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = seismicDistance&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = seismicRadius&lt;br /&gt;
|description = The radius of the unit&#039;s seismic (movement) sensor.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = seismicSignature&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0 for units with {{taglink|floater}}, {{taglink|canHover}} or {{taglink|canFly}}, otherwise sqrt(mass / 100.0)&lt;br /&gt;
|description = How fast the seismic ring expands in [[elmo]]s per frame. Each ping always lasts 15 [[frames]], so this also determines the maximum radius of the seismic ring.}}&lt;br /&gt;
&lt;br /&gt;
====Cloaking====&lt;br /&gt;
For units with {{taglink|canCloak|true}}:&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cloakCost&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The energy cost per tick to cloak the unit while it is stationary.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cloakCostMoving&lt;br /&gt;
|type = float&lt;br /&gt;
|default = cloakCost&lt;br /&gt;
|description = The energy cost per tick to cloak the unit while it is moving.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = initCloaked&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = startCloaked&lt;br /&gt;
|description = Is the unit cloaked as soon as it is created?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minCloakDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum distance (radius) which the unit must be from any enemy units to remain cloaked.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = decloakSpherical&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does {{taglink|minCloakDistance}} apply in 3D or only 2D? i.e. can aircraft flying above the unit decloak it?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = decloakOnFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit decloak when it fires a weapon?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cloakTimeout&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 128&lt;br /&gt;
|description = The minimum time, in [[frames]], between a decloak and subsequent re-cloak.}}&lt;br /&gt;
&lt;br /&gt;
===Commands===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canMove&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the unit be issued Move orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Attack orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canFight&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Fight orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canPatrol&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Patrol orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canGuard&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Guard orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
| name = canCloak&lt;br /&gt;
| type = bool&lt;br /&gt;
| default = false&lt;br /&gt;
| description =&lt;br /&gt;
Can the unit be issued Cloak orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canRepeat&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the unit be issued Repeat orders?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canSelfDestruct&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|lua = canSelfD&lt;br /&gt;
|description = Can the unit be issued a self destruct order?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = moveState&lt;br /&gt;
|type = int&lt;br /&gt;
|default = -1 for mobile units, 1 for structures&lt;br /&gt;
|description = The initial movement state for the unit. Can be {{value|-1}} - Inherits from factory, {{value|0}} - Hold Position, {{value|1}} - Manoeuvre or {{value|2}} - Roam.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fireState&lt;br /&gt;
|type = int&lt;br /&gt;
|default = -1 for units with {{taglink|noAutoFire|false}}, 2 otherwise&lt;br /&gt;
|description = The initial firing state for the unit. Can be {{value|-1}} - Inherits from factory, {{value|0}} - Hold Fire, {{value|1}} - Return Fire or {{value|2}} - Fire At Will. Since 104.0 there is an additional value {{value|3}} - Fire At Neutral.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noAutoFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = canFireControl&lt;br /&gt;
|description = Controls whether or not the unit has a fire state button.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canManualFire&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = description = Can the unit be issued ManualFire commands? A ManualFire command will fire any weapons with the {{xtaglink|Gamedev:WeaponDefs|commandfire}} tag.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Builder Commands====&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canRestore&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|terraformSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued restore terrain commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canRepair&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|repairSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued repair commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canReclaim&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|reclaimSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued reclaim commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canResurrect&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|resurrectSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued resurrection commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canCapture&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder &amp;amp;&amp;amp; {{taglink|captureSpeed}} &amp;gt; 0&lt;br /&gt;
|description = Can the unit be issued capture commands? For builders only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Builder===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = builder&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = isBuilder&lt;br /&gt;
|description = Is the unit a builder?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 128.0&lt;br /&gt;
|description = How far away from itself the unit can build, measured to the centre of the unit being built. The minimum value is &amp;lt;code&amp;gt;38.0&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildRange3D&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the builders {{taglink|buildDistance}} apply in all 3 dimensions or only 2?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = workerTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = buildSpeed&lt;br /&gt;
|description = How fast the builder builds, used in conjunction with the {{taglink|buildTime}} of the unit being built. Effectively, &amp;lt;code&amp;gt;Time to build = buildTime / workerTime&amp;lt;/code&amp;gt;. If this value is &amp;lt;= &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; then {{taglink|builder}} is set to false.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = repairSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can repair other units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = reclaimSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can reclaim other units and features.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = resurrectSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can resurrect corpse features back into living units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = captureSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder can capture other units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = terraformSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = workerTime&lt;br /&gt;
|description = How fast the builder levels and restores terrain.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canAssist&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = builder&lt;br /&gt;
|description = Can the builder assist other constructions?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canBeAssisted&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Can the builder be assisted by other builders?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canSelfRepair&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the builder repair itself?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = showNanoSpray&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the builder emit OTA-style nanospray whilst constructing?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = nanoColor&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.2, 0.7, 0.2} aka green&lt;br /&gt;
|description = The RGB colour of a builders&#039; emitted nano particles if {{taglink|showNanoSpray|true}}. Also controls the RBG colour of a unit&#039;s own nanoframe if {{taglink|showNanoFrame|true}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fullHealthFactory&lt;br /&gt;
|type = bool&lt;br /&gt;
|defaul[[elmo]]s&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, units are repaired before they are allowed to leave the factory i.e. units from this factory will be healed back to 100% health if they are damaged during construction.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isAirbase&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = Is this unit an airbase? Aircraft may land and repair on units which are airbases.}}&lt;br /&gt;
&lt;br /&gt;
===Movement &amp;amp; Placement===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = footprintX&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = &lt;br /&gt;
How wide the unit is in footprint units, left to right. 1 footprint unit = 16 [[elmo]]s. Cannot be below &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. For mobile units this should be the same as the {{xtaglink|Movedefs.lua|footprintX}} of its {{taglink|movementClass}}. Also used for obstacle avoidance.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = footprintZ&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = &lt;br /&gt;
How wide the unit is in footprint units, top to bottom. 1 footprint unit = 16 [[elmo]]s. Cannot be below &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. For mobile units this should be the same as the {{xtaglink|Movedefs.lua|footprintZ}} of its {{taglink|movementClass}}. Also used for obstacle avoidance.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = yardmap&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = &lt;br /&gt;
Used to determine a structure from a mobile unit. A string of characters which defines in detail each &#039;footprint square&#039; of the structure. Each footprint square may be: &lt;br /&gt;
:: &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; - &#039;Yard&#039; - Always open, unblocking, &lt;br /&gt;
:: &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt; - &#039;Construction&#039; - Open and unblocking only while constructing (for factories, controlled via &amp;lt;code&amp;gt;COB.YARD_OPEN&amp;lt;/code&amp;gt; see [[Animation-LuaCallouts#Other]]), &lt;br /&gt;
:: &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; - &#039;Inversed Construction&#039; - Closed and blocking only while constructing (for factories, controlled via &amp;lt;code&amp;gt;COB.YARD_OPEN&amp;lt;/code&amp;gt; see [[Animation-LuaCallouts#Other]]) ({{new|89.0}}), &lt;br /&gt;
:: &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; - &#039;Geothermal&#039; - Flags that the unit must be placed over a {{xtaglink|Gamedev:FeatureDefs|geoThermal}} feature, does not actually count as a square, &lt;br /&gt;
:: &amp;lt;code&amp;gt;h&amp;lt;/code&amp;gt; - &#039;High Resolution&#039; - Indicates that the yardmap will use double resolution with four times as many characters. Must be the &#039;&#039;&#039;first&#039;&#039;&#039; character, and does not count as a square itself ({{new|93.0}}),&lt;br /&gt;
::&amp;lt;code&amp;gt;o&amp;lt;/code&amp;gt; - &#039;Obstacle&#039; - Always closed, blocking, all other chars are treated the same way.&lt;br /&gt;
: Tip: &#039;Draw&#039; out the yardmap over multiple lines. As of &amp;lt;span class=warning&amp;gt;89.0&amp;lt;/span&amp;gt; all whitespace characters are ignored, including newlines.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingMask&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 1&lt;br /&gt;
|description = [http://en.wikipedia.org/wiki/Mask_(computing) Bitmask] representing the types of ground that this structure can be built on. Each digit of binary that is set to one means that a ground square with the corresponding digit set via [[Lua_SyncedCtrl#Ground|Spring.SetSquareBuildingMask]] can be built on.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = levelGround&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = For structures. Does the constructor have to level the ground underneath the build area before beginning to build the structure?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = movementClass&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|lua = moveDef.name&lt;br /&gt;
|description = The name of the movement type a mobile, non aircraft, unit should use. See [[Movedefs.lua]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canHover&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Removed in 95.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description = Is the unit a hovercraft? Hovercraft can cross water of any depth without a speed penalty. Hover&#039;s must also have &amp;lt;code&amp;gt;HOVER&amp;lt;/code&amp;gt; within the name of their {{taglink|movementClass}} (see [[Movedefs.lua]]).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = floater&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false if a {{taglink|moveClass}} is defined, if not true if {{taglink|waterline|true}}, false otherwise&lt;br /&gt;
|description = When a mobile unit is crossing water, or a structure is placed on water, does it float on top of the water or crawl / lay on the sea bed?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = upright&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit follow the terrain or always remain upright? Generally used for walkers.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxSlope&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = maxHeightDif&lt;br /&gt;
|description = The maximum slope a building can be placed on. Mobile unit&#039;s use the {{xtaglink|Movedefs.lua|maxSlope}} set in their {{taglink|movementClass}}. The value is in degrees and is clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;89.0&amp;lt;/code&amp;gt;. This value is converted to a &amp;quot;maximum allowed height difference&amp;quot; (call it M), which involves a hard-coded constant. When a building gets placed, the height of each of its footprint squares is compared to a reference height (calculated for the build position). If the difference exceeds M for any square, that build position is rejected. The value readable from lua has been changed from that in the unitdef and reflects the internal engine value.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minWaterDepth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -10e6&lt;br /&gt;
|description = The minimum depth of water a building can be placed on. Mobile unit&#039;s use the {{xtaglink|Movedefs.lua|minWaterDepth}} set in their {{taglink|movementClass}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxWaterDepth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 10e6&lt;br /&gt;
|description = The maximum depth of water a building can be placed on. Mobile unit&#039;s use the {{xtaglink|Movedefs.lua|maxWaterDepth}} set in their {{taglink|movementClass}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = waterline&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How low in the water does a ship sit? Higher values means the ship is lower in the water.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minCollisionSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The minimum net impact speed that will cause a unit to be damaged by collisions with another unit.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = pushResistant&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the unit be pushed around by other units? Turning it on doesn&#039;t remove all pushing but is a marked improvement.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = speed&lt;br /&gt;
|description = The maximum speed attainable by the unit in [[elmo]]s per frame. If the value is -ve, the absolute value is used.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxReverseVelocity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = rSpeed &lt;br /&gt;
|special = {{new|99.0}}&lt;br /&gt;
|description = The maximum speed attainable by the unit in reverse in [[elmo]]s per frame. If the value is -ve, the absolute value is used.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = acceleration&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|lua = maxAcc&lt;br /&gt;
|description = The acceleration of the unit, in [[elmo]]s per frame&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;. If the value is -ve, the absolute value is used.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = brakeRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = acceleration&lt;br /&gt;
|lua = maxDec&lt;br /&gt;
|description = The deceleration of the unit, in [[elmo]]s per frame&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;. If the value is -ve, the absolute value is used. For units with {{taglink|canFly|true}} this is multiplied by &amp;lt;code&amp;gt;0.1&amp;lt;/code&amp;gt;. Prior to 95.0 this was scaled by 0.1 for aircraft and the default was 3x acceleration.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = myGravity&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.4&lt;br /&gt;
|description = As Spring aircraft are slower than real aircraft this tag allows to lower gravity to compensate. Multiplies against map gravity for aircraft, replaces map gravity for ground vehicles if non-zero.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnRate&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How fast the unit can turn. &amp;lt;code&amp;gt;degrees per seconds = 0.16 * turnRate&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnInPlace&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit turn on the spot (like a person or tank) or must it be moving forwards to turn (like a car).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnInPlaceSpeedLimit&lt;br /&gt;
|type = float&lt;br /&gt;
|default = A complex formula based on {{taglink|turnRate}} and {{taglink|maxVelocity}}&lt;br /&gt;
|description = For units with {{taglink|turnInPlace|false}}, this defines the minimum speed it will slow down to (the speed at which the turn is actually performed can be higher depending on the angular difference and {{taglink|turnRate}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
| name = turnInPlaceAngleLimit&lt;br /&gt;
| type = float&lt;br /&gt;
| default = 0.0&lt;br /&gt;
| special = {{new|86.0}}&lt;br /&gt;
| description = For units with {{taglink|turnInPlace|true}}, defines the maximum angle (in degrees) of a turn above which it starts to brake.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = blocking&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit block the movement of other units? (Mines, i.e. non-mobile units with the {{taglink|kamikaze}} tag default to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = crushResistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = mass&lt;br /&gt;
|special = {{new|85.0}}&lt;br /&gt;
|description = How resistant is the unit to being crushed? Any [[Movedefs.lua|&#039;&#039;&#039;MoveClass&#039;&#039;&#039;]] with a {{xtaglink|Movedefs.lua|crushStrength}} greater than this will crush the unit - IFF this has been enabled via [[Lua_SyncedCtrl#Unit_Control|Spring.SetUnitBlocking]] and the collider impulse exceeds that of the colidee.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Flanking===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMode&lt;br /&gt;
|type = int&lt;br /&gt;
|default = flankingBonus.defaultMode set in [[Modrules.lua]]&lt;br /&gt;
|description = The mode of operation of Spring&#039;s inbuilt flanking system. Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - No flanking bonus. Mode &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; builds up the ability to move over time, and swings to face attacks, but does not respect the way the unit is facing. Mode &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; also can swing, but moves with the unit as it turns. Mode &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; stays with the unit as it turns and otherwise doesn&#039;t move, the ideal mode to simulate something such as tank armour.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusDir&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 1.0}&lt;br /&gt;
|description = This is the direction vector where the armour is facing; i.e. where the least damage is applied. The default is straight forwards.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMax&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.9&lt;br /&gt;
|description = The maximum multiplier to the damage dealt, when a unit is hit from the opposite direction to {{taglink|flankingBonusDir}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMin&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.9&lt;br /&gt;
|description = The minimum multiplier to the damage dealt, when a unit is hit from the same direction as {{taglink|flankingBonusDir}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flankingBonusMobilityAdd&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.01&lt;br /&gt;
|description = This defines the ability of {{taglink|flankingBonusDir}} to move over time. Its value is added to the mobility every [[SlowUpdate]]. When the unit is attacked, the build up mobility value is multiplied by a vector facing the attack, which is added to {{taglink|flankingBonusDir}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Aircraft===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canFly&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the unit fly, i.e. is it an aircraft?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canSubmerge&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the aircraft land underwater?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = factoryHeadingTakeoff&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Controls the take-off behaviour of aircraft with {{taglink|hoverAttack|true}}. &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; means planes start matching their heading right after taking off from the pad, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; means they maintain the heading of the pad until reaching {{taglink|cruiseAlt}}.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collide&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit collide with other aircraft, or can it occupy the same space?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = hoverAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Controls whether the aircraft flys and attacks like a fighter/bomber or a helicopter/gunship.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = airStrafe&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = For aircraft with {{taglink|hoverAttack|true}}, controls if the unit strafes side to side while attacking or remains stationary.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cruiseAlt&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = wantedHeight&lt;br /&gt;
|description = The altitude in [[elmo]]s which the unit attempts to fly at while cruising.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = airHoverFactor&lt;br /&gt;
|type = float&lt;br /&gt;
|default = -1.0&lt;br /&gt;
|lua = dlHoverFactor&lt;br /&gt;
|description = For aircraft with {{taglink|hoverAttack|true}}, less then &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; means it can land and &amp;gt;= &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; indicates how much the unit will move during hovering on the spot.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = bankingAllowed&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = For aircraft with {{taglink|hoverAttack|true}}, controls whether or not the unit banks when moving turning.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = useSmoothMesh&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the aircraft follow the real map terrain or the special smoothed out navigation mesh generated by Spring specifically for aircraft?} Can become problematic for construction aircrafts, building in canyons.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxFuel&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = The maximum flight time in seconds before aircraft must return to an airbase to refuel.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = refuelTime&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 5.0&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = The time in seconds required to refuel the aircraft at an airbase.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minAirbasePower&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|special = Removed in 101.0 in favour of more flexible lua custom commands&lt;br /&gt;
|description = The minimum {{taglink|workerTime}} an airbase must have to repair / refuel this aircraft.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canLoopbackAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can the aircraft perform an [http://en.wikipedia.org/wiki/Immelmann_turn Immelmann turn]?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Advanced Air Tags====&lt;br /&gt;
The following set of tags are not well understood and using non-default values can lead to undesired flight behaviours.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
{{tag&lt;br /&gt;
|name = wingDrag&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.07&lt;br /&gt;
|description = The drag caused by the aircraft&#039;s wing. Clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = wingAngle&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.08&lt;br /&gt;
|description = The angle between the front and the wing plane.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = frontToSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.1&lt;br /&gt;
|description = How far nose can be unaligned to speed vector before accelleration is applied.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = speedToFront&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.07&lt;br /&gt;
|description = Rate for the nose to align to new (true) direction change. Values above 0.1 may lead to cumulative speedup issues.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = crashDrag&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.005&lt;br /&gt;
|description = The drag used when crashing. Clamped between &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxBank&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.8&lt;br /&gt;
|description = The maximum roll (z-axis rotation) the aircraft can achieve.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxPitch&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.45&lt;br /&gt;
|description = The maximum pitch (x-axis rotation) the aircraft tries to keep.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = turnRadius&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 500.0&lt;br /&gt;
|description = Hint to Spring unit AI about the required turning radius.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = verticalSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 3.0&lt;br /&gt;
|description = The speed of takeoff and landing, at least for gunships ({{taglink|hoverAttack|true}}).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxAileron&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.015&lt;br /&gt;
|description =  The maximum turn speed around the roll (z) axis.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxElevator&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.01&lt;br /&gt;
|description = The maximum turn speed around the pitch (x) axis.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxRudder&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.004&lt;br /&gt;
|description = The maximum turn speed around the yaw (y) axis.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxAcc&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.065&lt;br /&gt;
|description = The maximum acceleration or &#039;engine power&#039; of the aircraft.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = attackSafetyDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0&lt;br /&gt;
| special = Exists only in version 99.0&lt;br /&gt;
|description = Fighters abort dive toward target if within attackSafetyDistance and try to climb back to normal altitude while still moving toward target. It&#039;s disabled by default. Set to half of the minimum weapon range to avoid collisions, enemy fire, AOE damage. If set to greater than the weapon range, the unit will fly over the target like a bomber. This tag was removed in version 100.0 and changed to a [[Lua_MoveCtrl#MoveType-Controlling|Spring.SetMoveTypeData]] key.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
====Flares====&lt;br /&gt;
The following set of tags are rarely used and are hardcoded to only work vs. missile weapons. The texture is hardcoded to be &amp;lt;code&amp;gt;flareprojectiletexture&amp;lt;/code&amp;gt; defined in [[Resources.lua]].&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
{{tag&lt;br /&gt;
|name = canDropFlare&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can this aircraft drop flares to distract missile weapons?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareReload&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 5.0&lt;br /&gt;
|lua = flareReloadTime&lt;br /&gt;
|description = The time in seconds between successive flare drops.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareDelay&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.3&lt;br /&gt;
|description = The delay between detecting an incoming missile and launching flares. Multiplied by a random number between 1 and 16.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareEfficiency&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.5&lt;br /&gt;
|description = The probability that an incoming missile will target the flare instead of the aircraft.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareDropVector&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|description = The direction vector which flares are emitted in.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareTime&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 3&lt;br /&gt;
|description = The lifetime of a dropped flare in [[frames]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareSalvoSize&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 4&lt;br /&gt;
|description = How many flares are dropped at once?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = flareSalvoDelay&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The delay in [[frames]] between the release of each individual flare in a burst.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Transports===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportSize&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The size of units that the transport can pick up, in terms of the passengers {{taglink|footprintX}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minTransportSize&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The smallest size of unit that the transport can pick up, in terms of the passengers {{taglink|footprintX}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportCapacity&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The total number of units that the transport can pick up, with each unit multiplied by it&#039;s {{taglink|footprintX}} size. Prior to 101.0 if this tag is not present, then any Script.AttachUnit and Script.DropUnit call in the animation script will be ignored (See [[Animation-LuaCallouts#Other]]), in successive versions all units can use [[Lua_SyncedCtrl#Unit_Control|Spring.UnitAttach]] et al regardless of this tag.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportMass&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 100000.0&lt;br /&gt;
|description = The total cumulative {{taglink|mass}} of passengers the transport can carry.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = minTransportMass&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = The minimum {{taglink|mass}} passenger the transport can carry.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = loadingRadius&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 220.0&lt;br /&gt;
|description = How far away in [[elmo]]s can the transporter pick up and drop units?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = unloadSpread&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 5.0&lt;br /&gt;
|description = How spread out the passengers are when unloaded. Is multiplied by the passengers radius.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isFirePlatform&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Can transported units still aim and shoot while loaded by this transport?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = holdSteady&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = If &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; - passengers are slaved to orientation of transporter attachment piece, if &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; - passengers are slaved to orientation of transporter body.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = releaseHeld&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the transporter unload it&#039;s passengers when it dies?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = cantBeTransported&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false for mobile units, true for structures&lt;br /&gt;
|description = Controls if a unit is transportable at all or not. If &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; it is overridden by [[Modrules.lua]] &amp;lt;code&amp;gt;transportability&amp;lt;/code&amp;gt; subtable tags.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportByEnemy&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Controls if a unit can be transported by an enemy transport. i.e. can it be kidnapped.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = transportUnloadMethod&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = For air transports. Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Land to unload individually, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - Flyover drop (i.e. Parachute), or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - Land and flood unload all passengers. Can be used on ground transports with mixed results.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fallSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.2&lt;br /&gt;
|description = For air transports with {{taglink|transportUnloadMethod|1}}. The speed in [[elmo]]s per second which units will fall at when released from the transport.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = unitFallSpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = Allows you to override {{taglink|fallSpeed}} for an individual passenger.}}&lt;br /&gt;
&lt;br /&gt;
===Categories===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = category&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The category tag is a string of separate words, each representing a category of units. There is a maximum of 32 categories. The primary purpose of categories is weapon targeting (See [[#weapons]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = noChaseCategory&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The unit will still target enemies with a matching {{taglink|category}}, but will not chase after it if it moves out of weapon range.}}&lt;br /&gt;
&lt;br /&gt;
===Decals===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = leaveTracks&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit leave a track mark decal behind it when it moves? For mobile units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;stdTank&amp;quot;&lt;br /&gt;
|description = The filename of the image, without extension, assumed to be in &amp;lt;code&amp;gt;Bitmaps/Tracks/&amp;lt;/code&amp;gt;, to be used as the track decal. The red channel of the image controls the brightness and the green channel the alpha (how visible it is) of the track. Blue channel is unused.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackWidth&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 32.0&lt;br /&gt;
|description = The width of the track decal left on the ground, in [[elmo]]s.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackOffset&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How far back in [[elmo]]s the track should be drawn from the centre of the unit.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackStrength&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 32.0&lt;br /&gt;
|description = How visible or &#039;deep&#039; the track mark should be. Also used to determine how long the decal should last.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = trackStretch&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = How much the track is stretched in the forward direction compared to the sides (i.e. used to change aspect ratio).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = useBuildingGroundDecal&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = For structures, do they display a ground decal on the terrain under their model?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The filename of the image to be used as ground decal. Assumed to be in &amp;lt;code&amp;gt;Unittextures/&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalSizeX&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 4&lt;br /&gt;
|description = How wide the decal is left to right, in footprint units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalSizeY&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 4&lt;br /&gt;
|description = How wide the decal is top to bottom, in footprint units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = buildingGroundDecalDecaySpeed&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.1&lt;br /&gt;
|description = A measure of how quickly the decal should fade out if the structure dies. Essentially this value is multiplied by the time since death and subtracted from the original alpha until the decal is fully transparent.}}&lt;br /&gt;
&lt;br /&gt;
===Collision Volumes===&lt;br /&gt;
For a deeper explanation of these tags, see [[Gamedev:CollisionVolumes]]. Note that all collision checks first do a pre-check with the unit &#039;&#039;radius&#039;&#039; before doing the colvol checks. Ergo the unit &#039;&#039;radius&#039;&#039; must be larger or equal to the colvol!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = usePieceCollisionVolumes&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = collisionVolume.defaultToPieceTree&lt;br /&gt;
|description = When turned on the model and UnitDef collision volumes are ignored and Spring generates a bounding box volume for each piece of the unit model. These volumes can be manipulated or replaced by [[Lua_SyncedCtrl#Unit_Control | Spring.SetUnitPieceCollisionVolumeData]]. Increases the performance cost of collision calculations.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = useFootPrintCollisionVolume&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = {{new|92.0}}&lt;br /&gt;
|lua = .collisionVolume.defaultToFootprint&lt;br /&gt;
|description = Replaces any defined collision volume with a box with dimensions equal to the object&#039;s footprint (this also overrides any custom scaling and/or offsets).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following three tags can instead be replaced with a [[#collisionVolume]] subtable:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;s&amp;quot;&lt;br /&gt;
|lua = collisionVolume.type&lt;br /&gt;
|description = What shape should the unit&#039;s collision volume be? Can be {{value|&amp;quot;box&amp;quot;}}, {{value|&amp;quot;sphere}} or a cylinder aligned to an axis; {{value|&amp;quot;cylX&amp;quot;}}, {{value|&amp;quot;cylY&amp;quot;}}, {{value|&amp;quot;cylZ&amp;quot;}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeScales&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = collisionVolume.scale{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The lengths of the collision volume in each of the three axes. Note that non-spherical ellipsoids and elliptical cylinders are not supported.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeOffsets&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = collisionVolume.offset{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The offset from the unit centre to the hit volume centre in each axis.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following tags have now been removed from the engine:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = collisionVolumeTest&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|special = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Removed in 90.0 (Now always continuous)&amp;lt;/span&amp;gt;&lt;br /&gt;
|description = The type of test used to detect collisions. Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (discrete) or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (continuous). Use the latter for catching high speed projectiles which may otherwise &#039;skip through&#039; small collision volumes, but beware of the increased performance cost.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = modelCenterOffset&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0} &lt;br /&gt;
|special = &amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Removed in 89.0 (Now set via lua)&amp;lt;/span&amp;gt;&lt;br /&gt;
|description = How far from the model&#039;s defined centre should the centre of the unit be?}}&lt;br /&gt;
&lt;br /&gt;
===Selection Volumes===&lt;br /&gt;
Introduced in 104.0, units may now have custom selection volumes in exactly the same way as collision volumes were already defined.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = usePieceSelectionVolumes&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = {{new|104.0}}&lt;br /&gt;
|lua = .selectionVolume.defaultToPieceTree&lt;br /&gt;
|description = When turned on the model and UnitDef selection volumes are ignored and Spring generates a bounding box volume for each piece of the unit model (the same volumes are used for collision and selection). These volumes can be manipulated or replaced by [[Lua_SyncedCtrl#Unit_Control | Spring.SetUnitPieceColisionVolumeData]]. Increases the performance cost of selection calculations.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = useFootPrintSelectionVolume&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|special = {{new|104.0}}&lt;br /&gt;
|lua = .selectionVolume.defaultToFootprint&lt;br /&gt;
|description = Replaces any defined selection volume with a box with dimensions equal to the object&#039;s footprint (this also overrides any custom scaling and/or offsets).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following three tags can instead be replaced with a [[#selectionVolume]] subtable:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = selectionVolumeType&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;s&amp;quot;&lt;br /&gt;
|special = {{new|104.0}}&lt;br /&gt;
|lua = collisionVolume.type&lt;br /&gt;
|description = What shape should the unit&#039;s selection volume be? Can be {{value|&amp;quot;box&amp;quot;}}, {{value|&amp;quot;sphere}} or a cylinder aligned to an axis; {{value|&amp;quot;cylX&amp;quot;}}, {{value|&amp;quot;cylY&amp;quot;}}, {{value|&amp;quot;cylZ&amp;quot;}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = selectionVolumeScales&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|special = {{new|104.0}}&lt;br /&gt;
|lua = .selectionVolume.scale{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The lengths of the selection volume in each of the three axes. Note that non-spherical ellipsoids and elliptical cylinders are not supported.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = selectionVolumeOffsets&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|special = {{new|104.0}}&lt;br /&gt;
|lua = .selectionVolume.offset{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The offset from the unit centre to the selection volume centre in each axis.}}&lt;br /&gt;
&lt;br /&gt;
===Attack Behaviours===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = highTrajectory&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|lua = highTrajectoryType&lt;br /&gt;
|description = Can the unit fire it&#039;s (ballistic) weapons in a high trajectory arc? Can be &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - Low trajectory only, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; - High trajectory only, or &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; - Toggle button.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = kamikaze&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = canKamikaze&lt;br /&gt;
|description = Does the unit attack its target by blowing itself up?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = kamikazeDistance&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|lua = kamikazeDist&lt;br /&gt;
|description = How close to the target, in [[elmo]]s, the unit must get before detonating. Measured in 3D, not 2D.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = kamikazeUseLOS&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the target unit have to be in LOS when detonating or only within {{taglink|kamikazeDistance}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = strafeToAttack&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the unit move sideways when it can&#039;t shoot?}}&lt;br /&gt;
&lt;br /&gt;
===Other===&lt;br /&gt;
{{tag&lt;br /&gt;
|name = decoyFor&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The UnitDef name (not human {{taglink|name}}) which this unit is a decoy for.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = selfDestructCountdown&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 5&lt;br /&gt;
|lua = selfDCountdown&lt;br /&gt;
|description = The length in seconds taken between issuing self destruct order and the unit exploding.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = damageModifier&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|lua = armoredMultiple&lt;br /&gt;
|description = The multiplier applied to weapon damage when the units ARMORED status (See [[Lua_ConstCOB]]) is turned on.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isTargetingUpgrade&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|lua = targFac&lt;br /&gt;
|description = Does the unit upgrade the targeting so that units shoot accurately at enemy units which are in radar but not in LOS.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = isFeature&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Does the unit immediately die into it&#039;s {{taglink|corpse}} feature when built? Used mainly for making walls.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = hideDamage&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the units current health be invisible to enemy players?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = showPlayerName&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = false&lt;br /&gt;
|description = Should the unit display it&#039;s controlling player as its name instead of {{taglink|name}}. Generally used for commander or hero units.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = showNanoFrame&lt;br /&gt;
|type = bool&lt;br /&gt;
|default = true&lt;br /&gt;
|description = Does the unit show an OTA-style nanoframe whilst being constructed?}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = unitRestricted&lt;br /&gt;
|type = int&lt;br /&gt;
|default = MAX_UNITS&lt;br /&gt;
|lua = maxThisUnit&lt;br /&gt;
|description = How many of this unit type may a player control at once? Defaults to being the maximum amount of units controllable. Is overridden by lobby unit restrictions.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = power&lt;br /&gt;
|type = float&lt;br /&gt;
|default = {{taglink|buildCostMetal}} + ({{taglink|buildCostEnergy}} / 60.0)&lt;br /&gt;
|description = The relative power of the unit. Used in weapon targeting priority and experience gain calculations.}}&lt;br /&gt;
&lt;br /&gt;
==Sub Tables==&lt;br /&gt;
&lt;br /&gt;
===collisionVolume===&lt;br /&gt;
The &amp;lt;code&amp;gt;collisionVolume&amp;lt;/code&amp;gt; subtable of a UnitDef replaces the older individual {{taglink|collisionVolumeType}}, {{taglink|collisionVolumeScales}} and {{taglink|collisionVolumeOffsets}} tags.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = type&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;s&amp;quot;&lt;br /&gt;
|lua = .collisionVolume.type&lt;br /&gt;
|description = What shape should the unit&#039;s collision volume be? Can be {{value|&amp;quot;box&amp;quot;}}, {{value|&amp;quot;sphere&amp;quot;}} or a {{value|&amp;quot;cylinder&amp;quot;}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = axis&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;z&amp;quot;&lt;br /&gt;
|description = Which axis does the unit&#039;s collision volume lie along? Can be {{value|&amp;quot;x&amp;quot;}}, {{value|&amp;quot;y&amp;quot;}} or {{value|&amp;quot;z&amp;quot;}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = scales&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = .collisionVolume.scale{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The lengths of the collision volume in each of the three axes. Note that non-spherical ellipsoids and elliptical cylinders are not supported.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = offsets&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = .collisionVolume.offset{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The offset from the unit centre to the hit volume centre in each axis.}}&lt;br /&gt;
&lt;br /&gt;
===selectionVolume===&lt;br /&gt;
The &amp;lt;code&amp;gt;selectionVolume&amp;lt;/code&amp;gt; subtable of a UnitDef can replace the individual {{taglink|selectionVolumeType}}, {{taglink|selectionVolumeScales}} and {{taglink|selectionVolumeOffsets}} tags.&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = type&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;s&amp;quot;&lt;br /&gt;
|lua = .selectionVolume.type&lt;br /&gt;
|description = What shape should the unit&#039;s selection volume be? Can be {{value|&amp;quot;box&amp;quot;}}, {{value|&amp;quot;sphere&amp;quot;}} or a {{value|&amp;quot;cylinder&amp;quot;}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = axis&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;z&amp;quot;&lt;br /&gt;
|description = Which axis does the unit&#039;s selection volume lie along? Can be {{value|&amp;quot;x&amp;quot;}}, {{value|&amp;quot;y&amp;quot;}} or {{value|&amp;quot;z&amp;quot;}}.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = scales&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = .selectionVolume.scale{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The lengths of the selection volume in each of the three axes. Note that non-spherical ellipsoids and elliptical cylinders are not supported.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = offsets&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 0.0}&lt;br /&gt;
|lua = .selectionVolume.offset{X{{pipe}}Y{{pipe}}Z}&lt;br /&gt;
|description = The offset from the unit centre to the selection volume centre in each axis.}}&lt;br /&gt;
&lt;br /&gt;
===weapons===&lt;br /&gt;
The &amp;lt;code&amp;gt;weapons&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which weapons the unit has. It is a simple array (number indexed table) of &amp;lt;code&amp;gt;weaponName&amp;lt;/code&amp;gt;s (not the human readable &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;!).&lt;br /&gt;
&lt;br /&gt;
The following additional tags are associated with this subtable:&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = name&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The &amp;lt;code&amp;gt;weaponName&amp;lt;/code&amp;gt; of the weapon (See [[Gamedev:WeaponDefs]]). If using the [[weapondefs_post.lua]] provided by [[springcontent.sdz]], you may include the WeaponDef tables within the UnitDef as the &amp;lt;code&amp;gt;weaponDefs&amp;lt;/code&amp;gt; subtable, and refer to them with &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;. This can be a useful way to organise definitions if units do not generally share weapons.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = badTargetCategory&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = A string of unit {{taglink|category}} entries which this weapon prefers to avoid targeting. i.e. given two units which &#039;&#039;can&#039;&#039; be targeted, any unit whose {{taglink|category}} matches any entry in this tag, will be targeted last. (See [[#Categories]])}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = onlyTargetCategory&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = A string of unit {{taglink|category}} entries which this weapon can target. i.e. any unit whose {{taglink|category}} does not match any entry in this tag, cannot be targeted by this weapon. (See [[#Categories]])}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = slaveTo&lt;br /&gt;
|type = int&lt;br /&gt;
|default = 0&lt;br /&gt;
|description = The number of the weapon which this weapon is slaved to. A slaved weapon can only target what it&#039;s master is targeting. Weapon numbers start at &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; and correspond to the index of the weapon within the subtable.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = mainDir&lt;br /&gt;
|type = float[3]&lt;br /&gt;
|default = {0.0, 0.0, 1.0} i.e. forwards&lt;br /&gt;
|description = A vector representing the firing direction of this weapon if it has a limited firing arc. Used in conjunction with {{taglink|maxAngleDif}} (See [[Gamedev:WeaponMainDir]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = maxAngleDif&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 360.0&lt;br /&gt;
|description = How wide this weapons limited firing arc is in degrees. Symmetrical about {{taglink|mainDir}} i.e. &amp;lt;code&amp;gt;180.0&amp;lt;/code&amp;gt; is 90 degree freedom either way (See [[Gamedev:WeaponMainDir]]).}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = fuelUsage&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 0.0&lt;br /&gt;
|description = How much fuel in seconds is deducted from the units initial {{taglink|maxFuel}} when this weapon fires.}}&lt;br /&gt;
&lt;br /&gt;
===buildOptions===&lt;br /&gt;
The &amp;lt;code&amp;gt;buildOptions&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which other units the unit can build (in the case of a builder) or produce (in the case of a factory).&lt;br /&gt;
It is a simple array (number indexed table) of &amp;lt;code&amp;gt;unitName&amp;lt;/code&amp;gt;s (not the human readable {{taglink|name}}!).&lt;br /&gt;
&lt;br /&gt;
There are no additional tags specific to this subtable.&lt;br /&gt;
&lt;br /&gt;
===SFXTypes===&lt;br /&gt;
The &amp;lt;code&amp;gt;SFXTypes&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which [[CEG]] effects are associated with the unit. It consists of two further subtables, with no additional tags specific to them.&lt;br /&gt;
&lt;br /&gt;
====explosionGenerators====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;explosionGenerators&amp;lt;/code&amp;gt; subtable of &amp;lt;code&amp;gt;SFXTypes&amp;lt;/code&amp;gt; tells Spring which [[CEG]]s the unit&#039;s script can call, via the &amp;lt;code&amp;gt;EmitSFX()&amp;lt;/code&amp;gt; callout (See [[Animation-LuaCallouts#Effects]]). It is a simple array (number indexed table) of CEG names, prefaced by the string &amp;lt;code&amp;gt;&amp;quot;custom:&amp;quot;&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====pieceExplosionGenerators====&lt;br /&gt;
{{new|83.0}}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pieceExplosionGenerators&amp;lt;/code&amp;gt; subtable of &amp;lt;code&amp;gt;SFXTypes&amp;lt;/code&amp;gt; tells Spring which [[CEG]]s the unit&#039;s script can pick at random to attach to a flying unit piece, created from the &amp;lt;code&amp;gt;Explode()&amp;lt;/code&amp;gt; callout (See [[Animation-LuaCallouts#Effects]]). It is a simple array (number indexed table) of CEG names, with no prefix.&lt;br /&gt;
&lt;br /&gt;
Forum thread (with examples): {{forumlink|topic=27554|title=pieceExplosionGenerators}}&lt;br /&gt;
&lt;br /&gt;
===sounds===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;sounds&amp;lt;/code&amp;gt; subtable of a UnitDef tells Spring which sound files to play when the unit triggers various events.&lt;br /&gt;
&lt;br /&gt;
Files are assumed to be in the &amp;lt;code&amp;gt;Sounds/&amp;lt;/code&amp;gt; directory; accepted formats are .wav and .ogg, the former being assumed if no extension is given.&lt;br /&gt;
&lt;br /&gt;
Sounds can be defined in one of three ways:&lt;br /&gt;
&lt;br /&gt;
# Each event can be used as though it were a &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; tag referring to the filename.&lt;br /&gt;
# Each event can be the name of a subtable, which is a simple array containing the filenames. One sound is picked at random from the list each time the event occurs.&lt;br /&gt;
# Each event can be the name of a subtable, which is a simple array containing further tables, which contain the following tags:&lt;br /&gt;
{{tag&lt;br /&gt;
|name = file&lt;br /&gt;
|type = string&lt;br /&gt;
|default = &amp;quot;&amp;quot;&lt;br /&gt;
|description = The filename of the sound to play.}}&lt;br /&gt;
&lt;br /&gt;
{{tag&lt;br /&gt;
|name = volume&lt;br /&gt;
|type = float&lt;br /&gt;
|default = 1.0&lt;br /&gt;
|description = The default volume of the sound.}}&lt;br /&gt;
&lt;br /&gt;
Spring checks any referenced sound filename to see if a SoundItem has been created, which allows greater control over how it is played (See [[Sounds.lua]]).&lt;br /&gt;
&lt;br /&gt;
====sounds Example====&lt;br /&gt;
&lt;br /&gt;
For clarification, here is an example of all three methods:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;sounds = {&lt;br /&gt;
  -- Method 1&lt;br /&gt;
  ok = &#039;oksound&#039;, -- .wav appended&lt;br /&gt;
  -- Method 2&lt;br /&gt;
  arrived = {&lt;br /&gt;
    &#039;arrived1.wav&#039;,&lt;br /&gt;
    &#039;arrived2.wav&#039;,&lt;br /&gt;
  },&lt;br /&gt;
  -- Method 3&lt;br /&gt;
  select = {&lt;br /&gt;
    { file = &#039;selsound1.ogg&#039;, volume = 2.0 },&lt;br /&gt;
    { file = &#039;selsound2.ogg&#039;, volume = 2.5 },&lt;br /&gt;
  },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====sounds Events====&lt;br /&gt;
&lt;br /&gt;
The events called by the engine are as follows:&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = ok&lt;br /&gt;
|description = Unit is issued a command.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = select&lt;br /&gt;
|description = Unit is selected by the player.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = arrived&lt;br /&gt;
|description = Unit has arrived at its destination. Mobile ground units only.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = build&lt;br /&gt;
|description = Unit begins building. Called for both factories and mobile construction units.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = activate&lt;br /&gt;
|description = Unit is activated, i.e. Is turned on. Also called when a mobile ground unit starts moving.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = deactivate&lt;br /&gt;
|description = Unit deactivates, i.e. Is turned off.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = cant&lt;br /&gt;
|description = Unit cannot carry out this order. Loaded but not currently called by the engine.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ItemType&lt;br /&gt;
|name = underattack&lt;br /&gt;
|description = Unit gets attacked. Loaded but not currently called by the engine.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===customParams===&lt;br /&gt;
The &amp;lt;code&amp;gt;customParams&amp;lt;/code&amp;gt; subtable of a UnitDef allows the game designer to give their units custom attributes, which can then be accessed via lua gadgets and widgets. It is a map (key-value pair indexed table) of strings. When accessing these attributes in lua the strings can be turned back into numbers, bools or even tables. This gives great control to game designers to essentially implement their own behaviour tags.&lt;br /&gt;
&lt;br /&gt;
There are no additional tags specific to this subtable&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
MC:L implements OO with inheritance (base classes in [http://sourceforge.net/p/mwspring/code/HEAD/tree/Gamedata/unitdefs_pre.lua#l36 unitdefs_pre.lua])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{ExampleRepoLinks&lt;br /&gt;
|path = units/&lt;br /&gt;
|entity = UnitDefs&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category: Game Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Lua_SyncedRead&amp;diff=12068</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=12068"/>
		<updated>2021-04-17T09:29:12Z</updated>

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

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

		<summary type="html">&lt;p&gt;Beherith: /* water */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mapinfo.lua Reference =&lt;br /&gt;
This file is the primary configuration file for maps, list many things including resources, attributes, ad properties.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which reads this file from the map is viewable here:&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapInfo.cpp}}&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Can be found in the [https://github.com/jk3064/Map-Blueprint/archive/master.zip map blueprint]&lt;br /&gt;
&lt;br /&gt;
= File Location =&lt;br /&gt;
relative to the root directory of the map&lt;br /&gt;
: ./mapinfo.lua&lt;br /&gt;
&lt;br /&gt;
= Formatting =&lt;br /&gt;
check [http://www.lua.org/docs.html Lua Documentation] for syntax etc.&lt;br /&gt;
&lt;br /&gt;
In this wiki page, variables are organised as such:&lt;br /&gt;
{{tag|name=VariableName|type=type|range=[valid range]|special=Required|default=value&lt;br /&gt;
|description=Description}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
= Sections =&lt;br /&gt;
== mapinfo ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   name        = &amp;quot;MyMap&amp;quot;,&lt;br /&gt;
   shortname   = &amp;quot;&amp;quot;,&lt;br /&gt;
   description = &amp;quot;&amp;quot;,&lt;br /&gt;
   author      = &amp;quot;&amp;quot;,&lt;br /&gt;
   version     = &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   --mutator   = &amp;quot;deployment&amp;quot;;&lt;br /&gt;
   mapfile     = &amp;quot;maps/mymap.smf&amp;quot;, -- // location of smf/sm3 file&lt;br /&gt;
   modtype     = 3, --// 1=primary, 0=hidden, 3=map&lt;br /&gt;
   depend      = {&amp;quot;Map Helper v1&amp;quot;},&lt;br /&gt;
   replace     = {},&lt;br /&gt;
&lt;br /&gt;
   --startpic   = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
   --StartMusic = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
&lt;br /&gt;
   maphardness     = 100,&lt;br /&gt;
   notDeformable   = false,&lt;br /&gt;
   gravity         = 130,&lt;br /&gt;
   tidalStrength   = 0,&lt;br /&gt;
   maxMetal        = 0.02,&lt;br /&gt;
   extractorRadius = 500.0,&lt;br /&gt;
   voidWater       = false,&lt;br /&gt;
   voidGround      = false,&lt;br /&gt;
   autoShowMetal   = true,&lt;br /&gt;
&lt;br /&gt;
   smf = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   splats = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   grass = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   lighting = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   water = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   teams = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   custom = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string|special=Required|default=none&lt;br /&gt;
|description=Name of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shortname|type=string|special=Required&lt;br /&gt;
|description=maps will not show in the map list without a valid shortname(not sure on its requirements)}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=description|type=string|default=&amp;lt;span style=&amp;quot;color:#cccccc;text-shadow: #111 2px 2px 2px;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=The description of the map that shows in the multiplayer battleroom}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=author|type=string|default=&amp;quot;&amp;quot;&lt;br /&gt;
|description=Author of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=version|type=string&lt;br /&gt;
|description=version, appended to name}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mutator|type=string}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mapfile|type=string&lt;br /&gt;
|description=location of smf/sm3 file}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=modtype|type=int|range=[013]|special=Required&lt;br /&gt;
|description=1=primary, 0=hidden, 3=map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=depend|special=Required}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=replace}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maphardness|type=float|default=100.0&lt;br /&gt;
|description=Defines how much a map will deform from impacts. Higher values mean less deformation, negative values will result in negative deformation (really funny looking)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=notDeformable|type=bool|default=false&lt;br /&gt;
|description=Setting it to 1 means that no explosions can deform the map.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gravity|type=float|range=[0.001-max]|default=130.0&lt;br /&gt;
|description=As you would expect, affects ballistics and how far units fly after an explosion. The force of gravity in units/sec^2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=tidalStrength|type=float|range=[0.0-max]|default=0.0&lt;br /&gt;
|description=The amount of energy which will be given by tidal generators.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxMetal|type=float|range=[0.0-max]|default=0.02&lt;br /&gt;
|description=How much metal a map square with the maximum metal value gives.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=extractorRadius|type=float|range=[0.0-max]|default=500&lt;br /&gt;
|description=The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidWater|type=bool|default=false&lt;br /&gt;
|description=Voidwater means there will be no water plane, and all parts of the map under water will be completely transparent, to show the skybox through the map. For example, check [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20684&amp;amp;hilit=apophis Apophis_v2]}}. Additionally for this to work, the &amp;lt;code&amp;gt;mapinfo.water.planeColor&amp;lt;/code&amp;gt; variable must not be specified in the mapinfo.lua file, delete or comment it out if it exists.&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidGround|type=bool|default=false&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 92.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=Allows portions of the ground to be invisible if the map was compiled with a diffuse image that has an alpha channel. The terrain still exists, its just transparent.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidAlphaMin|type=float|default=0.9&lt;br /&gt;
|description=Controls what alpha level the transparency trigger.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=autoShowMetal|type=bool|default=true&lt;br /&gt;
|description=Defines whether the metal map (F4 mode) is shown automatically when a mex is queued for placement.}}&lt;br /&gt;
&lt;br /&gt;
== smf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
      minHeight = 1000,&lt;br /&gt;
      maxHeight = -300,&lt;br /&gt;
      minimapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName0 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName1 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName.. = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileNameN = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=minHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the minimum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the maximum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minimapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the minimap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=metalmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the metalmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=typemapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the typemap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the grassmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=smtFileName[N]|type=string}}&lt;br /&gt;
&lt;br /&gt;
== sound ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      preset = &amp;quot;default&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      reverb = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=preset|type=string|default=&amp;quot;default&amp;quot;&lt;br /&gt;
|description=Sets the _reverb_ preset (= echo parameters), passfilter (the direct sound) is unchanged. To get a list of all possible presets check: [https://github.com/spring/spring/blob/master/rts/System/Sound/OpenAL/EFXPresets.cpp EFXPresets.cpp]}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can change the preset at runtime via:&lt;br /&gt;
* /tset UseEFX [1&amp;amp;#124;0]&lt;br /&gt;
* /tset snd_eaxpreset preset_name   (may change to a real cmd in the future)&lt;br /&gt;
* /tset snd_filter %gainlf %gainhf  (may    &amp;quot;   &amp;quot;  &amp;quot;  &amp;quot;    &amp;quot;  &amp;quot;   &amp;quot;    &amp;quot;   )}}&lt;br /&gt;
&lt;br /&gt;
=== passfilter ===&lt;br /&gt;
Note, you likely want to set these tags due to the fact that they are _not_ set by `preset`!  So if you want to create a muffled sound you need to use them.&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         gainlf = 1.0,&lt;br /&gt;
         gainhf = 1.0,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainlf|type=float}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainhf|type=float}}&lt;br /&gt;
&lt;br /&gt;
=== reverb ===&lt;br /&gt;
Normally you just want use the `preset` tag but you can use handtweak a preset if wanted with the following tags. To know their function &amp;amp; ranges check the official OpenAL1.1 SDK document.&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      reverb = {         &lt;br /&gt;
         --density&lt;br /&gt;
         --diffusion&lt;br /&gt;
         --gain&lt;br /&gt;
         --gainhf&lt;br /&gt;
         --gainlf&lt;br /&gt;
         --decaytime&lt;br /&gt;
         --decayhflimit&lt;br /&gt;
         --decayhfratio&lt;br /&gt;
         --decaylfratio&lt;br /&gt;
         --reflectionsgain&lt;br /&gt;
         --reflectionsdelay&lt;br /&gt;
         --reflectionspan&lt;br /&gt;
         --latereverbgain&lt;br /&gt;
         --latereverbdelay&lt;br /&gt;
         --latereverbpan&lt;br /&gt;
         --echotime&lt;br /&gt;
         --echodepth&lt;br /&gt;
         --modtime&lt;br /&gt;
         --moddepth&lt;br /&gt;
         --airabsorptiongainhf&lt;br /&gt;
         --hfreference&lt;br /&gt;
         --lfreference&lt;br /&gt;
         --roomrollofffactor&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== resources ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      specularTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDetailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDistrTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      skyReflectModTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailNormalTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      lightEmissionTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      parallaxHeightTex = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassBladeTex|type=string&lt;br /&gt;
|description=Specifies the texture to be used on the grass blades themselves. Green-yellow gradients make for some interesting effects. Defaults to the internally generated blade texture. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassShadingTex|type=string&lt;br /&gt;
|description=Specifies the color variation of the grass across the map. This defaults to the minimap, so the grass color can match the map color. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailTex|type=string&lt;br /&gt;
|description=Specifies the detail texture for the map. More Information: [[Mapdev:detail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:specular]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDetailTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDistrTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyReflectModTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:skyreflectmod]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailNormalTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:normal]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=lightEmissionTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:lightemission]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=parallaxHeightTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:parallax]]}}&lt;br /&gt;
&lt;br /&gt;
== splats ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults  = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=texScales|type=float[4]&lt;br /&gt;
|default={0.2, 0.2, 0.2, 0.2}|description=Scale value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=texMults|type=float[4]&lt;br /&gt;
|default={1.0, 1.0, 1.0, 1.0}|description=Value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
== atmosphere ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      minWind      = 5.0,&lt;br /&gt;
      maxWind      = 25.0,&lt;br /&gt;
&lt;br /&gt;
      fogStart     = 0.1,&lt;br /&gt;
      fogEnd       = 1.0,&lt;br /&gt;
      fogColor     = {0.7, 0.7, 0.8},&lt;br /&gt;
&lt;br /&gt;
      sunColor     = {1.0, 1.0, 1.0},&lt;br /&gt;
      skyColor     = {0.1, 0.15, 0.7},&lt;br /&gt;
      skyDir       = {0.0, 0.0, -1.0},&lt;br /&gt;
      skyBox       = &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      cloudDensity = 0.5,&lt;br /&gt;
      cloudColor   = {1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minWind|type=float|range=[0.0-max]|default=5.0|&lt;br /&gt;
description=The minimum amount of energy the wind on the map will give. is clamped to maxwind}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxWind|type=float|range=[0.0-max]|default=25.0&lt;br /&gt;
|description=The maximum amount of energy the wind on the map will give}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogStart|type=float|default=0.1&lt;br /&gt;
|description=The distance from the camera at which the fog will start. &amp;lt;code&amp;gt;viewRange * fogStart&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogEnd|type=float|default=1.0&lt;br /&gt;
|description=The distance from the camera that fog is opaque. &amp;lt;code&amp;gt;viewRange * fogEnd&amp;lt;/code&amp;gt; }}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogColor|type=rgb|default={0.7, 0.7, 0.8}&lt;br /&gt;
|description=The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. However, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunColor|type=rgb|default={1.0, 1.0, 1.0}&lt;br /&gt;
|description=The color of the sun in the sky. The values are in the order Red, Green, Blue. This will also effect the size of the star. As the values increase (including over 1.0), the disc will get bigger; the inverse is also true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyColor|type=rgb|default={0.1, 0.15, 0.7}&lt;br /&gt;
|description=The color of the sky itself. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyDir|type=float[3]|default={0.0, 0.0, -1.0}&lt;br /&gt;
|description=Is normalised vector}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyBox|type=string&lt;br /&gt;
|description=Specify a .dds skybox (also called skycube) for examples and resources see this [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=11009 thread]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudDensity|type=float|range=[0.0-max]|default=0.5&lt;br /&gt;
|description=The amount of clouds in the sky}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudColor|type=rgb&lt;br /&gt;
|default={1.0, 1.0, 1.0}|description=The color of the clouds}}&lt;br /&gt;
&lt;br /&gt;
== grass ==&lt;br /&gt;
The shader for grass color at https://github.com/spring/spring/blob/266b51ad4c0301103e269a13f8e72f9c26511b4e/cont/base/springcontent/shaders/GLSL/GrassFragProg.glsl#L48 samples grassBladeTex, and multiplies it with grassShadingTex (which defaults to minimap)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth  = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle  = 1.57,&lt;br /&gt;
      bladeColor  = {0.59, 0.81, 0.57},&lt;br /&gt;
      maxStrawsPerTurf = 150,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=bladeWaveScale|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much the wind should effect grass blade movement, as well as the amplitude of the grass motion. Setting it to 0 will stop grass animation}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeWidth|type=float|default=0.32&lt;br /&gt;
|description=Specifies the width of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeHeight|type=float|default=4.0&lt;br /&gt;
|description=Specifies the length of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeAngle|type=float|default=1.57&lt;br /&gt;
|description=Specifies the curvature of each blade of grass. Unit is radians. 0 means completely straight blades of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxStrawsPerTurf|type=int|default=150&lt;br /&gt;
|description=The maximum number of grass blades per &#039;turf&#039;, A turf is approximately 32x32 elmos. }}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeColor|type=rgb|default={0.59, 0.81, 0.57}&lt;br /&gt;
|description=does nothing when `grassBladeTex` is set}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   lighting = {&lt;br /&gt;
      --// dynsun&lt;br /&gt;
      sunStartAngle = 0.0,&lt;br /&gt;
      sunOrbitTime  = 1440.0,&lt;br /&gt;
      sunDir        = {0.0, 1.0, 2.0, 1e9},&lt;br /&gt;
&lt;br /&gt;
      --// unit &amp;amp; ground lighting&lt;br /&gt;
      groundAmbientColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundDiffuseColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundSpecularColor = {0.1, 0.1, 0.1},&lt;br /&gt;
      groundShadowDensity = 0.8,&lt;br /&gt;
      unitAmbientColor    = {0.4, 0.4, 0.4},&lt;br /&gt;
      unitDiffuseColor    = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitSpecularColor   = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitShadowDensity   = 0.8,&lt;br /&gt;
      &lt;br /&gt;
      specularExponent    = 100.0,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=sunStartAngle|type=float|default=0.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunOrbitTime|type=float|default=1440.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunDir|type=float[3]|default={0.0, 1.0, 2.0}&lt;br /&gt;
|description=The direction of the sun, which is normalized by Spring. The Y-axis is up}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundAmbientColor|type=rgb|default={0.5, 0.5, 0.5}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of ground, grass, trees and other features. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundDiffuseColor|type=rgb|default={0.5, 05, 0.5}&lt;br /&gt;
|description=The color of ground where it is fully sun lit (added to GroundAmbientColor). The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundSpecularColor|type=rgb|default={0.1, 0.1, 0.1}&lt;br /&gt;
|description=and its effect when a specular map is present?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitAmbientColor|type=float|default={0.4, 0.4, 0.4}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of units and corpses}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitDiffuseColor|type=rgb|default={0.7, 0.7, 0.7}&lt;br /&gt;
|description=The color of units where they is fully sun lit (added to UnitAmbientColor). The color of units where they is fully sun lit (added to UnitAmbientColor)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitSpecularColor|type=rgb|default=unitDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularExponent|type=float|default=100}}&lt;br /&gt;
&lt;br /&gt;
== water ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   water = {&lt;br /&gt;
      damage =  0.0,&lt;br /&gt;
&lt;br /&gt;
      repeatX = 0.0,&lt;br /&gt;
      repeatY = 0.0,&lt;br /&gt;
&lt;br /&gt;
      absorb    = {0.0, 0.0, 0.0},&lt;br /&gt;
      baseColor = {0.0, 0.0, 0.0},&lt;br /&gt;
      minColor  = {0.0, 0.0, 0.0},&lt;br /&gt;
&lt;br /&gt;
      ambientFactor  = 1.0,&lt;br /&gt;
      diffuseFactor  = 1.0,&lt;br /&gt;
      specularFactor = 1.0,&lt;br /&gt;
      specularPower  = 20.0,&lt;br /&gt;
&lt;br /&gt;
      planeColor = {0.0, 0.4, 0.0},&lt;br /&gt;
&lt;br /&gt;
      surfaceColor  = {0.75, 0.8, 0.85},&lt;br /&gt;
      surfaceAlpha  = 0.55,&lt;br /&gt;
      diffuseColor  = {1.0, 1.0, 1.0},&lt;br /&gt;
      specularColor = {0.5, 0.5, 0.5},&lt;br /&gt;
&lt;br /&gt;
      fresnelMin   = 0.2,&lt;br /&gt;
      fresnelMax   = 0.8,&lt;br /&gt;
      fresnelPower = 4.0,&lt;br /&gt;
&lt;br /&gt;
      reflectionDistortion = 1.0,&lt;br /&gt;
&lt;br /&gt;
      blurBase      = 2.0,&lt;br /&gt;
      blurExponent = 1.5,&lt;br /&gt;
&lt;br /&gt;
      perlinStartFreq  =  8.0,&lt;br /&gt;
      perlinLacunarity = 3.0,&lt;br /&gt;
      perlinAmplitude  =  0.9,&lt;br /&gt;
      windSpeed = 1.0, --// does nothing yet&lt;br /&gt;
&lt;br /&gt;
      shoreWaves = true,&lt;br /&gt;
      forceRendering = false,&lt;br /&gt;
&lt;br /&gt;
      --// undefined == load them from resources.lua!&lt;br /&gt;
      --texture =       &amp;quot;&amp;quot;,&lt;br /&gt;
      --foamTexture =   &amp;quot;&amp;quot;,&lt;br /&gt;
      --normalTexture = &amp;quot;&amp;quot;,&lt;br /&gt;
      --caustics = {&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --},&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=damage|type=float|default=0.0&lt;br /&gt;
|description=Number of hit points per game frame (30 frames per second) a unit will be damaged if it is in the water. As of 95.0 by default damage is also applied to hovercraft units. i wonder if this can be made to give life...?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatX|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture. E.g. how many times the watertexture (default ocean.jpg) will be repeated across the size of the entire map. Only affects basic water. Sane ranges[1-32] }}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatY|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture. E.g. how many times the watertexture (default ocean.jpg) will be repeated across the size of the entire map. Only affects basic water.  Sane ranges[1-32] }}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=absorb|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from WaterBaseColor, until WaterMinColor is reached. Example: WaterAbsorb is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless WaterMinColor is higher than 0 on the red channel}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=baseColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The smallest values the water will go down to due to WaterAbsorb}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=ambientFactor|type=float|default=1.0&lt;br /&gt;
|description=How much ambient (undirected) light (ambientColor) the water surface has}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseFactor|type=float|default=1.0&lt;br /&gt;
|description=How much diffuse (sun lit, diffuseColor) color will be applied to the water surface}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularFactor|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much light is reflected from the sun, sane range [0-5]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularPower|type=float|default=20.0&lt;br /&gt;
|description=Specifies how &#039;polished&#039; the surface of the water is. Small values provide wide, large reflections of the sun (specularcolor), large values provide more pointlike reflections, sane range [1-256]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=planeColor|type=rgb|default={0.0, 0.4, 0.0}&lt;br /&gt;
|description=This sets the color of the groundplane under the water outside the map boundaries}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceColor|type=rgb|default={0.75, 0.8, 0.85}&lt;br /&gt;
|description=The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Has no effect on bump mapped water!}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceAlpha|type=float|default=0.55&lt;br /&gt;
|description= Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseColor|type=rgb|default=value&lt;br /&gt;
|description=This specifies the diffuse color of the water body. WARNING: use of this tag disables the effect of WaterAbsorb , in fact, this tag does nothing but disable WaterAbsorb. Avoid}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularColor|type=rgb|default=lighting.groundDiffuseColor&lt;br /&gt;
|description=This will be the color of specular reflections coming from the sun only on the water surface}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMin|type=float|default=0.2&lt;br /&gt;
|description=This defines the minimum amount of light the water surface will reflect when looking vertically down on it [0-1]. Small values will make the water very transparent (non-reflective) when looking straight down on it. Large values will make the water reflect a lot even when looking straight down.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMax|type=float|default=0.8&lt;br /&gt;
|description=This defines the maximum amount of light the water surface will reflect when looking horizontally (parallel to the water plane) across it [0-1]. Small values will make the water very transparent (non-reflective) even when looking straight across it. Large values will make the water reflect a lot when looking across.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelPower|type=float|default=4.0&lt;br /&gt;
|description=This is how quickly the water reflectivity goes from fresnelmin to fresnelmax depending on the angle of incidence across the water. [https://github.com/spring/spring/blob/a8cf33ad1d2ac775e6008cd04baa7e859d1f23ec/cont/base/springcontent/shaders/GLSL/bumpWaterFS.glsl#L288 reflColor.a = FresnelMin + FresnelMax * pow(angle, FresnelPower);]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=reflectionDistortion|type=float|default=1.0&lt;br /&gt;
|description=How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurBase|type=float|default=2.0&lt;br /&gt;
|description=Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurExponent|type=float|default=1.5&lt;br /&gt;
|description=How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinStartFreq|type=float|default=8.0&lt;br /&gt;
|description=Wave sizes, smaller = big waves, sensible: [1,20] (influence the wave sizes)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinLacunarity|type=float|default=3.0&lt;br /&gt;
|description=Defines the size of the perlin waves, small values being big waves ([0.2,5] is sensible)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinAmplitude|type=float|default=0.9&lt;br /&gt;
|description=Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=windSpeed|type=float|default=1.0&lt;br /&gt;
|description=does nothing yet}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shoreWaves|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=forceRendering|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
will have to ask about those undefined tags&lt;br /&gt;
&lt;br /&gt;
== teams ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   teams = {&lt;br /&gt;
      [0] = {startPos = {x = 2033, z = 852}},&lt;br /&gt;
      [1] = {startPos = {x = 10134, z = 852}},&lt;br /&gt;
      [2] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      [3] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Holds an array of start positions&lt;br /&gt;
&lt;br /&gt;
== terrainTypes ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      [0] = {&lt;br /&gt;
         name = &amp;quot;Default&amp;quot;,&lt;br /&gt;
         hardness = 1.0,&lt;br /&gt;
         receiveTracks = true,&lt;br /&gt;
         moveSpeeds = {&lt;br /&gt;
            tank  = 1.0,&lt;br /&gt;
            kbot  = 1.0,&lt;br /&gt;
            hover = 1.0,&lt;br /&gt;
            ship  = 1.0,&lt;br /&gt;
         },&lt;br /&gt;
      },&lt;br /&gt;
      [1]  = { &lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Holds an array of start types where each element contains:&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string&lt;br /&gt;
|description=A label for the terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=hardness|type=float|range=[0.001-max]|default=1.0&lt;br /&gt;
|description=Used as a multiplier against the mapinfo.mapHardness value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as MapHardness, and 0.5 will make it half as hard}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=receiveTracks|type=bool|default=true&lt;br /&gt;
|description= Effects whether track decals will be placed on the ground from moving vehicles}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.tank|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.kbot|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for kbots when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.hover|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.ship|type=float|range=[0.0-max]|default=1&lt;br /&gt;
|description= Speed multiplier for ships when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
== custom ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   custom = {&lt;br /&gt;
      fog = {&lt;br /&gt;
         color    = {0.26, 0.30, 0.41},&lt;br /&gt;
         height   = &amp;quot;80%&amp;quot;, --// allows either absolue sizes or in percent of map&#039;s MaxHeight&lt;br /&gt;
         fogatten = 0.003,&lt;br /&gt;
      },&lt;br /&gt;
      precipitation = {&lt;br /&gt;
         density   = 30000,&lt;br /&gt;
         size      = 1.5,&lt;br /&gt;
         speed     = 50,&lt;br /&gt;
         windscale = 1.2,&lt;br /&gt;
         texture   = &#039;LuaGaia/effects/snowflake.png&#039;,&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13915</id>
		<title>Mapdev:mapinfo.lua</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13915"/>
		<updated>2021-02-17T17:38:29Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* water */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mapinfo.lua Reference =&lt;br /&gt;
This file is the primary configuration file for maps, list many things including resources, attributes, ad properties.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which reads this file from the map is viewable here:&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapInfo.cpp}}&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Can be found in the [https://github.com/jk3064/Map-Blueprint/archive/master.zip map blueprint]&lt;br /&gt;
&lt;br /&gt;
= File Location =&lt;br /&gt;
relative to the root directory of the map&lt;br /&gt;
: ./mapinfo.lua&lt;br /&gt;
&lt;br /&gt;
= Formatting =&lt;br /&gt;
check [http://www.lua.org/docs.html Lua Documentation] for syntax etc.&lt;br /&gt;
&lt;br /&gt;
In this wiki page, variables are organised as such:&lt;br /&gt;
{{tag|name=VariableName|type=type|range=[valid range]|special=Required|default=value&lt;br /&gt;
|description=Description}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
= Sections =&lt;br /&gt;
== mapinfo ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   name        = &amp;quot;MyMap&amp;quot;,&lt;br /&gt;
   shortname   = &amp;quot;&amp;quot;,&lt;br /&gt;
   description = &amp;quot;&amp;quot;,&lt;br /&gt;
   author      = &amp;quot;&amp;quot;,&lt;br /&gt;
   version     = &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   --mutator   = &amp;quot;deployment&amp;quot;;&lt;br /&gt;
   mapfile     = &amp;quot;maps/mymap.smf&amp;quot;, -- // location of smf/sm3 file&lt;br /&gt;
   modtype     = 3, --// 1=primary, 0=hidden, 3=map&lt;br /&gt;
   depend      = {&amp;quot;Map Helper v1&amp;quot;},&lt;br /&gt;
   replace     = {},&lt;br /&gt;
&lt;br /&gt;
   --startpic   = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
   --StartMusic = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
&lt;br /&gt;
   maphardness     = 100,&lt;br /&gt;
   notDeformable   = false,&lt;br /&gt;
   gravity         = 130,&lt;br /&gt;
   tidalStrength   = 0,&lt;br /&gt;
   maxMetal        = 0.02,&lt;br /&gt;
   extractorRadius = 500.0,&lt;br /&gt;
   voidWater       = false,&lt;br /&gt;
   voidGround      = false,&lt;br /&gt;
   autoShowMetal   = true,&lt;br /&gt;
&lt;br /&gt;
   smf = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   splats = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   grass = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   lighting = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   water = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   teams = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   custom = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string|special=Required|default=none&lt;br /&gt;
|description=Name of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shortname|type=string|special=Required&lt;br /&gt;
|description=maps will not show in the map list without a valid shortname(not sure on its requirements)}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=description|type=string|default=&amp;lt;span style=&amp;quot;color:#cccccc;text-shadow: #111 2px 2px 2px;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=The description of the map that shows in the multiplayer battleroom}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=author|type=string|default=&amp;quot;&amp;quot;&lt;br /&gt;
|description=Author of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=version|type=string&lt;br /&gt;
|description=version, appended to name}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mutator|type=string}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mapfile|type=string&lt;br /&gt;
|description=location of smf/sm3 file}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=modtype|type=int|range=[013]|special=Required&lt;br /&gt;
|description=1=primary, 0=hidden, 3=map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=depend|special=Required}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=replace}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maphardness|type=float|default=100.0&lt;br /&gt;
|description=Defines how much a map will deform from impacts. Higher values mean less deformation, negative values will result in negative deformation (really funny looking)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=notDeformable|type=bool|default=false&lt;br /&gt;
|description=Setting it to 1 means that no explosions can deform the map.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gravity|type=float|range=[0.001-max]|default=130.0&lt;br /&gt;
|description=As you would expect, affects ballistics and how far units fly after an explosion. The force of gravity in units/sec^2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=tidalStrength|type=float|range=[0.0-max]|default=0.0&lt;br /&gt;
|description=The amount of energy which will be given by tidal generators.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxMetal|type=float|range=[0.0-max]|default=0.02&lt;br /&gt;
|description=How much metal a map square with the maximum metal value gives.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=extractorRadius|type=float|range=[0.0-max]|default=500&lt;br /&gt;
|description=The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidWater|type=bool|default=false&lt;br /&gt;
|description=Voidwater means there will be no water plane, and all parts of the map under water will be completely transparent, to show the skybox through the map. For example, check [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20684&amp;amp;hilit=apophis Apophis_v2]}}. Additionally for this to work, the &amp;lt;code&amp;gt;mapinfo.water.planeColor&amp;lt;/code&amp;gt; variable must not be specified in the mapinfo.lua file, delete or comment it out if it exists.&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidGround|type=bool|default=false&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 92.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=Allows portions of the ground to be invisible if the map was compiled with a diffuse image that has an alpha channel. The terrain still exists, its just transparent.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidAlphaMin|type=float|default=0.9&lt;br /&gt;
|description=Controls what alpha level the transparency trigger.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=autoShowMetal|type=bool|default=true&lt;br /&gt;
|description=Defines whether the metal map (F4 mode) is shown automatically when a mex is queued for placement.}}&lt;br /&gt;
&lt;br /&gt;
== smf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
      minHeight = 1000,&lt;br /&gt;
      maxHeight = -300,&lt;br /&gt;
      minimapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName0 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName1 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName.. = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileNameN = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=minHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the minimum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the maximum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minimapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the minimap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=metalmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the metalmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=typemapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the typemap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the grassmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=smtFileName[N]|type=string}}&lt;br /&gt;
&lt;br /&gt;
== sound ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      preset = &amp;quot;default&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      reverb = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=preset|type=string|default=&amp;quot;default&amp;quot;&lt;br /&gt;
|description=Sets the _reverb_ preset (= echo parameters), passfilter (the direct sound) is unchanged. To get a list of all possible presets check: [https://github.com/spring/spring/blob/master/rts/System/Sound/OpenAL/EFXPresets.cpp EFXPresets.cpp]}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can change the preset at runtime via:&lt;br /&gt;
* /tset UseEFX [1&amp;amp;#124;0]&lt;br /&gt;
* /tset snd_eaxpreset preset_name   (may change to a real cmd in the future)&lt;br /&gt;
* /tset snd_filter %gainlf %gainhf  (may    &amp;quot;   &amp;quot;  &amp;quot;  &amp;quot;    &amp;quot;  &amp;quot;   &amp;quot;    &amp;quot;   )}}&lt;br /&gt;
&lt;br /&gt;
=== passfilter ===&lt;br /&gt;
Note, you likely want to set these tags due to the fact that they are _not_ set by `preset`!  So if you want to create a muffled sound you need to use them.&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         gainlf = 1.0,&lt;br /&gt;
         gainhf = 1.0,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainlf|type=float}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainhf|type=float}}&lt;br /&gt;
&lt;br /&gt;
=== reverb ===&lt;br /&gt;
Normally you just want use the `preset` tag but you can use handtweak a preset if wanted with the following tags. To know their function &amp;amp; ranges check the official OpenAL1.1 SDK document.&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      reverb = {         &lt;br /&gt;
         --density&lt;br /&gt;
         --diffusion&lt;br /&gt;
         --gain&lt;br /&gt;
         --gainhf&lt;br /&gt;
         --gainlf&lt;br /&gt;
         --decaytime&lt;br /&gt;
         --decayhflimit&lt;br /&gt;
         --decayhfratio&lt;br /&gt;
         --decaylfratio&lt;br /&gt;
         --reflectionsgain&lt;br /&gt;
         --reflectionsdelay&lt;br /&gt;
         --reflectionspan&lt;br /&gt;
         --latereverbgain&lt;br /&gt;
         --latereverbdelay&lt;br /&gt;
         --latereverbpan&lt;br /&gt;
         --echotime&lt;br /&gt;
         --echodepth&lt;br /&gt;
         --modtime&lt;br /&gt;
         --moddepth&lt;br /&gt;
         --airabsorptiongainhf&lt;br /&gt;
         --hfreference&lt;br /&gt;
         --lfreference&lt;br /&gt;
         --roomrollofffactor&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== resources ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      specularTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDetailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDistrTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      skyReflectModTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailNormalTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      lightEmissionTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      parallaxHeightTex = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassBladeTex|type=string&lt;br /&gt;
|description=Specifies the texture to be used on the grass blades themselves. Green-yellow gradients make for some interesting effects. Defaults to the internally generated blade texture. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassShadingTex|type=string&lt;br /&gt;
|description=Specifies the color variation of the grass across the map. This defaults to the minimap, so the grass color can match the map color. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailTex|type=string&lt;br /&gt;
|description=Specifies the detail texture for the map. More Information: [[Mapdev:detail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:specular]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDetailTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDistrTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyReflectModTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:skyreflectmod]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailNormalTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:normal]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=lightEmissionTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:lightemission]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=parallaxHeightTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:parallax]]}}&lt;br /&gt;
&lt;br /&gt;
== splats ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults  = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=texScales|type=float[4]&lt;br /&gt;
|default={0.2, 0.2, 0.2, 0.2}|description=Scale value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=texMults|type=float[4]&lt;br /&gt;
|default={1.0, 1.0, 1.0, 1.0}|description=Value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
== atmosphere ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      minWind      = 5.0,&lt;br /&gt;
      maxWind      = 25.0,&lt;br /&gt;
&lt;br /&gt;
      fogStart     = 0.1,&lt;br /&gt;
      fogEnd       = 1.0,&lt;br /&gt;
      fogColor     = {0.7, 0.7, 0.8},&lt;br /&gt;
&lt;br /&gt;
      sunColor     = {1.0, 1.0, 1.0},&lt;br /&gt;
      skyColor     = {0.1, 0.15, 0.7},&lt;br /&gt;
      skyDir       = {0.0, 0.0, -1.0},&lt;br /&gt;
      skyBox       = &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      cloudDensity = 0.5,&lt;br /&gt;
      cloudColor   = {1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minWind|type=float|range=[0.0-max]|default=5.0|&lt;br /&gt;
description=The minimum amount of energy the wind on the map will give. is clamped to maxwind}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxWind|type=float|range=[0.0-max]|default=25.0&lt;br /&gt;
|description=The maximum amount of energy the wind on the map will give}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogStart|type=float|default=0.1&lt;br /&gt;
|description=The distance from the camera at which the fog will start. &amp;lt;code&amp;gt;viewRange * fogStart&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogEnd|type=float|default=1.0&lt;br /&gt;
|description=The distance from the camera that fog is opaque. &amp;lt;code&amp;gt;viewRange * fogEnd&amp;lt;/code&amp;gt; }}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogColor|type=rgb|default={0.7, 0.7, 0.8}&lt;br /&gt;
|description=The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. However, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunColor|type=rgb|default={1.0, 1.0, 1.0}&lt;br /&gt;
|description=The color of the sun in the sky. The values are in the order Red, Green, Blue. This will also effect the size of the star. As the values increase (including over 1.0), the disc will get bigger; the inverse is also true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyColor|type=rgb|default={0.1, 0.15, 0.7}&lt;br /&gt;
|description=The color of the sky itself. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyDir|type=float[3]|default={0.0, 0.0, -1.0}&lt;br /&gt;
|description=Is normalised vector}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyBox|type=string&lt;br /&gt;
|description=Specify a .dds skybox (also called skycube) for examples and resources see this [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=11009 thread]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudDensity|type=float|range=[0.0-max]|default=0.5&lt;br /&gt;
|description=The amount of clouds in the sky}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudColor|type=rgb&lt;br /&gt;
|default={1.0, 1.0, 1.0}|description=The color of the clouds}}&lt;br /&gt;
&lt;br /&gt;
== grass ==&lt;br /&gt;
The shader for grass color at https://github.com/spring/spring/blob/266b51ad4c0301103e269a13f8e72f9c26511b4e/cont/base/springcontent/shaders/GLSL/GrassFragProg.glsl#L48 samples grassBladeTex, and multiplies it with grassShadingTex (which defaults to minimap)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth  = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle  = 1.57,&lt;br /&gt;
      bladeColor  = {0.59, 0.81, 0.57},&lt;br /&gt;
      maxStrawsPerTurf = 150,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=bladeWaveScale|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much the wind should effect grass blade movement, as well as the amplitude of the grass motion. Setting it to 0 will stop grass animation}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeWidth|type=float|default=0.32&lt;br /&gt;
|description=Specifies the width of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeHeight|type=float|default=4.0&lt;br /&gt;
|description=Specifies the length of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeAngle|type=float|default=1.57&lt;br /&gt;
|description=Specifies the curvature of each blade of grass. Unit is radians. 0 means completely straight blades of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxStrawsPerTurf|type=int|default=150&lt;br /&gt;
|description=The maximum number of grass blades per &#039;turf&#039;, A turf is approximately 32x32 elmos. }}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeColor|type=rgb|default={0.59, 0.81, 0.57}&lt;br /&gt;
|description=does nothing when `grassBladeTex` is set}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   lighting = {&lt;br /&gt;
      --// dynsun&lt;br /&gt;
      sunStartAngle = 0.0,&lt;br /&gt;
      sunOrbitTime  = 1440.0,&lt;br /&gt;
      sunDir        = {0.0, 1.0, 2.0, 1e9},&lt;br /&gt;
&lt;br /&gt;
      --// unit &amp;amp; ground lighting&lt;br /&gt;
      groundAmbientColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundDiffuseColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundSpecularColor = {0.1, 0.1, 0.1},&lt;br /&gt;
      groundShadowDensity = 0.8,&lt;br /&gt;
      unitAmbientColor    = {0.4, 0.4, 0.4},&lt;br /&gt;
      unitDiffuseColor    = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitSpecularColor   = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitShadowDensity   = 0.8,&lt;br /&gt;
      &lt;br /&gt;
      specularExponent    = 100.0,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=sunStartAngle|type=float|default=0.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunOrbitTime|type=float|default=1440.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunDir|type=float[3]|default={0.0, 1.0, 2.0}&lt;br /&gt;
|description=The direction of the sun, which is normalized by Spring. The Y-axis is up}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundAmbientColor|type=rgb|default={0.5, 0.5, 0.5}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of ground, grass, trees and other features. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundDiffuseColor|type=rgb|default={0.5, 05, 0.5}&lt;br /&gt;
|description=The color of ground where it is fully sun lit (added to GroundAmbientColor). The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundSpecularColor|type=rgb|default={0.1, 0.1, 0.1}&lt;br /&gt;
|description=and its effect when a specular map is present?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitAmbientColor|type=float|default={0.4, 0.4, 0.4}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of units and corpses}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitDiffuseColor|type=rgb|default={0.7, 0.7, 0.7}&lt;br /&gt;
|description=The color of units where they is fully sun lit (added to UnitAmbientColor). The color of units where they is fully sun lit (added to UnitAmbientColor)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitSpecularColor|type=rgb|default=unitDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularExponent|type=float|default=100}}&lt;br /&gt;
&lt;br /&gt;
== water ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   water = {&lt;br /&gt;
      damage =  0.0,&lt;br /&gt;
&lt;br /&gt;
      repeatX = 0.0,&lt;br /&gt;
      repeatY = 0.0,&lt;br /&gt;
&lt;br /&gt;
      absorb    = {0.0, 0.0, 0.0},&lt;br /&gt;
      baseColor = {0.0, 0.0, 0.0},&lt;br /&gt;
      minColor  = {0.0, 0.0, 0.0},&lt;br /&gt;
&lt;br /&gt;
      ambientFactor  = 1.0,&lt;br /&gt;
      diffuseFactor  = 1.0,&lt;br /&gt;
      specularFactor = 1.0,&lt;br /&gt;
      specularPower  = 20.0,&lt;br /&gt;
&lt;br /&gt;
      planeColor = {0.0, 0.4, 0.0},&lt;br /&gt;
&lt;br /&gt;
      surfaceColor  = {0.75, 0.8, 0.85},&lt;br /&gt;
      surfaceAlpha  = 0.55,&lt;br /&gt;
      diffuseColor  = {1.0, 1.0, 1.0},&lt;br /&gt;
      specularColor = {0.5, 0.5, 0.5},&lt;br /&gt;
&lt;br /&gt;
      fresnelMin   = 0.2,&lt;br /&gt;
      fresnelMax   = 0.8,&lt;br /&gt;
      fresnelPower = 4.0,&lt;br /&gt;
&lt;br /&gt;
      reflectionDistortion = 1.0,&lt;br /&gt;
&lt;br /&gt;
      blurBase      = 2.0,&lt;br /&gt;
      blurExponent = 1.5,&lt;br /&gt;
&lt;br /&gt;
      perlinStartFreq  =  8.0,&lt;br /&gt;
      perlinLacunarity = 3.0,&lt;br /&gt;
      perlinAmplitude  =  0.9,&lt;br /&gt;
      windSpeed = 1.0, --// does nothing yet&lt;br /&gt;
&lt;br /&gt;
      shoreWaves = true,&lt;br /&gt;
      forceRendering = false,&lt;br /&gt;
&lt;br /&gt;
      --// undefined == load them from resources.lua!&lt;br /&gt;
      --texture =       &amp;quot;&amp;quot;,&lt;br /&gt;
      --foamTexture =   &amp;quot;&amp;quot;,&lt;br /&gt;
      --normalTexture = &amp;quot;&amp;quot;,&lt;br /&gt;
      --caustics = {&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --},&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{tag|name=damage|type=float|default=0.0&lt;br /&gt;
|description=Number of hit points per game frame (30 frames per second) a unit will be damaged if it is in the water. As of 95.0 by default damage is also applied to hovercraft units. i wonder if this can be made to give life...?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatX|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatY|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=absorb|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from WaterBaseColor, until WaterMinColor is reached. Example: WaterAbsorb is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless WaterMinColor is higher than 0 on the red channel}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=baseColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The smallest values the water will go down to due to WaterAbsorb}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=ambientFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularPower|type=float|default=20.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=planeColor|type=rgb|default={0.0, 0.4, 0.0}&lt;br /&gt;
|description=This sets the color of the groundplane under the water outside the map boundaries}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceColor|type=rgb|default={0.75, 0.8, 0.85}&lt;br /&gt;
|description=The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Has no effect on bump mapped water!}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceAlpha|type=float|default=0.55&lt;br /&gt;
|description= Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseColor|type=rgb|default=value&lt;br /&gt;
|description=This specifies the diffuse color of the water body. WARNING: use of this tag disables the effect of WaterAbsorb , in fact, this tag does nothing but disable WaterAbsorb. Avoid}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularColor|type=rgb|default=lighting.groundDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMin|type=float|default=0.2&lt;br /&gt;
|description=This defines the minimum amount of light the water surface will reflect when looking vertically down on it [0-1]. Small values will make the water very transparent (non-reflective) when looking straight down on it. Large values will make the water reflect a lot even when looking straight down.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMax|type=float|default=0.8&lt;br /&gt;
|description=This defines the maximum amount of light the water surface will reflect when looking horizontally (parallel to the water plane) across it [0-1]. Small values will make the water very transparent (non-reflective) even when looking straight across it. Large values will make the water reflect a lot when looking across.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelPower|type=float|default=4.0&lt;br /&gt;
|description=This is how quickly the water reflectivity goes from fresnelmin to fresnelmax depending on the angle of incidence across the water. [https://github.com/spring/spring/blob/a8cf33ad1d2ac775e6008cd04baa7e859d1f23ec/cont/base/springcontent/shaders/GLSL/bumpWaterFS.glsl#L288 reflColor.a = FresnelMin + FresnelMax * pow(angle, FresnelPower);]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=reflectionDistortion|type=float|default=1.0&lt;br /&gt;
|description=How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurBase|type=float|default=2.0&lt;br /&gt;
|description=Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurExponent|type=float|default=1.5&lt;br /&gt;
|description=How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinStartFreq|type=float|default=8.0&lt;br /&gt;
|description=Wave sizes, smaller = big waves, sensible: [1,20] (influence the wave sizes)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinLacunarity|type=float|default=3.0&lt;br /&gt;
|description=Defines the size of the perlin waves, small values being big waves ([0.2,5] is sensible)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinAmplitude|type=float|default=0.9&lt;br /&gt;
|description=Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=windSpeed|type=float|default=1.0&lt;br /&gt;
|description=does nothing yet}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shoreWaves|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=forceRendering|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
will have to ask about those undefined tags&lt;br /&gt;
&lt;br /&gt;
== teams ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   teams = {&lt;br /&gt;
      [0] = {startPos = {x = 2033, z = 852}},&lt;br /&gt;
      [1] = {startPos = {x = 10134, z = 852}},&lt;br /&gt;
      [2] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      [3] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Holds an array of start positions&lt;br /&gt;
&lt;br /&gt;
== terrainTypes ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      [0] = {&lt;br /&gt;
         name = &amp;quot;Default&amp;quot;,&lt;br /&gt;
         hardness = 1.0,&lt;br /&gt;
         receiveTracks = true,&lt;br /&gt;
         moveSpeeds = {&lt;br /&gt;
            tank  = 1.0,&lt;br /&gt;
            kbot  = 1.0,&lt;br /&gt;
            hover = 1.0,&lt;br /&gt;
            ship  = 1.0,&lt;br /&gt;
         },&lt;br /&gt;
      },&lt;br /&gt;
      [1]  = { &lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Holds an array of start types where each element contains:&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string&lt;br /&gt;
|description=A label for the terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=hardness|type=float|range=[0.001-max]|default=1.0&lt;br /&gt;
|description=Used as a multiplier against the mapinfo.mapHardness value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as MapHardness, and 0.5 will make it half as hard}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=receiveTracks|type=bool|default=true&lt;br /&gt;
|description= Effects whether track decals will be placed on the ground from moving vehicles}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.tank|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.kbot|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for kbots when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.hover|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.ship|type=float|range=[0.0-max]|default=1&lt;br /&gt;
|description= Speed multiplier for ships when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
== custom ==&lt;br /&gt;
&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   custom = {&lt;br /&gt;
      fog = {&lt;br /&gt;
         color    = {0.26, 0.30, 0.41},&lt;br /&gt;
         height   = &amp;quot;80%&amp;quot;, --// allows either absolue sizes or in percent of map&#039;s MaxHeight&lt;br /&gt;
         fogatten = 0.003,&lt;br /&gt;
      },&lt;br /&gt;
      precipitation = {&lt;br /&gt;
         density   = 30000,&lt;br /&gt;
         size      = 1.5,&lt;br /&gt;
         speed     = 50,&lt;br /&gt;
         windscale = 1.2,&lt;br /&gt;
         texture   = &#039;LuaGaia/effects/snowflake.png&#039;,&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapConv&amp;diff=12991</id>
		<title>MapConv</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=MapConv&amp;diff=12991"/>
		<updated>2021-02-11T20:37:27Z</updated>

		<summary type="html">&lt;p&gt;Beherith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Linux users, use:&#039;&#039;&#039; [[MapConvNG]]&lt;br /&gt;
&lt;br /&gt;
Some Mapconv Information [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20849 1],[http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=13655 2]&lt;br /&gt;
&lt;br /&gt;
map decompiler [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=18562 1]&lt;br /&gt;
&lt;br /&gt;
= Mapconv =&lt;br /&gt;
A cross platform map compiler for spring&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=21458 Forum thread] for news and releases&lt;br /&gt;
&lt;br /&gt;
= Windows download =&lt;br /&gt;
* In 2021, on windows, use the GUI version here: [https://github.com/Beherith/springrts_smf_compiler PyMapConv]&lt;br /&gt;
- Beherith&lt;br /&gt;
= Source Code =&lt;br /&gt;
&#039;&#039;&#039;[http://github.com/spring/MapConv &amp;lt;span style=&amp;quot;color:#bbf;&amp;quot;&amp;gt;MapConv&amp;lt;/span&amp;gt;] at github&#039;&#039;&#039;&lt;br /&gt;
== Getting the Source ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;git clone git://github.com/spring/MapConv.git&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Documentation =&lt;br /&gt;
== Example Usage ==&lt;br /&gt;
&#039;&#039;&#039;Fastest compile, lowest quality:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MapConv -i -c 0 -x 250 -n 25 -o Zion_v1.smf -t t.bmp -a h.raw -m m.bmp -f f.bmp -z &amp;quot;nvdxt.exe -dxt1a -nmips 4 -quick -file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Medium speed, good quality:&#039;&#039;&#039; (CUDA version, requires nvidia 8 or higher series gfx card)&lt;br /&gt;
&lt;br /&gt;
MapConv -i -c 0 -x 250 -n 25 -o Zion_v1.smf -t t.bmp -a h.raw -m m.bmp -f f.bmp -q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Slow, great quality:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MapConv -i -c 0 -x 250 -n 25 -o Zion_v1.smf -t t.bmp -a h.raw -m m.bmp -f f.bmp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Slower, best possible quality:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
MapConv -i -c 0 -x 250 -n 25 -o Zion_v1.smf -t t.bmp -a h.raw -m m.bmp -f f.bmp -z &amp;quot;nvdxt.exe -dxt1a -nmips 4 -Sinc -quality_highest -file&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== --help output ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mapconv -h&lt;br /&gt;
&lt;br /&gt;
USAGE: &lt;br /&gt;
&lt;br /&gt;
   mapconv  [-j &amp;lt;feature list file&amp;gt;] [-f &amp;lt;featuremap image&amp;gt;] [-l] [-i] [-z&lt;br /&gt;
            &amp;lt;texcompress program&amp;gt;] [-c &amp;lt;compression&amp;gt;] -x &amp;lt;max height&amp;gt; -n&lt;br /&gt;
            &amp;lt;min height&amp;gt; [-o &amp;lt;output .smf&amp;gt;] [-e &amp;lt;tile file&amp;gt;] [-g &amp;lt;Geovent&lt;br /&gt;
            image&amp;gt;] [-y &amp;lt;typemap image&amp;gt;] -m &amp;lt;metalmap image&amp;gt; -a &amp;lt;heightmap&lt;br /&gt;
            file&amp;gt; -t &amp;lt;texturemap file&amp;gt; [--] [-v] [-h]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Where: &lt;br /&gt;
&lt;br /&gt;
   -j &amp;lt;feature list file&amp;gt;,  --featurelist &amp;lt;feature list file&amp;gt;&lt;br /&gt;
     (value required)  A file with the name of one feature on each line.&lt;br /&gt;
     (Default: fs.txt). See README.txt for details.&lt;br /&gt;
&lt;br /&gt;
   -f &amp;lt;featuremap image&amp;gt;,  --featuremap &amp;lt;featuremap image&amp;gt;&lt;br /&gt;
     (value required)  Feature placement file, xsize by ysize. See&lt;br /&gt;
     README.txt for details.&lt;br /&gt;
&lt;br /&gt;
   -l,  --lowpass&lt;br /&gt;
     Lowpass filters the heightmap&lt;br /&gt;
&lt;br /&gt;
   -i,  --invert&lt;br /&gt;
     Flip the height map image upside-down on reading.&lt;br /&gt;
&lt;br /&gt;
   -z &amp;lt;texcompress program&amp;gt;,  --texcompress &amp;lt;texcompress program&amp;gt;&lt;br /&gt;
     (value required)  Name of companion program texcompress from current&lt;br /&gt;
     working directory.&lt;br /&gt;
&lt;br /&gt;
   -c &amp;lt;compression&amp;gt;,  --compress &amp;lt;compression&amp;gt;&lt;br /&gt;
     (value required)  How much we should try to compress the texture map.&lt;br /&gt;
     Default 0.8, lower -&amp;gt; higher quality, larger files.&lt;br /&gt;
&lt;br /&gt;
   -x &amp;lt;max height&amp;gt;,  --maxheight &amp;lt;max height&amp;gt;&lt;br /&gt;
     (required)  (value required)  What altitude in spring the max(0xff or&lt;br /&gt;
     0xffff) level of the height map represents.&lt;br /&gt;
&lt;br /&gt;
   -n &amp;lt;min height&amp;gt;,  --minheight &amp;lt;min height&amp;gt;&lt;br /&gt;
     (required)  (value required)  What altitude in spring the min(0) level&lt;br /&gt;
     of the height map represents.&lt;br /&gt;
&lt;br /&gt;
   -o &amp;lt;output .smf&amp;gt;,  --outfile &amp;lt;output .smf&amp;gt;&lt;br /&gt;
     (value required)  The name of the created map file. Should end in&lt;br /&gt;
     .smf. A tilefile (extension .smt) is also created.&lt;br /&gt;
&lt;br /&gt;
   -e &amp;lt;tile file&amp;gt;,  --externaltilefile &amp;lt;tile file&amp;gt;&lt;br /&gt;
     (value required)  External tile file that will be used for finding&lt;br /&gt;
     tiles. Tiles not found in this will be saved in a new tile file.&lt;br /&gt;
&lt;br /&gt;
   -g &amp;lt;Geovent image&amp;gt;,  --geoventfile &amp;lt;Geovent image&amp;gt;&lt;br /&gt;
     (value required)  The decal for geothermal vents; appears on the&lt;br /&gt;
     compiled map at each vent. (Default: geovent.bmp).&lt;br /&gt;
&lt;br /&gt;
   -y &amp;lt;typemap image&amp;gt;,  --typemap &amp;lt;typemap image&amp;gt;&lt;br /&gt;
     (value required)  Type map to use, uses the red channel to decide&lt;br /&gt;
     type. types are defined in the .smd, if this argument is skipped the&lt;br /&gt;
     map will be all type 0&lt;br /&gt;
&lt;br /&gt;
   -m &amp;lt;metalmap image&amp;gt;,  --metalmap &amp;lt;metalmap image&amp;gt;&lt;br /&gt;
     (required)  (value required)  Metal map to use, red channel is amount&lt;br /&gt;
     of metal. Resized to xsize / 2 by ysize / 2.&lt;br /&gt;
&lt;br /&gt;
   -a &amp;lt;heightmap file&amp;gt;,  --heightmap &amp;lt;heightmap file&amp;gt;&lt;br /&gt;
     (required)  (value required)  Input heightmap to use for the map, this&lt;br /&gt;
     should be in 16 bit raw format (.raw extension) or an image file. Must&lt;br /&gt;
     be xsize*64+1 by ysize*64+1.&lt;br /&gt;
&lt;br /&gt;
   -t &amp;lt;texturemap file&amp;gt;,  --intex &amp;lt;texturemap file&amp;gt;&lt;br /&gt;
     (required)  (value required)  Input bitmap to use for the map. Sides&lt;br /&gt;
     must be multiple of 1024 long. xsize, ysize determined from this file:&lt;br /&gt;
     xsize = intex width / 8, ysize = height / 8.&lt;br /&gt;
&lt;br /&gt;
   --,  --ignore_rest&lt;br /&gt;
     Ignores the rest of the labeled arguments following this flag.&lt;br /&gt;
&lt;br /&gt;
   -v,  --version&lt;br /&gt;
     Displays version information and exits.&lt;br /&gt;
&lt;br /&gt;
   -h,  --help&lt;br /&gt;
     Displays usage information and exits.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Converts a series of image files to a Spring map. This just creates the&lt;br /&gt;
   .smf and .smt files. You also need to write a .smd file using a text&lt;br /&gt;
   editor.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
* http://code.google.com/p/mapc/&lt;br /&gt;
* http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=18533&lt;br /&gt;
&lt;br /&gt;
=== MapConv Parameters Explained ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;MapConv&#039;&#039;&#039;&amp;lt;/code&amp;gt; - Invoking the MapConv program (MapConv.exe)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-i&#039;&#039;&#039;&amp;lt;/code&amp;gt; - Inverts the heightmap (Always use -i, otherwise your heightmap will be flipped producing undesierable results)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-l&#039;&#039;&#039;&amp;lt;/code&amp;gt;&amp;amp;nbsp;- Lowpass option. Lowpass applies a blurring to the heightmap to smooth out rough edges and make pathing easier. If you are using a 16bit heightmap you will probably not want to use lowpass, however, many experienced mappers still use lowpass even on 16bit heightmaps due to the fact that lowpass smoothing will, in most cases, make it easier for the pathfinder to do it&#039;s job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-c # (-c 0)&#039;&#039;&#039;&amp;lt;/code&amp;gt;&amp;amp;nbsp;- Compression level. &#039;&#039;&#039;Deprecated, never use any other value than 0.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;&#039;&#039;&#039;-x # (-x 101)&#039;&#039;&#039;&amp;lt;/code&amp;gt; - Map maximum height.&amp;amp;nbsp;&#039;&#039;&#039;Deprecated. Map levels can be set in the map&#039;s parameters via LUA which is a much better method.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;&#039;&#039;&#039;-n # (-n 100)&#039;&#039;&#039;&amp;lt;/code&amp;gt; - Map minimum height.&amp;amp;nbsp;&#039;&#039;&#039;Deprecated. Map levels can be set in the map&#039;s parameters via LUA which is a much better method.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&#039;&#039;&#039;&amp;lt;code&amp;gt;-o &amp;amp;lt;Mapname&amp;amp;gt; (-o EvoRTS-Craggy_Creek-v01.smf&amp;lt;/code&amp;gt;&#039;&#039;&amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt;&amp;amp;nbsp;&#039;&#039;&#039;&#039;&#039;- -o stands for &amp;quot;Output Filename&amp;quot;. Generally this is the name of your map, but realistically it can be anything as you can change the name of the map via the Map&#039;s LUA parameters.&amp;amp;nbsp;&#039;&#039;&#039;Once compiled, NEVER rename the .smt file!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&#039;&#039;&#039;&amp;lt;code&amp;gt;-t&amp;amp;nbsp;&amp;amp;lt;Filename&amp;amp;gt; (t terrain.png)&amp;lt;/code&amp;gt;&amp;amp;nbsp;&#039;&#039;&#039;- Name of the Texture map file.&amp;amp;nbsp;&#039;&#039;&#039;Must be in the same directory as MapConv!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-a &amp;amp;lt;Filename&amp;amp;gt; (-a height6.png)&#039;&#039;&#039;&amp;lt;/code&amp;gt; - Name of the Height map file.&amp;amp;nbsp;&#039;&#039;&#039;Must be in the same directory as MapConv!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-m &amp;amp;lt;Filename&amp;amp;gt; (-m metal.png)&#039;&#039;&#039;&amp;lt;/code&amp;gt; - Name of the Metal map file.&amp;amp;nbsp;&#039;&#039;&#039;Must be in the same directory as MapConv!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-f &amp;amp;lt;Filename&amp;amp;gt; (-f feature.png)&#039;&#039;&#039;&amp;lt;/code&amp;gt;&amp;amp;nbsp;- Name of the Feature map file.&amp;amp;nbsp;&#039;&#039;&#039;Must be in the same directory as MapConv!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;-z &amp;amp;lt;Parameters&amp;amp;gt; (-z &amp;quot;nvdxt.exe -dxt1a -nmips 4 -Sinc -quality_highest -file&amp;quot;)&#039;&#039;&#039;&amp;lt;/code&amp;gt;- -z invokes nvdxt.exe which is a helper program that breaks the texture map into DDS tiles. The parameters listed tell nvdxt.exe how much to compress the tiles or how high of quality to strive for. There is never any reason to change the parameters from the example.&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Tools]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Chili&amp;diff=4128</id>
		<title>Chili</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Chili&amp;diff=4128"/>
		<updated>2021-02-07T11:32:01Z</updated>

		<summary type="html">&lt;p&gt;Beherith: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Main_Page|Wiki]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
&lt;br /&gt;
== Chili UI ==&lt;br /&gt;
&lt;br /&gt;
Chili is Springs very own GUI framework. It&#039;s a flexible, class based framework which allows you to create great looking GUIs very quickly. See [[Chili:ScreenShots| Screenshots]].&lt;br /&gt;
 &lt;br /&gt;
=== Learning Chili ===&lt;br /&gt;
&lt;br /&gt;
* [[Chili:Tutorial| Chili Tutorial]]&lt;br /&gt;
* [[Chili:Examples| Examples of Chili widgets]]&lt;br /&gt;
&lt;br /&gt;
Before working with Chili, it is strongly recommended to be familiar with using [[Lua_Scripting| Lua in Spring]], in particular with writing simple widgets.&lt;br /&gt;
&lt;br /&gt;
=== Including Chili ===&lt;br /&gt;
&lt;br /&gt;
* [[Chili:Adding_To_Game|Adding Chili to a game]]&lt;br /&gt;
* [[Chili:Hiding_The_Default_GUI|Hiding Springs default GUI]]&lt;br /&gt;
&lt;br /&gt;
== Documentation: Chili Component Hierarchy ==&lt;br /&gt;
&lt;br /&gt;
The Chili framework is object orientated, and each different component is a class. The hierarchy of components, which is documented [https://gajop.github.io/chiliui/index.html here],  is as follows:&lt;br /&gt;
&lt;br /&gt;
 [https://gajop.github.io/chiliui/modules/controls.object.html Object]&lt;br /&gt;
 |_ [https://gajop.github.io/chiliui/modules/controls.screen.html Screen]&lt;br /&gt;
 |_ [https://gajop.github.io/chiliui/modules/controls.control.html Control]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.button.html Button]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.checkbox.html Checkbox]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.checkbox.html ColorBars]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.combobox.html ComboBox]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.editbox.html EditBox]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.font.html Font]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.label.html Label]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.layoutpanel.html LayoutPanel]&lt;br /&gt;
    |_ [https://gajop.github.io/chiliui/modules/controls.imagelistview.html ImageListView]&lt;br /&gt;
    |_ [https://gajop.github.io/chiliui/modules/controls.grid.html Grid]&lt;br /&gt;
    |_ [https://gajop.github.io/chiliui/modules/controls.stackpanel.html StackPanel]&lt;br /&gt;
    |_ [https://gajop.github.io/chiliui/modules/controls.tabpanel.html TabPanel]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.line.html Line]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.image.html Image]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.multiprogressbar.html MultiProgressBar]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.panel.html Panel]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.progressbar.html ProgressBar]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.scale.html Scale]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.scrollpanel.html ScrollPanel]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.textbox.html TextBox]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.trackbar.html TrackBar]&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.treeview.html TreeView]&lt;br /&gt;
   |_ TreeViewNode&lt;br /&gt;
  |_ [https://gajop.github.io/chiliui/modules/controls.window.html Window]&lt;br /&gt;
&lt;br /&gt;
Viewing the diagram as a tree, each component inherits from its parent in the tree. In practice, this means each component has the properties/functionality of its own type, and also of all components found upwards from it in the tree. For example, a Grid has it&#039;s own properties, but also has those of a LayoutPanel, Control and Object.&lt;br /&gt;
&lt;br /&gt;
== Skinning Chili ==&lt;br /&gt;
Start with your desired &amp;lt;code&amp;gt;skin.lua&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
An example button skin will look like this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
skin.positive_button = {&lt;br /&gt;
  clone     = &amp;quot;window&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  TileImageBK = &amp;quot;:cl:tech_button_bright_small_bk.png&amp;quot;,&lt;br /&gt;
  TileImageFG = &amp;quot;:cl:tech_button_bright_small_fg.png&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
  tiles = {40, 40, 40, 40}, --// tile widths: left,top,right,bottom&lt;br /&gt;
  padding = {10, 10, 10, 10},&lt;br /&gt;
&lt;br /&gt;
  backgroundColor = {0.50, 0.50, 0.50, 0.65},&lt;br /&gt;
  focusColor  = {0.50, 0.50, 0.50, 0.9},&lt;br /&gt;
  borderColor = {0.50, 0.50, 0.50, 0.15},&lt;br /&gt;
&lt;br /&gt;
  DrawControl = DrawButton,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;TileImageBK&amp;lt;/code&amp;gt; - This image will be the background of your control. Alpha values indicate transparency, and color values you will be multiplied with &amp;lt;code&amp;gt;backgroundColor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;TileImageFG&amp;lt;/code&amp;gt; - This image will be the foreground (drawn over background) of your control. Alpha values indicate transparency, and color values you will be multiplied with &amp;lt;code&amp;gt;borderColor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;tiles&amp;lt;/code&amp;gt; - This image will be the background of your control. Alpha values indicate transparency, and color values you will be multiplied with &amp;lt;code&amp;gt;backgroundColor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;padding&amp;lt;/code&amp;gt; - This image will be the background of your control. Alpha values indicate transparency, and color values you will be multiplied with &amp;lt;code&amp;gt;backgroundColor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;backgroundColor&amp;lt;/code&amp;gt; - This image will be the background of your control. Alpha values indicate transparency, and color values you will be multiplied with &amp;lt;code&amp;gt;backgroundColor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;focusColor&amp;lt;/code&amp;gt; - This image will be the background of your control. Alpha values indicate transparency, and color values you will be multiplied with &amp;lt;code&amp;gt;backgroundColor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;borderColor&amp;lt;/code&amp;gt; - This image will be the background of your control. Alpha values indicate transparency, and color values you will be multiplied with &amp;lt;code&amp;gt;backgroundColor&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Libraries]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3722</id>
		<title>Building Spring on Windows</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3722"/>
		<updated>2020-06-22T13:23:23Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Installing MinGW-w64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
{{#css:&lt;br /&gt;
  code * {margin:inherit;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
If you only want to produce your own Spring game and not contribute to the core engine, compilation is not necessary. Check out [[Gamedev:Main]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;Warning:&amp;lt;/span&amp;gt; Compiling Spring on Windows often causes problems, it is heavily recommended to use [[Building_Spring_on_Linux|Linux]] for developing the Spring RTS Engine if possible.&lt;br /&gt;
&lt;br /&gt;
Some reasons for this:&lt;br /&gt;
* Of the active developers nobody uses windows for developing. So they might not be able to help as effectively as on Linux.&lt;br /&gt;
* Setting up a build environment takes a lot more time on windows&lt;br /&gt;
* Compiling is often slower on windows&lt;br /&gt;
* Compiling on windows is poorly tested (which possibly leads to some random / unknown / weird errors)&lt;br /&gt;
&lt;br /&gt;
That said, if you do wish to use Windows, the best place to get real-time help is the #sy lobby channel, or #sy on [[IRC]].&lt;br /&gt;
&lt;br /&gt;
=Compiling with MinGW=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Install [http://www.cmake.org/ CMake] and [http://msysgit.github.io/ msysGit] and MinGW-w64:&lt;br /&gt;
&lt;br /&gt;
When installing msysGit you should select the option to &amp;quot;Run Git from the Windows Command Prompt&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Msysgit6.png|400px]]&lt;br /&gt;
&lt;br /&gt;
This is in order to automatically add Git to PATH making it easy for CMake to find.&lt;br /&gt;
&lt;br /&gt;
== Installing MinGW-w64 ==&lt;br /&gt;
&lt;br /&gt;
Download and run the &amp;quot;Mingw-builds project - native toolchains using trunk&amp;quot; installer from [http://mingw-w64.org/doku.php/download/mingw-builds], more specifically from here: [https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe/download]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Select the following options:&lt;br /&gt;
&lt;br /&gt;
[[File:InstallingMinGW-w64.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Version:&#039;&#039;&#039; Any version above 4.8.x should work, 4.9.x+ may not have been tested as thoroughly. In 2020, version 8.1.0 works fine!&lt;br /&gt;
* &#039;&#039;&#039;Architecture:&#039;&#039;&#039; i686&lt;br /&gt;
* &#039;&#039;&#039;Threads:&#039;&#039;&#039; posix&lt;br /&gt;
* &#039;&#039;&#039;Exception:&#039;&#039;&#039; sjlj &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;This is the only setting which needs to be changed from the default&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Build Revision:&#039;&#039;&#039; The latest one&lt;br /&gt;
&lt;br /&gt;
== Adding to PATH ==&lt;br /&gt;
&lt;br /&gt;
Once installed, you should add the MinGW directory to your PATH variable so that Cmake can find the relevant binaries. &lt;br /&gt;
&lt;br /&gt;
* Go to System properties (either via Control Panel\System and Security\System or by right clicking &#039;Computer&#039; on the desktop), then click &#039;Advanced System Settings&#039;. &lt;br /&gt;
* Click the &#039;Environment Variables&#039; button at the bottom. &lt;br /&gt;
* Find Path in the &#039;System Variables&#039; scrollbox, add an extra &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; to the end and then copy-paste in the MinGW directory (e.g. default is &amp;lt;code&amp;gt;C:\Program Files (x86)\mingw-w64\i686-4.9.1-posix-sjlj-rt_v3-rev0\mingw32\bin&amp;lt;/code&amp;gt;). &lt;br /&gt;
* Alternative instructions with images are easy to find online, for example [http://geekswithblogs.net/renso/archive/2009/10/21/how-to-set-the-windows-path-in-windows-7.aspx here].&lt;br /&gt;
&lt;br /&gt;
= Get the Source Code =&lt;br /&gt;
&lt;br /&gt;
* use git&#039;s bash (you find it in the right click context menu when clicking the folder), &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into your spring source dir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone https://github.com/spring/mingwlibs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* update it from time to time with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure you install the package in the checkout directory, so the path is: /spring/mingwlibs. If done right, it will look like:&lt;br /&gt;
** */spring/&lt;br /&gt;
** */spring/...&lt;br /&gt;
** */spring/mingwlibs&lt;br /&gt;
** */spring/rts&lt;br /&gt;
&lt;br /&gt;
* Note: if you install the package somewhere else (preferably outside of the source tree), and pass its location with the &#039;&#039;MINGDIR&#039;&#039; option to CMake in the configure step (see further down, in the quick instructions).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== configure using CMake ==&lt;br /&gt;
&lt;br /&gt;
Note, as of 2020, cmake-3.10.1-win64-x64.msi from https://cmake.org/files/v3.10/ works, 3.18 has issues detecting zlib.&lt;br /&gt;
&lt;br /&gt;
* run the &#039;&#039;cmake-gui&#039;&#039; and select a source and a build directory&lt;br /&gt;
* press &#039;&#039;&#039;Configure&#039;&#039;&#039; and follow the instructions&lt;br /&gt;
* specify native compilers by entering the paths to gcc.exe and g++.exe from your mingw64-builds directory&lt;br /&gt;
* if you wish to build the full portable version (install-spring), then make sure to set the CMAKE_INSTALL_PREFIX as well&lt;br /&gt;
* In case of configuration errors make sure AI_TYPES variable is set to NONE (default is ALL). This should remedy the issues press &#039;&#039;&#039;Configure&#039;&#039;&#039; again (Remark: Setting NATIVE works as well (tested in commit 9108cae116))&lt;br /&gt;
* This is where you can specify the build type, REL for release, DEBUG for debug build, and RELWITHDEBINFO for a mix&lt;br /&gt;
* press &#039;&#039;&#039;Generate&#039;&#039;&#039;&lt;br /&gt;
* open a console (&#039;&#039;cmd.exe&#039;&#039;), &#039;&#039;cd&#039;&#039; into your &#039;&#039;&#039;build&#039;&#039;&#039; directory&lt;br /&gt;
* &#039;&#039;optional:&#039;&#039; for multi-threaded compilation, the &#039;&#039;mingw32-make&#039;&#039; part may differ on your system: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;set MAKE_COMMAND=mingw32-make -j2&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; (use -j4 for 4 threads). For codeblocks configure CMAKE_CODEBLOCKS_MAKE_ARGUMENTS as -j4 &lt;br /&gt;
* compile with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make install-spring&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* compile just the engine (spring.exe) with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make engine-legacy&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Generating the AI Sources/Wrappers===&lt;br /&gt;
&lt;br /&gt;
you can either build the wrapper:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make Cpp-AIWrapper&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or generate all sources, in case you don&#039;t need the binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make generateSources&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Possible Problems===&lt;br /&gt;
* If you get &amp;lt;span class=warning&amp;gt;undefined reference to `_Unwind_Resume&#039;&amp;lt;/span&amp;gt; linking errors, deinstall &#039;&#039;whole&#039;&#039; MinGW and reinstall it with &#039;&#039;sjlj&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* When you installed an old version of MinGW/TDM and forgot to deinstall it correctly, &amp;lt;code&amp;gt;gcc.exe&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;g++.exe&amp;lt;/code&amp;gt; will be named &amp;lt;code&amp;gt;gcc-dw2.exe&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;g++-dw2.exe&amp;lt;/code&amp;gt;. CMake will then fail to find the correct one, first try to deinstall anything mingw related and reinstall everything. If that didn&#039;t helped just rename the files. If even that doesn&#039;t help open cmake-gui and click the advanced button and set the paths to the correct files yourself (&amp;lt;code&amp;gt;CMAKE_C_COMPILER&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;CMAKE_CXX_COMPILER&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
You can still use Visual Studio 2012 as described below to edit the code. This is very useful because it allows excellent code navigation, and it highlights syntax errors and trivial mistakes before compiling. &lt;br /&gt;
&lt;br /&gt;
For debugging mingw builds, you can aquire a windows build of gdb from http://www.equation.com/servlet/equation.cmd?fa=gdb&lt;br /&gt;
&lt;br /&gt;
To start debugging, copy &#039;&#039;gdb.exe&#039;&#039; to your build output directory, and launch it with &#039;&#039;gdb spring.exe&#039;&#039;. You can supply command line arguments to &#039;&#039;spring.exe&#039;&#039; with &#039;&#039;gdb --args spring.exe myreplayfile.sdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Compiling with Visual Studio (not officially supported!)=&lt;br /&gt;
Currently Visual Studio lacks some c++ features it doesn&#039;t compile spring!&lt;br /&gt;
&lt;br /&gt;
==General Visual Studio Notes==&lt;br /&gt;
When developing using Visual Studio keep in mind:&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;It&#039;s experimental and not proved to compile or run!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Your VS build won&#039;t sync with GCC builds in multiplayer mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*AIs built with Visual Studio will work with the mingw32 release builds thanks to the C AI Interface, however this interface may change when newer releases are made&lt;br /&gt;
*Running any non-LUA AI on VS built Spring will crash it&lt;br /&gt;
&lt;br /&gt;
===2012 (v11)===&lt;br /&gt;
&lt;br /&gt;
Install [http://www.microsoft.com/visualstudio/eng/downloads#d-express-windows-desktop Visual Studio 2012 Express for Windows Desktop], [http://www.microsoft.com/en-us/download/confirmation.aspx?id=35515 Visual C++ Compiler November 2012 CTP], [http://www.cmake.org/ cmake], [http://www.7-zip.org 7-zip] and [http://msysgit.github.io/ msysgit].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From the Startmenu run &amp;quot;VS2012 x86 Native Tools Command Prompt&amp;quot; and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
set PATH=%PATH%;%PROGRAMFILES%\git\bin;%PROGRAMFILES%\cmake 2.8\bin\&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone git://github.com/spring/vclibs11.git vclibs&lt;br /&gt;
cmake -G &amp;quot;Visual Studio 11&amp;quot; .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now start visual studio &amp;amp; open Spring.sln. Select &amp;quot;engine-legacy&amp;quot; as default project, as AIs and ofter stuff are known to fail to compile on visual studio.&lt;br /&gt;
&lt;br /&gt;
In the Project Properties, make sure to [http://stackoverflow.com/questions/13238408/variadic-template-in-vs-2012-visual-c-november-2012-ctp select the Microsoft Visual C++ Compiler Nov 2012 CTP].&lt;br /&gt;
&lt;br /&gt;
Note: Visual Studio 2012 Express for Windows Desktop is for free, but requires a registration after 30 days (to get a free license).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3721</id>
		<title>Building Spring on Windows</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3721"/>
		<updated>2020-06-22T13:21:52Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* configure using CMake */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
{{#css:&lt;br /&gt;
  code * {margin:inherit;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
If you only want to produce your own Spring game and not contribute to the core engine, compilation is not necessary. Check out [[Gamedev:Main]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;Warning:&amp;lt;/span&amp;gt; Compiling Spring on Windows often causes problems, it is heavily recommended to use [[Building_Spring_on_Linux|Linux]] for developing the Spring RTS Engine if possible.&lt;br /&gt;
&lt;br /&gt;
Some reasons for this:&lt;br /&gt;
* Of the active developers nobody uses windows for developing. So they might not be able to help as effectively as on Linux.&lt;br /&gt;
* Setting up a build environment takes a lot more time on windows&lt;br /&gt;
* Compiling is often slower on windows&lt;br /&gt;
* Compiling on windows is poorly tested (which possibly leads to some random / unknown / weird errors)&lt;br /&gt;
&lt;br /&gt;
That said, if you do wish to use Windows, the best place to get real-time help is the #sy lobby channel, or #sy on [[IRC]].&lt;br /&gt;
&lt;br /&gt;
=Compiling with MinGW=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Install [http://www.cmake.org/ CMake] and [http://msysgit.github.io/ msysGit] and MinGW-w64:&lt;br /&gt;
&lt;br /&gt;
When installing msysGit you should select the option to &amp;quot;Run Git from the Windows Command Prompt&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Msysgit6.png|400px]]&lt;br /&gt;
&lt;br /&gt;
This is in order to automatically add Git to PATH making it easy for CMake to find.&lt;br /&gt;
&lt;br /&gt;
== Installing MinGW-w64 ==&lt;br /&gt;
&lt;br /&gt;
Download and run the &amp;quot;Mingw-builds project - native toolchains using trunk&amp;quot; installer from [http://mingw-w64.org/doku.php/download/mingw-builds].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Select the following options:&lt;br /&gt;
&lt;br /&gt;
[[File:InstallingMinGW-w64.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Version:&#039;&#039;&#039; Any version above 4.8.x should work, 4.9.x+ may not have been tested as thoroughly. In 2020, version 8.1.0 works fine!&lt;br /&gt;
* &#039;&#039;&#039;Architecture:&#039;&#039;&#039; i686&lt;br /&gt;
* &#039;&#039;&#039;Threads:&#039;&#039;&#039; posix&lt;br /&gt;
* &#039;&#039;&#039;Exception:&#039;&#039;&#039; sjlj &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;This is the only setting which needs to be changed from the default&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Build Revision:&#039;&#039;&#039; The latest one&lt;br /&gt;
&lt;br /&gt;
== Adding to PATH ==&lt;br /&gt;
&lt;br /&gt;
Once installed, you should add the MinGW directory to your PATH variable so that Cmake can find the relevant binaries. &lt;br /&gt;
&lt;br /&gt;
* Go to System properties (either via Control Panel\System and Security\System or by right clicking &#039;Computer&#039; on the desktop), then click &#039;Advanced System Settings&#039;. &lt;br /&gt;
* Click the &#039;Environment Variables&#039; button at the bottom. &lt;br /&gt;
* Find Path in the &#039;System Variables&#039; scrollbox, add an extra &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; to the end and then copy-paste in the MinGW directory (e.g. default is &amp;lt;code&amp;gt;C:\Program Files (x86)\mingw-w64\i686-4.9.1-posix-sjlj-rt_v3-rev0\mingw32\bin&amp;lt;/code&amp;gt;). &lt;br /&gt;
* Alternative instructions with images are easy to find online, for example [http://geekswithblogs.net/renso/archive/2009/10/21/how-to-set-the-windows-path-in-windows-7.aspx here].&lt;br /&gt;
&lt;br /&gt;
= Get the Source Code =&lt;br /&gt;
&lt;br /&gt;
* use git&#039;s bash (you find it in the right click context menu when clicking the folder), &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into your spring source dir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone https://github.com/spring/mingwlibs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* update it from time to time with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure you install the package in the checkout directory, so the path is: /spring/mingwlibs. If done right, it will look like:&lt;br /&gt;
** */spring/&lt;br /&gt;
** */spring/...&lt;br /&gt;
** */spring/mingwlibs&lt;br /&gt;
** */spring/rts&lt;br /&gt;
&lt;br /&gt;
* Note: if you install the package somewhere else (preferably outside of the source tree), and pass its location with the &#039;&#039;MINGDIR&#039;&#039; option to CMake in the configure step (see further down, in the quick instructions).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== configure using CMake ==&lt;br /&gt;
&lt;br /&gt;
Note, as of 2020, cmake-3.10.1-win64-x64.msi from https://cmake.org/files/v3.10/ works, 3.18 has issues detecting zlib.&lt;br /&gt;
&lt;br /&gt;
* run the &#039;&#039;cmake-gui&#039;&#039; and select a source and a build directory&lt;br /&gt;
* press &#039;&#039;&#039;Configure&#039;&#039;&#039; and follow the instructions&lt;br /&gt;
* specify native compilers by entering the paths to gcc.exe and g++.exe from your mingw64-builds directory&lt;br /&gt;
* if you wish to build the full portable version (install-spring), then make sure to set the CMAKE_INSTALL_PREFIX as well&lt;br /&gt;
* In case of configuration errors make sure AI_TYPES variable is set to NONE (default is ALL). This should remedy the issues press &#039;&#039;&#039;Configure&#039;&#039;&#039; again (Remark: Setting NATIVE works as well (tested in commit 9108cae116))&lt;br /&gt;
* This is where you can specify the build type, REL for release, DEBUG for debug build, and RELWITHDEBINFO for a mix&lt;br /&gt;
* press &#039;&#039;&#039;Generate&#039;&#039;&#039;&lt;br /&gt;
* open a console (&#039;&#039;cmd.exe&#039;&#039;), &#039;&#039;cd&#039;&#039; into your &#039;&#039;&#039;build&#039;&#039;&#039; directory&lt;br /&gt;
* &#039;&#039;optional:&#039;&#039; for multi-threaded compilation, the &#039;&#039;mingw32-make&#039;&#039; part may differ on your system: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;set MAKE_COMMAND=mingw32-make -j2&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; (use -j4 for 4 threads). For codeblocks configure CMAKE_CODEBLOCKS_MAKE_ARGUMENTS as -j4 &lt;br /&gt;
* compile with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make install-spring&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* compile just the engine (spring.exe) with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make engine-legacy&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Generating the AI Sources/Wrappers===&lt;br /&gt;
&lt;br /&gt;
you can either build the wrapper:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make Cpp-AIWrapper&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or generate all sources, in case you don&#039;t need the binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make generateSources&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Possible Problems===&lt;br /&gt;
* If you get &amp;lt;span class=warning&amp;gt;undefined reference to `_Unwind_Resume&#039;&amp;lt;/span&amp;gt; linking errors, deinstall &#039;&#039;whole&#039;&#039; MinGW and reinstall it with &#039;&#039;sjlj&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* When you installed an old version of MinGW/TDM and forgot to deinstall it correctly, &amp;lt;code&amp;gt;gcc.exe&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;g++.exe&amp;lt;/code&amp;gt; will be named &amp;lt;code&amp;gt;gcc-dw2.exe&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;g++-dw2.exe&amp;lt;/code&amp;gt;. CMake will then fail to find the correct one, first try to deinstall anything mingw related and reinstall everything. If that didn&#039;t helped just rename the files. If even that doesn&#039;t help open cmake-gui and click the advanced button and set the paths to the correct files yourself (&amp;lt;code&amp;gt;CMAKE_C_COMPILER&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;CMAKE_CXX_COMPILER&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
You can still use Visual Studio 2012 as described below to edit the code. This is very useful because it allows excellent code navigation, and it highlights syntax errors and trivial mistakes before compiling. &lt;br /&gt;
&lt;br /&gt;
For debugging mingw builds, you can aquire a windows build of gdb from http://www.equation.com/servlet/equation.cmd?fa=gdb&lt;br /&gt;
&lt;br /&gt;
To start debugging, copy &#039;&#039;gdb.exe&#039;&#039; to your build output directory, and launch it with &#039;&#039;gdb spring.exe&#039;&#039;. You can supply command line arguments to &#039;&#039;spring.exe&#039;&#039; with &#039;&#039;gdb --args spring.exe myreplayfile.sdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Compiling with Visual Studio (not officially supported!)=&lt;br /&gt;
Currently Visual Studio lacks some c++ features it doesn&#039;t compile spring!&lt;br /&gt;
&lt;br /&gt;
==General Visual Studio Notes==&lt;br /&gt;
When developing using Visual Studio keep in mind:&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;It&#039;s experimental and not proved to compile or run!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Your VS build won&#039;t sync with GCC builds in multiplayer mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*AIs built with Visual Studio will work with the mingw32 release builds thanks to the C AI Interface, however this interface may change when newer releases are made&lt;br /&gt;
*Running any non-LUA AI on VS built Spring will crash it&lt;br /&gt;
&lt;br /&gt;
===2012 (v11)===&lt;br /&gt;
&lt;br /&gt;
Install [http://www.microsoft.com/visualstudio/eng/downloads#d-express-windows-desktop Visual Studio 2012 Express for Windows Desktop], [http://www.microsoft.com/en-us/download/confirmation.aspx?id=35515 Visual C++ Compiler November 2012 CTP], [http://www.cmake.org/ cmake], [http://www.7-zip.org 7-zip] and [http://msysgit.github.io/ msysgit].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From the Startmenu run &amp;quot;VS2012 x86 Native Tools Command Prompt&amp;quot; and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
set PATH=%PATH%;%PROGRAMFILES%\git\bin;%PROGRAMFILES%\cmake 2.8\bin\&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone git://github.com/spring/vclibs11.git vclibs&lt;br /&gt;
cmake -G &amp;quot;Visual Studio 11&amp;quot; .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now start visual studio &amp;amp; open Spring.sln. Select &amp;quot;engine-legacy&amp;quot; as default project, as AIs and ofter stuff are known to fail to compile on visual studio.&lt;br /&gt;
&lt;br /&gt;
In the Project Properties, make sure to [http://stackoverflow.com/questions/13238408/variadic-template-in-vs-2012-visual-c-november-2012-ctp select the Microsoft Visual C++ Compiler Nov 2012 CTP].&lt;br /&gt;
&lt;br /&gt;
Note: Visual Studio 2012 Express for Windows Desktop is for free, but requires a registration after 30 days (to get a free license).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3720</id>
		<title>Building Spring on Windows</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3720"/>
		<updated>2020-06-22T12:24:07Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* configure using CMake */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
{{#css:&lt;br /&gt;
  code * {margin:inherit;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
If you only want to produce your own Spring game and not contribute to the core engine, compilation is not necessary. Check out [[Gamedev:Main]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;Warning:&amp;lt;/span&amp;gt; Compiling Spring on Windows often causes problems, it is heavily recommended to use [[Building_Spring_on_Linux|Linux]] for developing the Spring RTS Engine if possible.&lt;br /&gt;
&lt;br /&gt;
Some reasons for this:&lt;br /&gt;
* Of the active developers nobody uses windows for developing. So they might not be able to help as effectively as on Linux.&lt;br /&gt;
* Setting up a build environment takes a lot more time on windows&lt;br /&gt;
* Compiling is often slower on windows&lt;br /&gt;
* Compiling on windows is poorly tested (which possibly leads to some random / unknown / weird errors)&lt;br /&gt;
&lt;br /&gt;
That said, if you do wish to use Windows, the best place to get real-time help is the #sy lobby channel, or #sy on [[IRC]].&lt;br /&gt;
&lt;br /&gt;
=Compiling with MinGW=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Install [http://www.cmake.org/ CMake] and [http://msysgit.github.io/ msysGit] and MinGW-w64:&lt;br /&gt;
&lt;br /&gt;
When installing msysGit you should select the option to &amp;quot;Run Git from the Windows Command Prompt&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Msysgit6.png|400px]]&lt;br /&gt;
&lt;br /&gt;
This is in order to automatically add Git to PATH making it easy for CMake to find.&lt;br /&gt;
&lt;br /&gt;
== Installing MinGW-w64 ==&lt;br /&gt;
&lt;br /&gt;
Download and run the &amp;quot;Mingw-builds project - native toolchains using trunk&amp;quot; installer from [http://mingw-w64.org/doku.php/download/mingw-builds].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Select the following options:&lt;br /&gt;
&lt;br /&gt;
[[File:InstallingMinGW-w64.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Version:&#039;&#039;&#039; Any version above 4.8.x should work, 4.9.x+ may not have been tested as thoroughly. In 2020, version 8.1.0 works fine!&lt;br /&gt;
* &#039;&#039;&#039;Architecture:&#039;&#039;&#039; i686&lt;br /&gt;
* &#039;&#039;&#039;Threads:&#039;&#039;&#039; posix&lt;br /&gt;
* &#039;&#039;&#039;Exception:&#039;&#039;&#039; sjlj &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;This is the only setting which needs to be changed from the default&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Build Revision:&#039;&#039;&#039; The latest one&lt;br /&gt;
&lt;br /&gt;
== Adding to PATH ==&lt;br /&gt;
&lt;br /&gt;
Once installed, you should add the MinGW directory to your PATH variable so that Cmake can find the relevant binaries. &lt;br /&gt;
&lt;br /&gt;
* Go to System properties (either via Control Panel\System and Security\System or by right clicking &#039;Computer&#039; on the desktop), then click &#039;Advanced System Settings&#039;. &lt;br /&gt;
* Click the &#039;Environment Variables&#039; button at the bottom. &lt;br /&gt;
* Find Path in the &#039;System Variables&#039; scrollbox, add an extra &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; to the end and then copy-paste in the MinGW directory (e.g. default is &amp;lt;code&amp;gt;C:\Program Files (x86)\mingw-w64\i686-4.9.1-posix-sjlj-rt_v3-rev0\mingw32\bin&amp;lt;/code&amp;gt;). &lt;br /&gt;
* Alternative instructions with images are easy to find online, for example [http://geekswithblogs.net/renso/archive/2009/10/21/how-to-set-the-windows-path-in-windows-7.aspx here].&lt;br /&gt;
&lt;br /&gt;
= Get the Source Code =&lt;br /&gt;
&lt;br /&gt;
* use git&#039;s bash (you find it in the right click context menu when clicking the folder), &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into your spring source dir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone https://github.com/spring/mingwlibs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* update it from time to time with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure you install the package in the checkout directory, so the path is: /spring/mingwlibs. If done right, it will look like:&lt;br /&gt;
** */spring/&lt;br /&gt;
** */spring/...&lt;br /&gt;
** */spring/mingwlibs&lt;br /&gt;
** */spring/rts&lt;br /&gt;
&lt;br /&gt;
* Note: if you install the package somewhere else (preferably outside of the source tree), and pass its location with the &#039;&#039;MINGDIR&#039;&#039; option to CMake in the configure step (see further down, in the quick instructions).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== configure using CMake ==&lt;br /&gt;
&lt;br /&gt;
Note, as of 2020, cmake-3.10.1-win64-x64.msi from https://cmake.org/files/v3.10/ works, 3.18 has issues detecting zlib.&lt;br /&gt;
&lt;br /&gt;
* run the &#039;&#039;cmake-gui&#039;&#039; and select a source and a build directory&lt;br /&gt;
* press &#039;&#039;&#039;Configure&#039;&#039;&#039; and follow the instructions&lt;br /&gt;
* specify native compilers by entering the paths to gcc.exe and g++.exe from your mingw64-builds directory&lt;br /&gt;
* In case of configuration errors make sure AI_TYPES variable is set to NONE (default is ALL). This should remedy the issues press &#039;&#039;&#039;Configure&#039;&#039;&#039; again (Remark: Setting NATIVE works as well (tested in commit 9108cae116))&lt;br /&gt;
* This is where you can specify the build type, REL for release, DEBUG for debug build, and RELWITHDEBINFO for a mix&lt;br /&gt;
* press &#039;&#039;&#039;Generate&#039;&#039;&#039;&lt;br /&gt;
* open a console (&#039;&#039;cmd.exe&#039;&#039;), &#039;&#039;cd&#039;&#039; into your &#039;&#039;&#039;build&#039;&#039;&#039; directory&lt;br /&gt;
* &#039;&#039;optional:&#039;&#039; for multi-threaded compilation, the &#039;&#039;mingw32-make&#039;&#039; part may differ on your system: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;set MAKE_COMMAND=mingw32-make -j2&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; (use -j4 for 4 threads). For codeblocks configure CMAKE_CODEBLOCKS_MAKE_ARGUMENTS as -j4 &lt;br /&gt;
* compile with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make install-spring&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* compile just the engine (spring.exe) with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make engine-legacy&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Generating the AI Sources/Wrappers===&lt;br /&gt;
&lt;br /&gt;
you can either build the wrapper:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make Cpp-AIWrapper&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or generate all sources, in case you don&#039;t need the binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make generateSources&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Possible Problems===&lt;br /&gt;
* If you get &amp;lt;span class=warning&amp;gt;undefined reference to `_Unwind_Resume&#039;&amp;lt;/span&amp;gt; linking errors, deinstall &#039;&#039;whole&#039;&#039; MinGW and reinstall it with &#039;&#039;sjlj&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* When you installed an old version of MinGW/TDM and forgot to deinstall it correctly, &amp;lt;code&amp;gt;gcc.exe&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;g++.exe&amp;lt;/code&amp;gt; will be named &amp;lt;code&amp;gt;gcc-dw2.exe&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;g++-dw2.exe&amp;lt;/code&amp;gt;. CMake will then fail to find the correct one, first try to deinstall anything mingw related and reinstall everything. If that didn&#039;t helped just rename the files. If even that doesn&#039;t help open cmake-gui and click the advanced button and set the paths to the correct files yourself (&amp;lt;code&amp;gt;CMAKE_C_COMPILER&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;CMAKE_CXX_COMPILER&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
You can still use Visual Studio 2012 as described below to edit the code. This is very useful because it allows excellent code navigation, and it highlights syntax errors and trivial mistakes before compiling. &lt;br /&gt;
&lt;br /&gt;
For debugging mingw builds, you can aquire a windows build of gdb from http://www.equation.com/servlet/equation.cmd?fa=gdb&lt;br /&gt;
&lt;br /&gt;
To start debugging, copy &#039;&#039;gdb.exe&#039;&#039; to your build output directory, and launch it with &#039;&#039;gdb spring.exe&#039;&#039;. You can supply command line arguments to &#039;&#039;spring.exe&#039;&#039; with &#039;&#039;gdb --args spring.exe myreplayfile.sdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Compiling with Visual Studio (not officially supported!)=&lt;br /&gt;
Currently Visual Studio lacks some c++ features it doesn&#039;t compile spring!&lt;br /&gt;
&lt;br /&gt;
==General Visual Studio Notes==&lt;br /&gt;
When developing using Visual Studio keep in mind:&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;It&#039;s experimental and not proved to compile or run!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Your VS build won&#039;t sync with GCC builds in multiplayer mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*AIs built with Visual Studio will work with the mingw32 release builds thanks to the C AI Interface, however this interface may change when newer releases are made&lt;br /&gt;
*Running any non-LUA AI on VS built Spring will crash it&lt;br /&gt;
&lt;br /&gt;
===2012 (v11)===&lt;br /&gt;
&lt;br /&gt;
Install [http://www.microsoft.com/visualstudio/eng/downloads#d-express-windows-desktop Visual Studio 2012 Express for Windows Desktop], [http://www.microsoft.com/en-us/download/confirmation.aspx?id=35515 Visual C++ Compiler November 2012 CTP], [http://www.cmake.org/ cmake], [http://www.7-zip.org 7-zip] and [http://msysgit.github.io/ msysgit].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From the Startmenu run &amp;quot;VS2012 x86 Native Tools Command Prompt&amp;quot; and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
set PATH=%PATH%;%PROGRAMFILES%\git\bin;%PROGRAMFILES%\cmake 2.8\bin\&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone git://github.com/spring/vclibs11.git vclibs&lt;br /&gt;
cmake -G &amp;quot;Visual Studio 11&amp;quot; .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now start visual studio &amp;amp; open Spring.sln. Select &amp;quot;engine-legacy&amp;quot; as default project, as AIs and ofter stuff are known to fail to compile on visual studio.&lt;br /&gt;
&lt;br /&gt;
In the Project Properties, make sure to [http://stackoverflow.com/questions/13238408/variadic-template-in-vs-2012-visual-c-november-2012-ctp select the Microsoft Visual C++ Compiler Nov 2012 CTP].&lt;br /&gt;
&lt;br /&gt;
Note: Visual Studio 2012 Express for Windows Desktop is for free, but requires a registration after 30 days (to get a free license).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:grass&amp;diff=13810</id>
		<title>Mapdev:grass</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:grass&amp;diff=13810"/>
		<updated>2020-04-07T12:29:53Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Blade Texture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Grass =&lt;br /&gt;
Grass is entirely optional, but can be customized via map parameters and adds a nice touch to your map.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| [[File:Mapdev-grass.png]] || [[File:Mapdev-grass-example.png|451px]]&lt;br /&gt;
|-&lt;br /&gt;
! Example Grass Disribution&lt;br /&gt;
! In Game Result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
== mapinfo.lua ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
        ....&lt;br /&gt;
        grassmapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
        ....&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle = 1.57,&lt;br /&gt;
      bladeColor = {0.59, 0.81, 0.57},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
=== Blade Wave Scale ===&lt;br /&gt;
Defaults to 1. It specifies how much the blades will wave in the wind. Higher makes them wave more.&lt;br /&gt;
&lt;br /&gt;
=== Blade Height ===&lt;br /&gt;
Default is 4. Defines the length of the blade of grass in elmos.&lt;br /&gt;
&lt;br /&gt;
=== Blade Angle ===&lt;br /&gt;
Default is pi/4. It defines how much each blade of grass curves.&lt;br /&gt;
&lt;br /&gt;
=== Blade Color ===&lt;br /&gt;
does nothing when blade texture is set.&lt;br /&gt;
&lt;br /&gt;
== Distribution Image ==&lt;br /&gt;
Formerly [[Mapdev:features|Feature]] Map. Grass distribution is defined by blue pixels, the more blue the pixel is (the closer to blue 255 it is), the thicker grass will be at that location. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| The distribution map is an intermediary file compiled into the SMF/SMT files using [[MapConv]] or [[MapConvNG]], it can also be specified in the mapinfo.lua&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| Any that Mapconv programs support&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| Greyscale&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| &amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!Spring Map Size&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
!pixels = Spring Map Size * 16&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| ...&lt;br /&gt;
| ...&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| 512&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left;font-style:italic&amp;quot; colspan=2 | &amp;amp;#42; must be multiples of 2&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Shading Image ==&lt;br /&gt;
* If a shading image is not present, the minimap will be used in its place.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be stretched over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| [[File:Grassmap_Map_example.jpegâ€Ž]] || [[File:Grassmap_Map_ingame.jpg|512px|â€Ž]]&lt;br /&gt;
|-&lt;br /&gt;
! Example !! Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Blade Texture ==&lt;br /&gt;
Specify a texture for the individual grass blades. The grass blades go from top to bottom, vertically. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB (alpha does nothing here)&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
| https://springrts.com/mediawiki/images/3/36/Grass_blade_tex_testing.png || https://springrts.com/mediawiki/images/9/9f/Grass_blade_tex_ingame.PNG&lt;br /&gt;
|-&lt;br /&gt;
! Example  !! Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Forum Discussions =&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=27585 Try to keep perspective]&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=File:Grass_blade_tex_ingame.PNG&amp;diff=21770</id>
		<title>File:Grass blade tex ingame.PNG</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=File:Grass_blade_tex_ingame.PNG&amp;diff=21770"/>
		<updated>2020-04-07T12:29:28Z</updated>

		<summary type="html">&lt;p&gt;Beherith: Grass_blade_tex_ingame&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Grass_blade_tex_ingame&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=File:Grass_blade_tex_testing.png&amp;diff=21771</id>
		<title>File:Grass blade tex testing.png</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=File:Grass_blade_tex_testing.png&amp;diff=21771"/>
		<updated>2020-04-07T12:26:00Z</updated>

		<summary type="html">&lt;p&gt;Beherith: Grass_blade_tex_testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Grass_blade_tex_testing&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:grass&amp;diff=13809</id>
		<title>Mapdev:grass</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:grass&amp;diff=13809"/>
		<updated>2020-04-07T12:24:35Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Blade Texture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Grass =&lt;br /&gt;
Grass is entirely optional, but can be customized via map parameters and adds a nice touch to your map.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| [[File:Mapdev-grass.png]] || [[File:Mapdev-grass-example.png|451px]]&lt;br /&gt;
|-&lt;br /&gt;
! Example Grass Disribution&lt;br /&gt;
! In Game Result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
== mapinfo.lua ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
        ....&lt;br /&gt;
        grassmapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
        ....&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle = 1.57,&lt;br /&gt;
      bladeColor = {0.59, 0.81, 0.57},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
=== Blade Wave Scale ===&lt;br /&gt;
Defaults to 1. It specifies how much the blades will wave in the wind. Higher makes them wave more.&lt;br /&gt;
&lt;br /&gt;
=== Blade Height ===&lt;br /&gt;
Default is 4. Defines the length of the blade of grass in elmos.&lt;br /&gt;
&lt;br /&gt;
=== Blade Angle ===&lt;br /&gt;
Default is pi/4. It defines how much each blade of grass curves.&lt;br /&gt;
&lt;br /&gt;
=== Blade Color ===&lt;br /&gt;
does nothing when blade texture is set.&lt;br /&gt;
&lt;br /&gt;
== Distribution Image ==&lt;br /&gt;
Formerly [[Mapdev:features|Feature]] Map. Grass distribution is defined by blue pixels, the more blue the pixel is (the closer to blue 255 it is), the thicker grass will be at that location. &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| The distribution map is an intermediary file compiled into the SMF/SMT files using [[MapConv]] or [[MapConvNG]], it can also be specified in the mapinfo.lua&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| Any that Mapconv programs support&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| Greyscale&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| &amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!Spring Map Size&amp;lt;sup&amp;gt;*&amp;lt;/sup&amp;gt;&lt;br /&gt;
!pixels = Spring Map Size * 16&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| ...&lt;br /&gt;
| ...&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| 512&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align: left;font-style:italic&amp;quot; colspan=2 | &amp;amp;#42; must be multiples of 2&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Shading Image ==&lt;br /&gt;
* If a shading image is not present, the minimap will be used in its place.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be stretched over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| [[File:Grassmap_Map_example.jpegâ€Ž]] || [[File:Grassmap_Map_ingame.jpg|512px|â€Ž]]&lt;br /&gt;
|-&lt;br /&gt;
! Example !! Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Blade Texture ==&lt;br /&gt;
{{FIXME}} need more info.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB (alpha does nothing here)&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
| {{FIXME}} || {{FIXME}}&lt;br /&gt;
|-&lt;br /&gt;
! Example  [[File:Example.jpg]] !! Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Forum Discussions =&lt;br /&gt;
* [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=27585 Try to keep perspective]&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3718</id>
		<title>Building Spring on Windows</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Building_Spring_on_Windows&amp;diff=3718"/>
		<updated>2020-03-26T15:20:09Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Installing MinGW-w64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Engine_Development|Development]] &amp;lt; [[Building_spring|Building Spring]] &amp;lt; {{FULLPAGENAME}}&lt;br /&gt;
{{#css:&lt;br /&gt;
  code * {margin:inherit;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
If you only want to produce your own Spring game and not contribute to the core engine, compilation is not necessary. Check out [[Gamedev:Main]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=warning&amp;gt;Warning:&amp;lt;/span&amp;gt; Compiling Spring on Windows often causes problems, it is heavily recommended to use [[Building_Spring_on_Linux|Linux]] for developing the Spring RTS Engine if possible.&lt;br /&gt;
&lt;br /&gt;
Some reasons for this:&lt;br /&gt;
* Of the active developers nobody uses windows for developing. So they might not be able to help as effectively as on Linux.&lt;br /&gt;
* Setting up a build environment takes a lot more time on windows&lt;br /&gt;
* Compiling is often slower on windows&lt;br /&gt;
* Compiling on windows is poorly tested (which possibly leads to some random / unknown / weird errors)&lt;br /&gt;
&lt;br /&gt;
That said, if you do wish to use Windows, the best place to get real-time help is the #sy lobby channel, or #sy on [[IRC]].&lt;br /&gt;
&lt;br /&gt;
=Compiling with MinGW=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Install [http://www.cmake.org/ CMake] and [http://msysgit.github.io/ msysGit] and MinGW-w64:&lt;br /&gt;
&lt;br /&gt;
When installing msysGit you should select the option to &amp;quot;Run Git from the Windows Command Prompt&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
[[File:Msysgit6.png|400px]]&lt;br /&gt;
&lt;br /&gt;
This is in order to automatically add Git to PATH making it easy for CMake to find.&lt;br /&gt;
&lt;br /&gt;
== Installing MinGW-w64 ==&lt;br /&gt;
&lt;br /&gt;
Download and run the &amp;quot;Mingw-builds project - native toolchains using trunk&amp;quot; installer from [http://mingw-w64.org/doku.php/download/mingw-builds].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Select the following options:&lt;br /&gt;
&lt;br /&gt;
[[File:InstallingMinGW-w64.png|400px]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Version:&#039;&#039;&#039; Any version above 4.8.x should work, 4.9.x+ may not have been tested as thoroughly. In 2020, version 8.1.0 works fine!&lt;br /&gt;
* &#039;&#039;&#039;Architecture:&#039;&#039;&#039; i686&lt;br /&gt;
* &#039;&#039;&#039;Threads:&#039;&#039;&#039; posix&lt;br /&gt;
* &#039;&#039;&#039;Exception:&#039;&#039;&#039; sjlj &amp;lt;span class=&amp;quot;note&amp;quot;&amp;gt;This is the only setting which needs to be changed from the default&amp;lt;/span&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Build Revision:&#039;&#039;&#039; The latest one&lt;br /&gt;
&lt;br /&gt;
== Adding to PATH ==&lt;br /&gt;
&lt;br /&gt;
Once installed, you should add the MinGW directory to your PATH variable so that Cmake can find the relevant binaries. &lt;br /&gt;
&lt;br /&gt;
* Go to System properties (either via Control Panel\System and Security\System or by right clicking &#039;Computer&#039; on the desktop), then click &#039;Advanced System Settings&#039;. &lt;br /&gt;
* Click the &#039;Environment Variables&#039; button at the bottom. &lt;br /&gt;
* Find Path in the &#039;System Variables&#039; scrollbox, add an extra &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; to the end and then copy-paste in the MinGW directory (e.g. default is &amp;lt;code&amp;gt;C:\Program Files (x86)\mingw-w64\i686-4.9.1-posix-sjlj-rt_v3-rev0\mingw32\bin&amp;lt;/code&amp;gt;). &lt;br /&gt;
* Alternative instructions with images are easy to find online, for example [http://geekswithblogs.net/renso/archive/2009/10/21/how-to-set-the-windows-path-in-windows-7.aspx here].&lt;br /&gt;
&lt;br /&gt;
= Get the Source Code =&lt;br /&gt;
&lt;br /&gt;
* use git&#039;s bash (you find it in the right click context menu when clicking the folder), &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; into your spring source dir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone https://github.com/spring/mingwlibs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* update it from time to time with: &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure you install the package in the checkout directory, so the path is: /spring/mingwlibs. If done right, it will look like:&lt;br /&gt;
** */spring/&lt;br /&gt;
** */spring/...&lt;br /&gt;
** */spring/mingwlibs&lt;br /&gt;
** */spring/rts&lt;br /&gt;
&lt;br /&gt;
* Note: if you install the package somewhere else (preferably outside of the source tree), and pass its location with the &#039;&#039;MINGDIR&#039;&#039; option to CMake in the configure step (see further down, in the quick instructions).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== configure using CMake ==&lt;br /&gt;
&lt;br /&gt;
* run the &#039;&#039;cmake-gui&#039;&#039; and select a source and a build directory&lt;br /&gt;
* press &#039;&#039;&#039;Configure&#039;&#039;&#039; and follow the instructions&lt;br /&gt;
* In case of configuration errors make sure AI_TYPES variable is set to NONE (default is ALL). This should remedy the issues press &#039;&#039;&#039;Configure&#039;&#039;&#039; again&lt;br /&gt;
* press &#039;&#039;&#039;Generate&#039;&#039;&#039;&lt;br /&gt;
* open a console (&#039;&#039;cmd.exe&#039;&#039;), &#039;&#039;cd&#039;&#039; into your &#039;&#039;&#039;build&#039;&#039;&#039; directory&lt;br /&gt;
* &#039;&#039;optional:&#039;&#039; for multi-threaded compilation, the &#039;&#039;mingw32-make&#039;&#039; part may differ on your system: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;set MAKE_COMMAND=mingw32-make -j2&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt; (use -j4 for 4 threads)&lt;br /&gt;
* compile with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make install-spring&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* compile just the engine (spring.exe) with: &amp;lt;code&amp;gt;&#039;&#039;&amp;lt;pre&amp;gt;mingw32-make engine-legacy&amp;lt;/pre&amp;gt;&#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Generating the AI Sources/Wrappers===&lt;br /&gt;
&lt;br /&gt;
you can either build the wrapper:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make Cpp-AIWrapper&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or generate all sources, in case you don&#039;t need the binary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;make generateSources&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Possible Problems===&lt;br /&gt;
* If you get &amp;lt;span class=warning&amp;gt;undefined reference to `_Unwind_Resume&#039;&amp;lt;/span&amp;gt; linking errors, deinstall &#039;&#039;whole&#039;&#039; MinGW and reinstall it with &#039;&#039;sjlj&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* When you installed an old version of MinGW/TDM and forgot to deinstall it correctly, &amp;lt;code&amp;gt;gcc.exe&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;g++.exe&amp;lt;/code&amp;gt; will be named &amp;lt;code&amp;gt;gcc-dw2.exe&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;g++-dw2.exe&amp;lt;/code&amp;gt;. CMake will then fail to find the correct one, first try to deinstall anything mingw related and reinstall everything. If that didn&#039;t helped just rename the files. If even that doesn&#039;t help open cmake-gui and click the advanced button and set the paths to the correct files yourself (&amp;lt;code&amp;gt;CMAKE_C_COMPILER&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;CMAKE_CXX_COMPILER&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
&lt;br /&gt;
You can still use Visual Studio 2012 as described below to edit the code. This is very useful because it allows excellent code navigation, and it highlights syntax errors and trivial mistakes before compiling. &lt;br /&gt;
&lt;br /&gt;
For debugging mingw builds, you can aquire a windows build of gdb from http://www.equation.com/servlet/equation.cmd?fa=gdb&lt;br /&gt;
&lt;br /&gt;
To start debugging, copy &#039;&#039;gdb.exe&#039;&#039; to your build output directory, and launch it with &#039;&#039;gdb spring.exe&#039;&#039;. You can supply command line arguments to &#039;&#039;spring.exe&#039;&#039; with &#039;&#039;gdb --args spring.exe myreplayfile.sdf&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Compiling with Visual Studio (not officially supported!)=&lt;br /&gt;
Currently Visual Studio lacks some c++ features it doesn&#039;t compile spring!&lt;br /&gt;
&lt;br /&gt;
==General Visual Studio Notes==&lt;br /&gt;
When developing using Visual Studio keep in mind:&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;It&#039;s experimental and not proved to compile or run!&amp;lt;/span&amp;gt;&lt;br /&gt;
*&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;Your VS build won&#039;t sync with GCC builds in multiplayer mode&amp;lt;/span&amp;gt;&lt;br /&gt;
*AIs built with Visual Studio will work with the mingw32 release builds thanks to the C AI Interface, however this interface may change when newer releases are made&lt;br /&gt;
*Running any non-LUA AI on VS built Spring will crash it&lt;br /&gt;
&lt;br /&gt;
===2012 (v11)===&lt;br /&gt;
&lt;br /&gt;
Install [http://www.microsoft.com/visualstudio/eng/downloads#d-express-windows-desktop Visual Studio 2012 Express for Windows Desktop], [http://www.microsoft.com/en-us/download/confirmation.aspx?id=35515 Visual C++ Compiler November 2012 CTP], [http://www.cmake.org/ cmake], [http://www.7-zip.org 7-zip] and [http://msysgit.github.io/ msysgit].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From the Startmenu run &amp;quot;VS2012 x86 Native Tools Command Prompt&amp;quot; and type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
set PATH=%PATH%;%PROGRAMFILES%\git\bin;%PROGRAMFILES%\cmake 2.8\bin\&lt;br /&gt;
git clone --recursive git://github.com/spring/spring.git -b develop&lt;br /&gt;
cd spring&lt;br /&gt;
git clone git://github.com/spring/vclibs11.git vclibs&lt;br /&gt;
cmake -G &amp;quot;Visual Studio 11&amp;quot; .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now start visual studio &amp;amp; open Spring.sln. Select &amp;quot;engine-legacy&amp;quot; as default project, as AIs and ofter stuff are known to fail to compile on visual studio.&lt;br /&gt;
&lt;br /&gt;
In the Project Properties, make sure to [http://stackoverflow.com/questions/13238408/variadic-template-in-vs-2012-visual-c-november-2012-ctp select the Microsoft Visual C++ Compiler Nov 2012 CTP].&lt;br /&gt;
&lt;br /&gt;
Note: Visual Studio 2012 Express for Windows Desktop is for free, but requires a registration after 30 days (to get a free license).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14035</id>
		<title>Mapdev:splatdetailnormals</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14035"/>
		<updated>2019-11-18T11:57:32Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Detail Normal Texture Splatting (DNTS) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Detail Normal Texture Splatting (DNTS) =&lt;br /&gt;
&lt;br /&gt;
This extends the existing functionality of SSMF splatted detail textures [[Mapdev:splatdetail]], with the option of specifying 4 different (normal map + greyscale diffuse map) detail textures.&lt;br /&gt;
&lt;br /&gt;
Splatted detail textures only allowed grayscale textures to be overlayed on the map, while DNTS also allows normal maps as well.&lt;br /&gt;
&lt;br /&gt;
Instead of creating a combined detail texture of 4 different single-channel diffuse detail textures stored in a single RGBA image, it uses four separate normal textures. &lt;br /&gt;
&lt;br /&gt;
The textures must contain the normal maps in the RGB channel (standard normal maps), with an optional diffuse luminance in the alpha channel. &lt;br /&gt;
&lt;br /&gt;
Beherith recommends using a high-pass filter on the luminance diffuse (alpha) channel, to avoid visible banding when zoomed out. When using PBR materials as DNTS sources, he also recommends mixing the diffuse and ambient occlusion parts of the textures into the diffuse alpha, as well as keeping the alpha channel centered around 50% greyscale, and with preferably a low spread to make sure that diffuse doesnt overpower the nice normals you have added.&lt;br /&gt;
&lt;br /&gt;
The system uses the same splatDistributionTexture as regular SSMF.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You cannot specify these options in .smd files, only .lua!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example result:&lt;br /&gt;
&lt;br /&gt;
[[File:dnts_example.jpg|960px]]&lt;br /&gt;
== Distribution Image ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, DDS&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGBA&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be stretched over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RGBA Channels are individual greyscale distribution maps which define which detail textures to splat onto the ground. The intensity of the splatted textures is multipled by the pixel values for the corresponding channels.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Example&lt;br /&gt;
| [[File:Mapdev-ddist.gif]] || [[File:Mapdev-ddist.png]]&lt;br /&gt;
|-&lt;br /&gt;
! Detail Distribution maps !! Combined Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Detail Normal Textures ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, DDS &lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB for normal maps only, RGBA for normal map + diffuse map in alpha channel. The Y (green) channel of normal maps should be inverted.&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be tiled over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Detail Normal Texture Example&lt;br /&gt;
| [[File:Mapdev-dnts-normal.jpg|400px]] || [[File:Mapdev-dnts-diffuse-alpha.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Normal texture in RGB channel !! greyscale diffuse in ALPHA channel&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalTex1 .. splatDetailNormalTex4 in the MAP resources section. splatDetailTex will be unused if and of splatDetailNormalTex[1-4] are present. &lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalDiffuseAlpha=1 to enable diffuse textures stored in alpha channels.&lt;br /&gt;
&lt;br /&gt;
splatDetailNormalDiffuseAlpha=0 is the default value, and will ignore all and any alpha channels in the splatDetailNormalTex&#039;s, resulting in a purely normal mapped surface, with no extra diffuse texturing. &lt;br /&gt;
&lt;br /&gt;
texScales and texMults work identically to [[Mapdev:splatdetail]]&lt;br /&gt;
&lt;br /&gt;
== mapinfo.lua ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
      splatDistrTex = &amp;quot;splatDistributionTex.tga&amp;quot;,&lt;br /&gt;
      splatDetailNormalDiffuseAlpha = 1,&lt;br /&gt;
      splatDetailNormalTex = {&lt;br /&gt;
         &amp;quot;sandpebbles_NORM.tga&amp;quot;,&lt;br /&gt;
         &amp;quot;crystal_245_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;grass_91_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;pebbles_250_dnts_u8888.dds&amp;quot;,&lt;br /&gt;
          alpha = true,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13913</id>
		<title>Mapdev:mapinfo.lua</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13913"/>
		<updated>2019-11-11T15:58:45Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* grass */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mapinfo.lua Reference =&lt;br /&gt;
This file is the primary configuration file for maps, list many things including resources, attributes, ad properties.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which reads this file from the map is viewable here:&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapInfo.cpp}}&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Can be found in the [https://github.com/jk3064/Map-Blueprint/archive/master.zip map blueprint]&lt;br /&gt;
&lt;br /&gt;
= File Location =&lt;br /&gt;
relative to the root directory of the map&lt;br /&gt;
: ./mapinfo.lua&lt;br /&gt;
&lt;br /&gt;
= Formatting =&lt;br /&gt;
check [http://www.lua.org/docs.html Lua Documentation] for syntax etc.&lt;br /&gt;
&lt;br /&gt;
In this wiki page, variables are organised as such:&lt;br /&gt;
{{tag|name=VariableName|type=type|range=[valid range]|special=Required|default=value&lt;br /&gt;
|description=Description}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
= Sections =&lt;br /&gt;
== mapinfo ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   name        = &amp;quot;MyMap&amp;quot;,&lt;br /&gt;
   shortname   = &amp;quot;&amp;quot;,&lt;br /&gt;
   description = &amp;quot;&amp;quot;,&lt;br /&gt;
   author      = &amp;quot;&amp;quot;,&lt;br /&gt;
   version     = &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   --mutator   = &amp;quot;deployment&amp;quot;;&lt;br /&gt;
   mapfile     = &amp;quot;maps/mymap.smf&amp;quot;, -- // location of smf/sm3 file&lt;br /&gt;
   modtype     = 3, --// 1=primary, 0=hidden, 3=map&lt;br /&gt;
   depend      = {&amp;quot;Map Helper v1&amp;quot;},&lt;br /&gt;
   replace     = {},&lt;br /&gt;
&lt;br /&gt;
   --startpic   = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
   --StartMusic = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
&lt;br /&gt;
   maphardness     = 100,&lt;br /&gt;
   notDeformable   = false,&lt;br /&gt;
   gravity         = 130,&lt;br /&gt;
   tidalStrength   = 0,&lt;br /&gt;
   maxMetal        = 0.02,&lt;br /&gt;
   extractorRadius = 500.0,&lt;br /&gt;
   voidWater       = false,&lt;br /&gt;
   voidGround      = false,&lt;br /&gt;
   autoShowMetal   = true,&lt;br /&gt;
&lt;br /&gt;
   smf = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   splats = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   grass = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   lighting = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   water = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   teams = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   custom = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string|special=Required|default=none&lt;br /&gt;
|description=Name of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shortname|type=string|special=Required&lt;br /&gt;
|description=maps will not show in the map list without a valid shortname(not sure on its requirements)}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=description|type=string|default=&amp;lt;span style=&amp;quot;color:#cccccc;text-shadow: #111 2px 2px 2px;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=The description of the map that shows in the multiplayer battleroom}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=author|type=string|default=&amp;quot;&amp;quot;&lt;br /&gt;
|description=Author of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=version|type=string&lt;br /&gt;
|description=version, appended to name}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mutator|type=string}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mapfile|type=string&lt;br /&gt;
|description=location of smf/sm3 file}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=modtype|type=int|range=[013]|special=Required&lt;br /&gt;
|description=1=primary, 0=hidden, 3=map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=depend|special=Required}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=replace}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maphardness|type=float|default=100.0&lt;br /&gt;
|description=Defines how much a map will deform from impacts. Higher values mean less deformation, negative values will result in negative deformation (really funny looking)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=notDeformable|type=bool|default=false&lt;br /&gt;
|description=Setting it to 1 means that no explosions can deform the map.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gravity|type=float|range=[0.001-max]|default=130.0&lt;br /&gt;
|description=As you would expect, affects ballistics and how far units fly after an explosion. The force of gravity in units/sec^2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=tidalStrength|type=float|range=[0.0-max]|default=0.0&lt;br /&gt;
|description=The amount of energy which will be given by tidal generators.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxMetal|type=float|range=[0.0-max]|default=0.02&lt;br /&gt;
|description=How much metal a map square with the maximum metal value gives.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=extractorRadius|type=float|range=[0.0-max]|default=500&lt;br /&gt;
|description=The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidWater|type=bool|default=false&lt;br /&gt;
|description=Voidwater means there will be no water plane, and all parts of the map under water will be completely transparent, to show the skybox through the map. For example, check [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20684&amp;amp;hilit=apophis Apophis_v2]}}. Additionally for this to work, the &amp;lt;code&amp;gt;mapinfo.water.planeColor&amp;lt;/code&amp;gt; variable must not be specified in the mapinfo.lua file, delete or comment it out if it exists.&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidGround|type=bool|default=false&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 92.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=Allows portions of the ground to be invisible if the map was compiled with a diffuse image that has an alpha channel. The terrain still exists, its just transparent.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidAlphaMin|type=float|default=0.9&lt;br /&gt;
|description=Controls what alpha level the transparency trigger.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=autoShowMetal|type=bool|default=true&lt;br /&gt;
|description=Defines whether the metal map (F4 mode) is shown automatically when a mex is queued for placement.}}&lt;br /&gt;
&lt;br /&gt;
== smf ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
      minHeight = 1000,&lt;br /&gt;
      maxHeight = -300,&lt;br /&gt;
      minimapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName0 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName1 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName.. = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileNameN = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=minHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the minimum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the maximum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minimapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the minimap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=metalmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the metalmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=typemapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the typemap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the grassmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=smtFileName[N]|type=string}}&lt;br /&gt;
&lt;br /&gt;
== sound ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      preset = &amp;quot;default&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      reverb = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=preset|type=string|default=&amp;quot;default&amp;quot;&lt;br /&gt;
|description=Sets the _reverb_ preset (= echo parameters), passfilter (the direct sound) is unchanged. To get a list of all possible presets check: [https://github.com/spring/spring/blob/master/rts/System/Sound/OpenAL/EFXPresets.cpp EFXPresets.cpp]}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can change the preset at runtime via:&lt;br /&gt;
* /tset UseEFX [1&amp;amp;#124;0]&lt;br /&gt;
* /tset snd_eaxpreset preset_name   (may change to a real cmd in the future)&lt;br /&gt;
* /tset snd_filter %gainlf %gainhf  (may    &amp;quot;   &amp;quot;  &amp;quot;  &amp;quot;    &amp;quot;  &amp;quot;   &amp;quot;    &amp;quot;   )}}&lt;br /&gt;
&lt;br /&gt;
=== passfilter ===&lt;br /&gt;
Note, you likely want to set these tags due to the fact that they are _not_ set by `preset`!  So if you want to create a muffled sound you need to use them.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         gainlf = 1.0,&lt;br /&gt;
         gainhf = 1.0,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainlf|type=float}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainhf|type=float}}&lt;br /&gt;
&lt;br /&gt;
=== reverb ===&lt;br /&gt;
Normally you just want use the `preset` tag but you can use handtweak a preset if wanted with the following tags. To know their function &amp;amp; ranges check the official OpenAL1.1 SDK document.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      reverb = {         &lt;br /&gt;
         --density&lt;br /&gt;
         --diffusion&lt;br /&gt;
         --gain&lt;br /&gt;
         --gainhf&lt;br /&gt;
         --gainlf&lt;br /&gt;
         --decaytime&lt;br /&gt;
         --decayhflimit&lt;br /&gt;
         --decayhfratio&lt;br /&gt;
         --decaylfratio&lt;br /&gt;
         --reflectionsgain&lt;br /&gt;
         --reflectionsdelay&lt;br /&gt;
         --reflectionspan&lt;br /&gt;
         --latereverbgain&lt;br /&gt;
         --latereverbdelay&lt;br /&gt;
         --latereverbpan&lt;br /&gt;
         --echotime&lt;br /&gt;
         --echodepth&lt;br /&gt;
         --modtime&lt;br /&gt;
         --moddepth&lt;br /&gt;
         --airabsorptiongainhf&lt;br /&gt;
         --hfreference&lt;br /&gt;
         --lfreference&lt;br /&gt;
         --roomrollofffactor&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== resources ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      specularTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDetailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDistrTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      skyReflectModTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailNormalTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      lightEmissionTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      parallaxHeightTex = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassBladeTex|type=string&lt;br /&gt;
|description=Specifies the texture to be used on the grass blades themselves. Green-yellow gradients make for some interesting effects. Defaults to the internally generated blade texture. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassShadingTex|type=string&lt;br /&gt;
|description=Specifies the color variation of the grass across the map. This defaults to the minimap, so the grass color can match the map color. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailTex|type=string&lt;br /&gt;
|description=Specifies the detail texture for the map. More Information: [[Mapdev:detail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:specular]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDetailTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDistrTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyReflectModTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:skyreflectmod]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailNormalTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:normal]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=lightEmissionTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:lightemission]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=parallaxHeightTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:parallax]]}}&lt;br /&gt;
&lt;br /&gt;
== splats ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults  = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=texScales|type=float[4]&lt;br /&gt;
|default={0.2, 0.2, 0.2, 0.2}|description=Scale value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=texMults|type=float[4]&lt;br /&gt;
|default={1.0, 1.0, 1.0, 1.0}|description=Value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
== atmosphere ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      minWind      = 5.0,&lt;br /&gt;
      maxWind      = 25.0,&lt;br /&gt;
&lt;br /&gt;
      fogStart     = 0.1,&lt;br /&gt;
      fogEnd       = 1.0,&lt;br /&gt;
      fogColor     = {0.7, 0.7, 0.8},&lt;br /&gt;
&lt;br /&gt;
      sunColor     = {1.0, 1.0, 1.0},&lt;br /&gt;
      skyColor     = {0.1, 0.15, 0.7},&lt;br /&gt;
      skyDir       = {0.0, 0.0, -1.0},&lt;br /&gt;
      skyBox       = &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      cloudDensity = 0.5,&lt;br /&gt;
      cloudColor   = {1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minWind|type=float|range=[0.0-max]|default=5.0|&lt;br /&gt;
description=The minimum amount of energy the wind on the map will give. is clamped to maxwind}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxWind|type=float|range=[0.0-max]|default=25.0&lt;br /&gt;
|description=The maximum amount of energy the wind on the map will give}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogStart|type=float|default=0.1&lt;br /&gt;
|description=The distance from the camera at which the fog will start. &amp;lt;code&amp;gt;viewRange * fogStart&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogEnd|type=float|default=1.0&lt;br /&gt;
|description=The distance from the camera that fog is opaque. &amp;lt;code&amp;gt;viewRange * fogEnd&amp;lt;/code&amp;gt; }}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogColor|type=rgb|default={0.7, 0.7, 0.8}&lt;br /&gt;
|description=The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. However, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunColor|type=rgb|default={1.0, 1.0, 1.0}&lt;br /&gt;
|description=The color of the sun in the sky. The values are in the order Red, Green, Blue. This will also effect the size of the star. As the values increase (including over 1.0), the disc will get bigger; the inverse is also true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyColor|type=rgb|default={0.1, 0.15, 0.7}&lt;br /&gt;
|description=The color of the sky itself. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyDir|type=float[3]|default={0.0, 0.0, -1.0}&lt;br /&gt;
|description=Is normalised vector}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyBox|type=string&lt;br /&gt;
|description=Specify a .dds skybox (also called skycube) for examples and resources see this [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=11009 thread]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudDensity|type=float|range=[0.0-max]|default=0.5&lt;br /&gt;
|description=The amount of clouds in the sky}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudColor|type=rgb&lt;br /&gt;
|default={1.0, 1.0, 1.0}|description=The color of the clouds}}&lt;br /&gt;
&lt;br /&gt;
== grass ==&lt;br /&gt;
The shader for grass color at https://github.com/spring/spring/blob/266b51ad4c0301103e269a13f8e72f9c26511b4e/cont/base/springcontent/shaders/GLSL/GrassFragProg.glsl#L48 samples grassBladeTex, and multiplies it with grassShadingTex (which defaults to minimap)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth  = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle  = 1.57,&lt;br /&gt;
      bladeColor  = {0.59, 0.81, 0.57},&lt;br /&gt;
      maxStrawsPerTurf = 150,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=bladeWaveScale|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much the wind should effect grass blade movement, as well as the amplitude of the grass motion. Setting it to 0 will stop grass animation}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeWidth|type=float|default=0.32&lt;br /&gt;
|description=Specifies the width of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeHeight|type=float|default=4.0&lt;br /&gt;
|description=Specifies the length of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeAngle|type=float|default=1.57&lt;br /&gt;
|description=Specifies the curvature of each blade of grass. Unit is radians. 0 means completely straight blades of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxStrawsPerTurf|type=int|default=150&lt;br /&gt;
|description=The maximum number of grass blades per &#039;turf&#039;, A turf is approximately 32x32 elmos. }}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeColor|type=rgb|default={0.59, 0.81, 0.57}&lt;br /&gt;
|description=does nothing when `grassBladeTex` is set}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   lighting = {&lt;br /&gt;
      --// dynsun&lt;br /&gt;
      sunStartAngle = 0.0,&lt;br /&gt;
      sunOrbitTime  = 1440.0,&lt;br /&gt;
      sunDir        = {0.0, 1.0, 2.0, 1e9},&lt;br /&gt;
&lt;br /&gt;
      --// unit &amp;amp; ground lighting&lt;br /&gt;
      groundAmbientColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundDiffuseColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundSpecularColor = {0.1, 0.1, 0.1},&lt;br /&gt;
      groundShadowDensity = 0.8,&lt;br /&gt;
      unitAmbientColor    = {0.4, 0.4, 0.4},&lt;br /&gt;
      unitDiffuseColor    = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitSpecularColor   = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitShadowDensity   = 0.8,&lt;br /&gt;
      &lt;br /&gt;
      specularExponent    = 100.0,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=sunStartAngle|type=float|default=0.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunOrbitTime|type=float|default=1440.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunDir|type=float[3]|default={0.0, 1.0, 2.0}&lt;br /&gt;
|description=The direction of the sun, which is normalized by Spring. The Y-axis is up}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundAmbientColor|type=rgb|default={0.5, 0.5, 0.5}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of ground, grass, trees and other features. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundDiffuseColor|type=rgb|default={0.5, 05, 0.5}&lt;br /&gt;
|description=The color of ground where it is fully sun lit (added to GroundAmbientColor). The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundSpecularColor|type=rgb|default={0.1, 0.1, 0.1}&lt;br /&gt;
|description=and its effect when a specular map is present?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitAmbientColor|type=float|default={0.4, 0.4, 0.4}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of units and corpses}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitDiffuseColor|type=rgb|default={0.7, 0.7, 0.7}&lt;br /&gt;
|description=The color of units where they is fully sun lit (added to UnitAmbientColor). The color of units where they is fully sun lit (added to UnitAmbientColor)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitSpecularColor|type=rgb|default=unitDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularExponent|type=float|default=100}}&lt;br /&gt;
&lt;br /&gt;
== water ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   water = {&lt;br /&gt;
      damage =  0.0,&lt;br /&gt;
&lt;br /&gt;
      repeatX = 0.0,&lt;br /&gt;
      repeatY = 0.0,&lt;br /&gt;
&lt;br /&gt;
      absorb    = {0.0, 0.0, 0.0},&lt;br /&gt;
      baseColor = {0.0, 0.0, 0.0},&lt;br /&gt;
      minColor  = {0.0, 0.0, 0.0},&lt;br /&gt;
&lt;br /&gt;
      ambientFactor  = 1.0,&lt;br /&gt;
      diffuseFactor  = 1.0,&lt;br /&gt;
      specularFactor = 1.0,&lt;br /&gt;
      specularPower  = 20.0,&lt;br /&gt;
&lt;br /&gt;
      planeColor = {0.0, 0.4, 0.0},&lt;br /&gt;
&lt;br /&gt;
      surfaceColor  = {0.75, 0.8, 0.85},&lt;br /&gt;
      surfaceAlpha  = 0.55,&lt;br /&gt;
      diffuseColor  = {1.0, 1.0, 1.0},&lt;br /&gt;
      specularColor = {0.5, 0.5, 0.5},&lt;br /&gt;
&lt;br /&gt;
      fresnelMin   = 0.2,&lt;br /&gt;
      fresnelMax   = 0.8,&lt;br /&gt;
      fresnelPower = 4.0,&lt;br /&gt;
&lt;br /&gt;
      reflectionDistortion = 1.0,&lt;br /&gt;
&lt;br /&gt;
      blurBase      = 2.0,&lt;br /&gt;
      blurExponent = 1.5,&lt;br /&gt;
&lt;br /&gt;
      perlinStartFreq  =  8.0,&lt;br /&gt;
      perlinLacunarity = 3.0,&lt;br /&gt;
      perlinAmplitude  =  0.9,&lt;br /&gt;
      windSpeed = 1.0, --// does nothing yet&lt;br /&gt;
&lt;br /&gt;
      shoreWaves = true,&lt;br /&gt;
      forceRendering = false,&lt;br /&gt;
&lt;br /&gt;
      --// undefined == load them from resources.lua!&lt;br /&gt;
      --texture =       &amp;quot;&amp;quot;,&lt;br /&gt;
      --foamTexture =   &amp;quot;&amp;quot;,&lt;br /&gt;
      --normalTexture = &amp;quot;&amp;quot;,&lt;br /&gt;
      --caustics = {&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --},&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=damage|type=float|default=0.0&lt;br /&gt;
|description=Number of hit points per game frame (30 frames per second) a unit will be damaged if it is in the water. As of 95.0 by default damage is also applied to hovercraft units. i wonder if this can be made to give life...?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatX|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatY|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=absorb|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from WaterBaseColor, until WaterMinColor is reached. Example: WaterAbsorb is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless WaterMinColor is higher than 0 on the red channel}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=baseColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The smallest values the water will go down to due to WaterAbsorb}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=ambientFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularPower|type=float|default=20.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=planeColor|type=rgb|default={0.0, 0.4, 0.0}&lt;br /&gt;
|description=This sets the color of the groundplane under the water outside the map boundaries}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceColor|type=rgb|default={0.75, 0.8, 0.85}&lt;br /&gt;
|description=The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Has no effect on bump mapped water!}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceAlpha|type=float|default=0.55&lt;br /&gt;
|description= Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseColor|type=rgb|default=value&lt;br /&gt;
|description=This specifies the diffuse color of the water body. WARNING: use of this tag disables the effect of WaterAbsorb , in fact, this tag does nothing but disable WaterAbsorb. Avoid}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularColor|type=rgb|default=lighting.groundDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMin|type=float|default=0.2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMax|type=float|default=0.8}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelPower|type=float|default=4.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=reflectionDistortion|type=float|default=1.0&lt;br /&gt;
|description=How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurBase|type=float|default=2.0&lt;br /&gt;
|description=Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurExponent|type=float|default=1.5&lt;br /&gt;
|description=How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinStartFreq|type=float|default=8.0&lt;br /&gt;
|description=Wave sizes, smaller = big waves, sensible: [1,20] (influence the wave sizes)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinLacunarity|type=float|default=3.0&lt;br /&gt;
|description=Defines the size of the perlin waves, small values being big waves ([0.2,5] is sensible)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinAmplitude|type=float|default=0.9&lt;br /&gt;
|description=Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=windSpeed|type=float|default=1.0&lt;br /&gt;
|description=does nothing yet}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shoreWaves|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=forceRendering|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
will have to ask about those undefined tags&lt;br /&gt;
&lt;br /&gt;
== teams ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   teams = {&lt;br /&gt;
      [0] = {startPos = {x = 2033, z = 852}},&lt;br /&gt;
      [1] = {startPos = {x = 10134, z = 852}},&lt;br /&gt;
      [2] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      [3] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start positions&lt;br /&gt;
&lt;br /&gt;
== terrainTypes ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      [0] = {&lt;br /&gt;
         name = &amp;quot;Default&amp;quot;,&lt;br /&gt;
         hardness = 1.0,&lt;br /&gt;
         receiveTracks = true,&lt;br /&gt;
         moveSpeeds = {&lt;br /&gt;
            tank  = 1.0,&lt;br /&gt;
            kbot  = 1.0,&lt;br /&gt;
            hover = 1.0,&lt;br /&gt;
            ship  = 1.0,&lt;br /&gt;
         },&lt;br /&gt;
      },&lt;br /&gt;
      [1]  = { &lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start types where each element contains:&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string&lt;br /&gt;
|description=A label for the terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=hardness|type=float|range=[0.001-max]|default=1.0&lt;br /&gt;
|description=Used as a multiplier against the mapinfo.mapHardness value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as MapHardness, and 0.5 will make it half as hard}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=receiveTracks|type=bool|default=true&lt;br /&gt;
|description= Effects whether track decals will be placed on the ground from moving vehicles}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.tank|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.kbot|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for kbots when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.hover|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.ship|type=float|range=[0.0-max]|default=1&lt;br /&gt;
|description= Speed multiplier for ships when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
== custom ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   custom = {&lt;br /&gt;
      fog = {&lt;br /&gt;
         color    = {0.26, 0.30, 0.41},&lt;br /&gt;
         height   = &amp;quot;80%&amp;quot;, --// allows either absolue sizes or in percent of map&#039;s MaxHeight&lt;br /&gt;
         fogatten = 0.003,&lt;br /&gt;
      },&lt;br /&gt;
      precipitation = {&lt;br /&gt;
         density   = 30000,&lt;br /&gt;
         size      = 1.5,&lt;br /&gt;
         speed     = 50,&lt;br /&gt;
         windscale = 1.2,&lt;br /&gt;
         texture   = &#039;LuaGaia/effects/snowflake.png&#039;,&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13912</id>
		<title>Mapdev:mapinfo.lua</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13912"/>
		<updated>2019-11-11T13:03:37Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* grass */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mapinfo.lua Reference =&lt;br /&gt;
This file is the primary configuration file for maps, list many things including resources, attributes, ad properties.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which reads this file from the map is viewable here:&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapInfo.cpp}}&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Can be found in the [https://github.com/jk3064/Map-Blueprint/archive/master.zip map blueprint]&lt;br /&gt;
&lt;br /&gt;
= File Location =&lt;br /&gt;
relative to the root directory of the map&lt;br /&gt;
: ./mapinfo.lua&lt;br /&gt;
&lt;br /&gt;
= Formatting =&lt;br /&gt;
check [http://www.lua.org/docs.html Lua Documentation] for syntax etc.&lt;br /&gt;
&lt;br /&gt;
In this wiki page, variables are organised as such:&lt;br /&gt;
{{tag|name=VariableName|type=type|range=[valid range]|special=Required|default=value&lt;br /&gt;
|description=Description}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
= Sections =&lt;br /&gt;
== mapinfo ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   name        = &amp;quot;MyMap&amp;quot;,&lt;br /&gt;
   shortname   = &amp;quot;&amp;quot;,&lt;br /&gt;
   description = &amp;quot;&amp;quot;,&lt;br /&gt;
   author      = &amp;quot;&amp;quot;,&lt;br /&gt;
   version     = &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   --mutator   = &amp;quot;deployment&amp;quot;;&lt;br /&gt;
   mapfile     = &amp;quot;maps/mymap.smf&amp;quot;, -- // location of smf/sm3 file&lt;br /&gt;
   modtype     = 3, --// 1=primary, 0=hidden, 3=map&lt;br /&gt;
   depend      = {&amp;quot;Map Helper v1&amp;quot;},&lt;br /&gt;
   replace     = {},&lt;br /&gt;
&lt;br /&gt;
   --startpic   = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
   --StartMusic = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
&lt;br /&gt;
   maphardness     = 100,&lt;br /&gt;
   notDeformable   = false,&lt;br /&gt;
   gravity         = 130,&lt;br /&gt;
   tidalStrength   = 0,&lt;br /&gt;
   maxMetal        = 0.02,&lt;br /&gt;
   extractorRadius = 500.0,&lt;br /&gt;
   voidWater       = false,&lt;br /&gt;
   voidGround      = false,&lt;br /&gt;
   autoShowMetal   = true,&lt;br /&gt;
&lt;br /&gt;
   smf = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   splats = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   grass = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   lighting = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   water = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   teams = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   custom = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string|special=Required|default=none&lt;br /&gt;
|description=Name of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shortname|type=string|special=Required&lt;br /&gt;
|description=maps will not show in the map list without a valid shortname(not sure on its requirements)}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=description|type=string|default=&amp;lt;span style=&amp;quot;color:#cccccc;text-shadow: #111 2px 2px 2px;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=The description of the map that shows in the multiplayer battleroom}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=author|type=string|default=&amp;quot;&amp;quot;&lt;br /&gt;
|description=Author of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=version|type=string&lt;br /&gt;
|description=version, appended to name}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mutator|type=string}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mapfile|type=string&lt;br /&gt;
|description=location of smf/sm3 file}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=modtype|type=int|range=[013]|special=Required&lt;br /&gt;
|description=1=primary, 0=hidden, 3=map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=depend|special=Required}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=replace}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maphardness|type=float|default=100.0&lt;br /&gt;
|description=Defines how much a map will deform from impacts. Higher values mean less deformation, negative values will result in negative deformation (really funny looking)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=notDeformable|type=bool|default=false&lt;br /&gt;
|description=Setting it to 1 means that no explosions can deform the map.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gravity|type=float|range=[0.001-max]|default=130.0&lt;br /&gt;
|description=As you would expect, affects ballistics and how far units fly after an explosion. The force of gravity in units/sec^2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=tidalStrength|type=float|range=[0.0-max]|default=0.0&lt;br /&gt;
|description=The amount of energy which will be given by tidal generators.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxMetal|type=float|range=[0.0-max]|default=0.02&lt;br /&gt;
|description=How much metal a map square with the maximum metal value gives.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=extractorRadius|type=float|range=[0.0-max]|default=500&lt;br /&gt;
|description=The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidWater|type=bool|default=false&lt;br /&gt;
|description=Voidwater means there will be no water plane, and all parts of the map under water will be completely transparent, to show the skybox through the map. For example, check [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20684&amp;amp;hilit=apophis Apophis_v2]}}. Additionally for this to work, the &amp;lt;code&amp;gt;mapinfo.water.planeColor&amp;lt;/code&amp;gt; variable must not be specified in the mapinfo.lua file, delete or comment it out if it exists.&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidGround|type=bool|default=false&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 92.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=Allows portions of the ground to be invisible if the map was compiled with a diffuse image that has an alpha channel. The terrain still exists, its just transparent.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidAlphaMin|type=float|default=0.9&lt;br /&gt;
|description=Controls what alpha level the transparency trigger.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=autoShowMetal|type=bool|default=true&lt;br /&gt;
|description=Defines whether the metal map (F4 mode) is shown automatically when a mex is queued for placement.}}&lt;br /&gt;
&lt;br /&gt;
== smf ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
      minHeight = 1000,&lt;br /&gt;
      maxHeight = -300,&lt;br /&gt;
      minimapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName0 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName1 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName.. = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileNameN = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=minHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the minimum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the maximum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minimapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the minimap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=metalmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the metalmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=typemapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the typemap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the grassmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=smtFileName[N]|type=string}}&lt;br /&gt;
&lt;br /&gt;
== sound ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      preset = &amp;quot;default&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      reverb = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=preset|type=string|default=&amp;quot;default&amp;quot;&lt;br /&gt;
|description=Sets the _reverb_ preset (= echo parameters), passfilter (the direct sound) is unchanged. To get a list of all possible presets check: [https://github.com/spring/spring/blob/master/rts/System/Sound/OpenAL/EFXPresets.cpp EFXPresets.cpp]}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can change the preset at runtime via:&lt;br /&gt;
* /tset UseEFX [1&amp;amp;#124;0]&lt;br /&gt;
* /tset snd_eaxpreset preset_name   (may change to a real cmd in the future)&lt;br /&gt;
* /tset snd_filter %gainlf %gainhf  (may    &amp;quot;   &amp;quot;  &amp;quot;  &amp;quot;    &amp;quot;  &amp;quot;   &amp;quot;    &amp;quot;   )}}&lt;br /&gt;
&lt;br /&gt;
=== passfilter ===&lt;br /&gt;
Note, you likely want to set these tags due to the fact that they are _not_ set by `preset`!  So if you want to create a muffled sound you need to use them.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         gainlf = 1.0,&lt;br /&gt;
         gainhf = 1.0,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainlf|type=float}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainhf|type=float}}&lt;br /&gt;
&lt;br /&gt;
=== reverb ===&lt;br /&gt;
Normally you just want use the `preset` tag but you can use handtweak a preset if wanted with the following tags. To know their function &amp;amp; ranges check the official OpenAL1.1 SDK document.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      reverb = {         &lt;br /&gt;
         --density&lt;br /&gt;
         --diffusion&lt;br /&gt;
         --gain&lt;br /&gt;
         --gainhf&lt;br /&gt;
         --gainlf&lt;br /&gt;
         --decaytime&lt;br /&gt;
         --decayhflimit&lt;br /&gt;
         --decayhfratio&lt;br /&gt;
         --decaylfratio&lt;br /&gt;
         --reflectionsgain&lt;br /&gt;
         --reflectionsdelay&lt;br /&gt;
         --reflectionspan&lt;br /&gt;
         --latereverbgain&lt;br /&gt;
         --latereverbdelay&lt;br /&gt;
         --latereverbpan&lt;br /&gt;
         --echotime&lt;br /&gt;
         --echodepth&lt;br /&gt;
         --modtime&lt;br /&gt;
         --moddepth&lt;br /&gt;
         --airabsorptiongainhf&lt;br /&gt;
         --hfreference&lt;br /&gt;
         --lfreference&lt;br /&gt;
         --roomrollofffactor&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== resources ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      specularTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDetailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDistrTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      skyReflectModTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailNormalTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      lightEmissionTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      parallaxHeightTex = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassBladeTex|type=string&lt;br /&gt;
|description=Specifies the texture to be used on the grass blades themselves. Green-yellow gradients make for some interesting effects. Defaults to the internally generated blade texture. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassShadingTex|type=string&lt;br /&gt;
|description=Specifies the color variation of the grass across the map. This defaults to the minimap, so the grass color can match the map color. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailTex|type=string&lt;br /&gt;
|description=Specifies the detail texture for the map. More Information: [[Mapdev:detail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:specular]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDetailTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDistrTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyReflectModTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:skyreflectmod]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailNormalTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:normal]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=lightEmissionTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:lightemission]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=parallaxHeightTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:parallax]]}}&lt;br /&gt;
&lt;br /&gt;
== splats ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults  = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=texScales|type=float[4]&lt;br /&gt;
|default={0.2, 0.2, 0.2, 0.2}|description=Scale value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=texMults|type=float[4]&lt;br /&gt;
|default={1.0, 1.0, 1.0, 1.0}|description=Value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
== atmosphere ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      minWind      = 5.0,&lt;br /&gt;
      maxWind      = 25.0,&lt;br /&gt;
&lt;br /&gt;
      fogStart     = 0.1,&lt;br /&gt;
      fogEnd       = 1.0,&lt;br /&gt;
      fogColor     = {0.7, 0.7, 0.8},&lt;br /&gt;
&lt;br /&gt;
      sunColor     = {1.0, 1.0, 1.0},&lt;br /&gt;
      skyColor     = {0.1, 0.15, 0.7},&lt;br /&gt;
      skyDir       = {0.0, 0.0, -1.0},&lt;br /&gt;
      skyBox       = &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      cloudDensity = 0.5,&lt;br /&gt;
      cloudColor   = {1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minWind|type=float|range=[0.0-max]|default=5.0|&lt;br /&gt;
description=The minimum amount of energy the wind on the map will give. is clamped to maxwind}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxWind|type=float|range=[0.0-max]|default=25.0&lt;br /&gt;
|description=The maximum amount of energy the wind on the map will give}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogStart|type=float|default=0.1&lt;br /&gt;
|description=The distance from the camera at which the fog will start. &amp;lt;code&amp;gt;viewRange * fogStart&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogEnd|type=float|default=1.0&lt;br /&gt;
|description=The distance from the camera that fog is opaque. &amp;lt;code&amp;gt;viewRange * fogEnd&amp;lt;/code&amp;gt; }}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogColor|type=rgb|default={0.7, 0.7, 0.8}&lt;br /&gt;
|description=The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. However, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunColor|type=rgb|default={1.0, 1.0, 1.0}&lt;br /&gt;
|description=The color of the sun in the sky. The values are in the order Red, Green, Blue. This will also effect the size of the star. As the values increase (including over 1.0), the disc will get bigger; the inverse is also true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyColor|type=rgb|default={0.1, 0.15, 0.7}&lt;br /&gt;
|description=The color of the sky itself. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyDir|type=float[3]|default={0.0, 0.0, -1.0}&lt;br /&gt;
|description=Is normalised vector}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyBox|type=string&lt;br /&gt;
|description=Specify a .dds skybox (also called skycube) for examples and resources see this [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=11009 thread]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudDensity|type=float|range=[0.0-max]|default=0.5&lt;br /&gt;
|description=The amount of clouds in the sky}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudColor|type=rgb&lt;br /&gt;
|default={1.0, 1.0, 1.0}|description=The color of the clouds}}&lt;br /&gt;
&lt;br /&gt;
== grass ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth  = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle  = 1.57,&lt;br /&gt;
      bladeColor  = {0.59, 0.81, 0.57},&lt;br /&gt;
      maxStrawsPerTurf = 150,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=bladeWaveScale|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much the wind should effect grass blade movement, as well as the amplitude of the grass motion. Setting it to 0 will stop grass animation}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeWidth|type=float|default=0.32&lt;br /&gt;
|description=Specifies the width of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeHeight|type=float|default=4.0&lt;br /&gt;
|description=Specifies the length of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeAngle|type=float|default=1.57&lt;br /&gt;
|description=Specifies the curvature of each blade of grass. Unit is radians. 0 means completely straight blades of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxStrawsPerTurf|type=int|default=150&lt;br /&gt;
|description=The maximum number of grass blades per &#039;turf&#039;, A turf is approximately 32x32 elmos. }}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeColor|type=rgb|default={0.59, 0.81, 0.57}&lt;br /&gt;
|description=does nothing when `grassBladeTex` is set}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   lighting = {&lt;br /&gt;
      --// dynsun&lt;br /&gt;
      sunStartAngle = 0.0,&lt;br /&gt;
      sunOrbitTime  = 1440.0,&lt;br /&gt;
      sunDir        = {0.0, 1.0, 2.0, 1e9},&lt;br /&gt;
&lt;br /&gt;
      --// unit &amp;amp; ground lighting&lt;br /&gt;
      groundAmbientColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundDiffuseColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundSpecularColor = {0.1, 0.1, 0.1},&lt;br /&gt;
      groundShadowDensity = 0.8,&lt;br /&gt;
      unitAmbientColor    = {0.4, 0.4, 0.4},&lt;br /&gt;
      unitDiffuseColor    = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitSpecularColor   = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitShadowDensity   = 0.8,&lt;br /&gt;
      &lt;br /&gt;
      specularExponent    = 100.0,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=sunStartAngle|type=float|default=0.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunOrbitTime|type=float|default=1440.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunDir|type=float[3]|default={0.0, 1.0, 2.0}&lt;br /&gt;
|description=The direction of the sun, which is normalized by Spring. The Y-axis is up}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundAmbientColor|type=rgb|default={0.5, 0.5, 0.5}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of ground, grass, trees and other features. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundDiffuseColor|type=rgb|default={0.5, 05, 0.5}&lt;br /&gt;
|description=The color of ground where it is fully sun lit (added to GroundAmbientColor). The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundSpecularColor|type=rgb|default={0.1, 0.1, 0.1}&lt;br /&gt;
|description=and its effect when a specular map is present?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitAmbientColor|type=float|default={0.4, 0.4, 0.4}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of units and corpses}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitDiffuseColor|type=rgb|default={0.7, 0.7, 0.7}&lt;br /&gt;
|description=The color of units where they is fully sun lit (added to UnitAmbientColor). The color of units where they is fully sun lit (added to UnitAmbientColor)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitSpecularColor|type=rgb|default=unitDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularExponent|type=float|default=100}}&lt;br /&gt;
&lt;br /&gt;
== water ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   water = {&lt;br /&gt;
      damage =  0.0,&lt;br /&gt;
&lt;br /&gt;
      repeatX = 0.0,&lt;br /&gt;
      repeatY = 0.0,&lt;br /&gt;
&lt;br /&gt;
      absorb    = {0.0, 0.0, 0.0},&lt;br /&gt;
      baseColor = {0.0, 0.0, 0.0},&lt;br /&gt;
      minColor  = {0.0, 0.0, 0.0},&lt;br /&gt;
&lt;br /&gt;
      ambientFactor  = 1.0,&lt;br /&gt;
      diffuseFactor  = 1.0,&lt;br /&gt;
      specularFactor = 1.0,&lt;br /&gt;
      specularPower  = 20.0,&lt;br /&gt;
&lt;br /&gt;
      planeColor = {0.0, 0.4, 0.0},&lt;br /&gt;
&lt;br /&gt;
      surfaceColor  = {0.75, 0.8, 0.85},&lt;br /&gt;
      surfaceAlpha  = 0.55,&lt;br /&gt;
      diffuseColor  = {1.0, 1.0, 1.0},&lt;br /&gt;
      specularColor = {0.5, 0.5, 0.5},&lt;br /&gt;
&lt;br /&gt;
      fresnelMin   = 0.2,&lt;br /&gt;
      fresnelMax   = 0.8,&lt;br /&gt;
      fresnelPower = 4.0,&lt;br /&gt;
&lt;br /&gt;
      reflectionDistortion = 1.0,&lt;br /&gt;
&lt;br /&gt;
      blurBase      = 2.0,&lt;br /&gt;
      blurExponent = 1.5,&lt;br /&gt;
&lt;br /&gt;
      perlinStartFreq  =  8.0,&lt;br /&gt;
      perlinLacunarity = 3.0,&lt;br /&gt;
      perlinAmplitude  =  0.9,&lt;br /&gt;
      windSpeed = 1.0, --// does nothing yet&lt;br /&gt;
&lt;br /&gt;
      shoreWaves = true,&lt;br /&gt;
      forceRendering = false,&lt;br /&gt;
&lt;br /&gt;
      --// undefined == load them from resources.lua!&lt;br /&gt;
      --texture =       &amp;quot;&amp;quot;,&lt;br /&gt;
      --foamTexture =   &amp;quot;&amp;quot;,&lt;br /&gt;
      --normalTexture = &amp;quot;&amp;quot;,&lt;br /&gt;
      --caustics = {&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --},&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=damage|type=float|default=0.0&lt;br /&gt;
|description=Number of hit points per game frame (30 frames per second) a unit will be damaged if it is in the water. As of 95.0 by default damage is also applied to hovercraft units. i wonder if this can be made to give life...?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatX|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatY|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=absorb|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from WaterBaseColor, until WaterMinColor is reached. Example: WaterAbsorb is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless WaterMinColor is higher than 0 on the red channel}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=baseColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The smallest values the water will go down to due to WaterAbsorb}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=ambientFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularPower|type=float|default=20.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=planeColor|type=rgb|default={0.0, 0.4, 0.0}&lt;br /&gt;
|description=This sets the color of the groundplane under the water outside the map boundaries}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceColor|type=rgb|default={0.75, 0.8, 0.85}&lt;br /&gt;
|description=The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Has no effect on bump mapped water!}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceAlpha|type=float|default=0.55&lt;br /&gt;
|description= Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseColor|type=rgb|default=value&lt;br /&gt;
|description=This specifies the diffuse color of the water body. WARNING: use of this tag disables the effect of WaterAbsorb , in fact, this tag does nothing but disable WaterAbsorb. Avoid}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularColor|type=rgb|default=lighting.groundDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMin|type=float|default=0.2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMax|type=float|default=0.8}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelPower|type=float|default=4.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=reflectionDistortion|type=float|default=1.0&lt;br /&gt;
|description=How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurBase|type=float|default=2.0&lt;br /&gt;
|description=Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurExponent|type=float|default=1.5&lt;br /&gt;
|description=How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinStartFreq|type=float|default=8.0&lt;br /&gt;
|description=Wave sizes, smaller = big waves, sensible: [1,20] (influence the wave sizes)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinLacunarity|type=float|default=3.0&lt;br /&gt;
|description=Defines the size of the perlin waves, small values being big waves ([0.2,5] is sensible)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinAmplitude|type=float|default=0.9&lt;br /&gt;
|description=Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=windSpeed|type=float|default=1.0&lt;br /&gt;
|description=does nothing yet}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shoreWaves|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=forceRendering|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
will have to ask about those undefined tags&lt;br /&gt;
&lt;br /&gt;
== teams ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   teams = {&lt;br /&gt;
      [0] = {startPos = {x = 2033, z = 852}},&lt;br /&gt;
      [1] = {startPos = {x = 10134, z = 852}},&lt;br /&gt;
      [2] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      [3] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start positions&lt;br /&gt;
&lt;br /&gt;
== terrainTypes ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      [0] = {&lt;br /&gt;
         name = &amp;quot;Default&amp;quot;,&lt;br /&gt;
         hardness = 1.0,&lt;br /&gt;
         receiveTracks = true,&lt;br /&gt;
         moveSpeeds = {&lt;br /&gt;
            tank  = 1.0,&lt;br /&gt;
            kbot  = 1.0,&lt;br /&gt;
            hover = 1.0,&lt;br /&gt;
            ship  = 1.0,&lt;br /&gt;
         },&lt;br /&gt;
      },&lt;br /&gt;
      [1]  = { &lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start types where each element contains:&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string&lt;br /&gt;
|description=A label for the terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=hardness|type=float|range=[0.001-max]|default=1.0&lt;br /&gt;
|description=Used as a multiplier against the mapinfo.mapHardness value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as MapHardness, and 0.5 will make it half as hard}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=receiveTracks|type=bool|default=true&lt;br /&gt;
|description= Effects whether track decals will be placed on the ground from moving vehicles}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.tank|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.kbot|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for kbots when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.hover|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.ship|type=float|range=[0.0-max]|default=1&lt;br /&gt;
|description= Speed multiplier for ships when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
== custom ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   custom = {&lt;br /&gt;
      fog = {&lt;br /&gt;
         color    = {0.26, 0.30, 0.41},&lt;br /&gt;
         height   = &amp;quot;80%&amp;quot;, --// allows either absolue sizes or in percent of map&#039;s MaxHeight&lt;br /&gt;
         fogatten = 0.003,&lt;br /&gt;
      },&lt;br /&gt;
      precipitation = {&lt;br /&gt;
         density   = 30000,&lt;br /&gt;
         size      = 1.5,&lt;br /&gt;
         speed     = 50,&lt;br /&gt;
         windscale = 1.2,&lt;br /&gt;
         texture   = &#039;LuaGaia/effects/snowflake.png&#039;,&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13911</id>
		<title>Mapdev:mapinfo.lua</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:mapinfo.lua&amp;diff=13911"/>
		<updated>2019-11-11T13:00:24Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* mapinfo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= mapinfo.lua Reference =&lt;br /&gt;
This file is the primary configuration file for maps, list many things including resources, attributes, ad properties.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The engine source code which reads this file from the map is viewable here:&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapInfo.cpp}}&lt;br /&gt;
* {{sourcelink|file=rts/Map/MapParser.cpp}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
Can be found in the [https://github.com/jk3064/Map-Blueprint/archive/master.zip map blueprint]&lt;br /&gt;
&lt;br /&gt;
= File Location =&lt;br /&gt;
relative to the root directory of the map&lt;br /&gt;
: ./mapinfo.lua&lt;br /&gt;
&lt;br /&gt;
= Formatting =&lt;br /&gt;
check [http://www.lua.org/docs.html Lua Documentation] for syntax etc.&lt;br /&gt;
&lt;br /&gt;
In this wiki page, variables are organised as such:&lt;br /&gt;
{{tag|name=VariableName|type=type|range=[valid range]|special=Required|default=value&lt;br /&gt;
|description=Description}}&lt;br /&gt;
&lt;br /&gt;
== Data Types ==&lt;br /&gt;
{{DataTypes}}&lt;br /&gt;
&lt;br /&gt;
= Sections =&lt;br /&gt;
== mapinfo ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   name        = &amp;quot;MyMap&amp;quot;,&lt;br /&gt;
   shortname   = &amp;quot;&amp;quot;,&lt;br /&gt;
   description = &amp;quot;&amp;quot;,&lt;br /&gt;
   author      = &amp;quot;&amp;quot;,&lt;br /&gt;
   version     = &amp;quot;1.0&amp;quot;,&lt;br /&gt;
   --mutator   = &amp;quot;deployment&amp;quot;;&lt;br /&gt;
   mapfile     = &amp;quot;maps/mymap.smf&amp;quot;, -- // location of smf/sm3 file&lt;br /&gt;
   modtype     = 3, --// 1=primary, 0=hidden, 3=map&lt;br /&gt;
   depend      = {&amp;quot;Map Helper v1&amp;quot;},&lt;br /&gt;
   replace     = {},&lt;br /&gt;
&lt;br /&gt;
   --startpic   = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
   --StartMusic = &amp;quot;&amp;quot;, --// deprecated&lt;br /&gt;
&lt;br /&gt;
   maphardness     = 100,&lt;br /&gt;
   notDeformable   = false,&lt;br /&gt;
   gravity         = 130,&lt;br /&gt;
   tidalStrength   = 0,&lt;br /&gt;
   maxMetal        = 0.02,&lt;br /&gt;
   extractorRadius = 500.0,&lt;br /&gt;
   voidWater       = false,&lt;br /&gt;
   voidGround      = false,&lt;br /&gt;
   autoShowMetal   = true,&lt;br /&gt;
&lt;br /&gt;
   smf = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   splats = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   grass = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   lighting = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   water = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   teams = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
&lt;br /&gt;
   custom = {&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string|special=Required|default=none&lt;br /&gt;
|description=Name of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shortname|type=string|special=Required&lt;br /&gt;
|description=maps will not show in the map list without a valid shortname(not sure on its requirements)}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=description|type=string|default=&amp;lt;span style=&amp;quot;color:#cccccc;text-shadow: #111 2px 2px 2px;&amp;quot;&amp;gt;name&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=The description of the map that shows in the multiplayer battleroom}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=author|type=string|default=&amp;quot;&amp;quot;&lt;br /&gt;
|description=Author of the map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=version|type=string&lt;br /&gt;
|description=version, appended to name}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mutator|type=string}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=mapfile|type=string&lt;br /&gt;
|description=location of smf/sm3 file}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=modtype|type=int|range=[013]|special=Required&lt;br /&gt;
|description=1=primary, 0=hidden, 3=map}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=depend|special=Required}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=replace}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maphardness|type=float|default=100.0&lt;br /&gt;
|description=Defines how much a map will deform from impacts. Higher values mean less deformation, negative values will result in negative deformation (really funny looking)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=notDeformable|type=bool|default=false&lt;br /&gt;
|description=Setting it to 1 means that no explosions can deform the map.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gravity|type=float|range=[0.001-max]|default=130.0&lt;br /&gt;
|description=As you would expect, affects ballistics and how far units fly after an explosion. The force of gravity in units/sec^2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=tidalStrength|type=float|range=[0.0-max]|default=0.0&lt;br /&gt;
|description=The amount of energy which will be given by tidal generators.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxMetal|type=float|range=[0.0-max]|default=0.02&lt;br /&gt;
|description=How much metal a map square with the maximum metal value gives.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=extractorRadius|type=float|range=[0.0-max]|default=500&lt;br /&gt;
|description=The radius of effect that a single extractor will extract from. If two radii intersect, both extractors will suffer from reduced output.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidWater|type=bool|default=false&lt;br /&gt;
|description=Voidwater means there will be no water plane, and all parts of the map under water will be completely transparent, to show the skybox through the map. For example, check [http://springrts.com/phpbb/viewtopic.php?f=13&amp;amp;t=20684&amp;amp;hilit=apophis Apophis_v2]}}. Additionally for this to work, the &amp;lt;code&amp;gt;mapinfo.water.planeColor&amp;lt;/code&amp;gt; variable must not be specified in the mapinfo.lua file, delete or comment it out if it exists.&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidGround|type=bool|default=false&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 92.0&amp;lt;/span&amp;gt;&lt;br /&gt;
|description=Allows portions of the ground to be invisible if the map was compiled with a diffuse image that has an alpha channel. The terrain still exists, its just transparent.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=voidAlphaMin|type=float|default=0.9&lt;br /&gt;
|description=Controls what alpha level the transparency trigger.}}. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{tag|name=autoShowMetal|type=bool|default=true&lt;br /&gt;
|description=Defines whether the metal map (F4 mode) is shown automatically when a mex is queued for placement.}}&lt;br /&gt;
&lt;br /&gt;
== smf ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   smf = {&lt;br /&gt;
      minHeight = 1000,&lt;br /&gt;
      maxHeight = -300,&lt;br /&gt;
      minimapTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName0 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName1 = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileName.. = &amp;quot;&amp;quot;,&lt;br /&gt;
      smtFileNameN = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=minHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the minimum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxHeight|type=float|default=0.0&lt;br /&gt;
|description=Overrides the maximum map height specified while compiling. Compile time height used if undefined}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minimapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the minimap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=metalmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the metalmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=typemapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the typemap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassmapTex|type=string&lt;br /&gt;
|special=&amp;lt;span class=&amp;quot;warning&amp;quot;&amp;gt;New in 99.0&amp;lt;/span&amp;gt;&lt;br /&gt;
| description=Overrides the grassmap with an image of your choice, smf used if undefined or invalid}} &lt;br /&gt;
&lt;br /&gt;
{{tag|name=smtFileName[N]|type=string}}&lt;br /&gt;
&lt;br /&gt;
== sound ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      preset = &amp;quot;default&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
      reverb = {&lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=preset|type=string|default=&amp;quot;default&amp;quot;&lt;br /&gt;
|description=Sets the _reverb_ preset (= echo parameters), passfilter (the direct sound) is unchanged. To get a list of all possible presets check: [https://github.com/spring/spring/blob/master/rts/System/Sound/OpenAL/EFXPresets.cpp EFXPresets.cpp]}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can change the preset at runtime via:&lt;br /&gt;
* /tset UseEFX [1&amp;amp;#124;0]&lt;br /&gt;
* /tset snd_eaxpreset preset_name   (may change to a real cmd in the future)&lt;br /&gt;
* /tset snd_filter %gainlf %gainhf  (may    &amp;quot;   &amp;quot;  &amp;quot;  &amp;quot;    &amp;quot;  &amp;quot;   &amp;quot;    &amp;quot;   )}}&lt;br /&gt;
&lt;br /&gt;
=== passfilter ===&lt;br /&gt;
Note, you likely want to set these tags due to the fact that they are _not_ set by `preset`!  So if you want to create a muffled sound you need to use them.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      passfilter = {&lt;br /&gt;
         gainlf = 1.0,&lt;br /&gt;
         gainhf = 1.0,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainlf|type=float}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=gainhf|type=float}}&lt;br /&gt;
&lt;br /&gt;
=== reverb ===&lt;br /&gt;
Normally you just want use the `preset` tag but you can use handtweak a preset if wanted with the following tags. To know their function &amp;amp; ranges check the official OpenAL1.1 SDK document.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   sound = {&lt;br /&gt;
      ...&lt;br /&gt;
      reverb = {         &lt;br /&gt;
         --density&lt;br /&gt;
         --diffusion&lt;br /&gt;
         --gain&lt;br /&gt;
         --gainhf&lt;br /&gt;
         --gainlf&lt;br /&gt;
         --decaytime&lt;br /&gt;
         --decayhflimit&lt;br /&gt;
         --decayhfratio&lt;br /&gt;
         --decaylfratio&lt;br /&gt;
         --reflectionsgain&lt;br /&gt;
         --reflectionsdelay&lt;br /&gt;
         --reflectionspan&lt;br /&gt;
         --latereverbgain&lt;br /&gt;
         --latereverbdelay&lt;br /&gt;
         --latereverbpan&lt;br /&gt;
         --echotime&lt;br /&gt;
         --echodepth&lt;br /&gt;
         --modtime&lt;br /&gt;
         --moddepth&lt;br /&gt;
         --airabsorptiongainhf&lt;br /&gt;
         --hfreference&lt;br /&gt;
         --lfreference&lt;br /&gt;
         --roomrollofffactor&lt;br /&gt;
      },&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== resources ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      grassBladeTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      grassShadingTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      specularTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDetailTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      splatDistrTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      skyReflectModTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      detailNormalTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      lightEmissionTex = &amp;quot;&amp;quot;,&lt;br /&gt;
      parallaxHeightTex = &amp;quot;&amp;quot;,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassBladeTex|type=string&lt;br /&gt;
|description=Specifies the texture to be used on the grass blades themselves. Green-yellow gradients make for some interesting effects. Defaults to the internally generated blade texture. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=grassShadingTex|type=string&lt;br /&gt;
|description=Specifies the color variation of the grass across the map. This defaults to the minimap, so the grass color can match the map color. More Information: [[Mapdev:grass]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailTex|type=string&lt;br /&gt;
|description=Specifies the detail texture for the map. More Information: [[Mapdev:detail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:specular]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDetailTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=splatDistrTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:splatdetail]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyReflectModTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:skyreflectmod]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=detailNormalTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:normal]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=lightEmissionTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:lightemission]]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=parallaxHeightTex|type=string&lt;br /&gt;
|description=More Information: [[Mapdev:parallax]]}}&lt;br /&gt;
&lt;br /&gt;
== splats ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults  = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=texScales|type=float[4]&lt;br /&gt;
|default={0.2, 0.2, 0.2, 0.2}|description=Scale value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=texMults|type=float[4]&lt;br /&gt;
|default={1.0, 1.0, 1.0, 1.0}|description=Value for the splat texture in the RGBA channels respectively.}}&lt;br /&gt;
&lt;br /&gt;
== atmosphere ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   atmosphere = {&lt;br /&gt;
      minWind      = 5.0,&lt;br /&gt;
      maxWind      = 25.0,&lt;br /&gt;
&lt;br /&gt;
      fogStart     = 0.1,&lt;br /&gt;
      fogEnd       = 1.0,&lt;br /&gt;
      fogColor     = {0.7, 0.7, 0.8},&lt;br /&gt;
&lt;br /&gt;
      sunColor     = {1.0, 1.0, 1.0},&lt;br /&gt;
      skyColor     = {0.1, 0.15, 0.7},&lt;br /&gt;
      skyDir       = {0.0, 0.0, -1.0},&lt;br /&gt;
      skyBox       = &amp;quot;&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
      cloudDensity = 0.5,&lt;br /&gt;
      cloudColor   = {1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minWind|type=float|range=[0.0-max]|default=5.0|&lt;br /&gt;
description=The minimum amount of energy the wind on the map will give. is clamped to maxwind}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=maxWind|type=float|range=[0.0-max]|default=25.0&lt;br /&gt;
|description=The maximum amount of energy the wind on the map will give}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogStart|type=float|default=0.1&lt;br /&gt;
|description=The distance from the camera at which the fog will start. &amp;lt;code&amp;gt;viewRange * fogStart&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogEnd|type=float|default=1.0&lt;br /&gt;
|description=The distance from the camera that fog is opaque. &amp;lt;code&amp;gt;viewRange * fogEnd&amp;lt;/code&amp;gt; }}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fogColor|type=rgb|default={0.7, 0.7, 0.8}&lt;br /&gt;
|description=The color of the fog and the infinite plane below the world. The values are in the order Red, Green, Blue. However, giving values higher than 1.0 will give brighter fog and less than 0.0 will give darker}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunColor|type=rgb|default={1.0, 1.0, 1.0}&lt;br /&gt;
|description=The color of the sun in the sky. The values are in the order Red, Green, Blue. This will also effect the size of the star. As the values increase (including over 1.0), the disc will get bigger; the inverse is also true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyColor|type=rgb|default={0.1, 0.15, 0.7}&lt;br /&gt;
|description=The color of the sky itself. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyDir|type=float[3]|default={0.0, 0.0, -1.0}&lt;br /&gt;
|description=Is normalised vector}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=skyBox|type=string&lt;br /&gt;
|description=Specify a .dds skybox (also called skycube) for examples and resources see this [http://springrts.com/phpbb/viewtopic.php?f=56&amp;amp;t=11009 thread]}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudDensity|type=float|range=[0.0-max]|default=0.5&lt;br /&gt;
|description=The amount of clouds in the sky}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=cloudColor|type=rgb&lt;br /&gt;
|default={1.0, 1.0, 1.0}|description=The color of the clouds}}&lt;br /&gt;
&lt;br /&gt;
== grass ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   grass = {&lt;br /&gt;
      bladeWaveScale = 1.0,&lt;br /&gt;
      bladeWidth  = 0.32,&lt;br /&gt;
      bladeHeight = 4.0,&lt;br /&gt;
      bladeAngle  = 1.57,&lt;br /&gt;
      bladeColor  = {0.59, 0.81, 0.57},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=bladeWaveScale|type=float|default=1.0&lt;br /&gt;
|description=Specifies how much the wind should effect grass blade movement, as well as the amplitude of the grass motion. Setting it to 0 will stop grass animation}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeWidth|type=float|default=0.32&lt;br /&gt;
|description=Specifies the width of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeHeight|type=float|default=4.0&lt;br /&gt;
|description=Specifies the length of each blade of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeAngle|type=float|default=1.57&lt;br /&gt;
|description=Specifies the curvature of each blade of grass. Unit is radians. 0 means completely straight blades of grass}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=bladeColor|type=rgb|default={0.59, 0.81, 0.57}&lt;br /&gt;
|description=does nothing when `grassBladeTex` is set}}&lt;br /&gt;
&lt;br /&gt;
== Lighting ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   lighting = {&lt;br /&gt;
      --// dynsun&lt;br /&gt;
      sunStartAngle = 0.0,&lt;br /&gt;
      sunOrbitTime  = 1440.0,&lt;br /&gt;
      sunDir        = {0.0, 1.0, 2.0, 1e9},&lt;br /&gt;
&lt;br /&gt;
      --// unit &amp;amp; ground lighting&lt;br /&gt;
      groundAmbientColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundDiffuseColor  = {0.5, 0.5, 0.5},&lt;br /&gt;
      groundSpecularColor = {0.1, 0.1, 0.1},&lt;br /&gt;
      groundShadowDensity = 0.8,&lt;br /&gt;
      unitAmbientColor    = {0.4, 0.4, 0.4},&lt;br /&gt;
      unitDiffuseColor    = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitSpecularColor   = {0.7, 0.7, 0.7},&lt;br /&gt;
      unitShadowDensity   = 0.8,&lt;br /&gt;
      &lt;br /&gt;
      specularExponent    = 100.0,&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=sunStartAngle|type=float|default=0.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunOrbitTime|type=float|default=1440.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=sunDir|type=float[3]|default={0.0, 1.0, 2.0}&lt;br /&gt;
|description=The direction of the sun, which is normalized by Spring. The Y-axis is up}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundAmbientColor|type=rgb|default={0.5, 0.5, 0.5}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of ground, grass, trees and other features. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundDiffuseColor|type=rgb|default={0.5, 05, 0.5}&lt;br /&gt;
|description=The color of ground where it is fully sun lit (added to GroundAmbientColor). The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundSpecularColor|type=rgb|default={0.1, 0.1, 0.1}&lt;br /&gt;
|description=and its effect when a specular map is present?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=groundShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go.}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitAmbientColor|type=float|default={0.4, 0.4, 0.4}&lt;br /&gt;
|description=The ambient (non-sun-lit) color of units and corpses}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitDiffuseColor|type=rgb|default={0.7, 0.7, 0.7}&lt;br /&gt;
|description=The color of units where they is fully sun lit (added to UnitAmbientColor). The color of units where they is fully sun lit (added to UnitAmbientColor)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitSpecularColor|type=rgb|default=unitDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=unitShadowDensity|type=float|default=0.8&lt;br /&gt;
|description=How far from the non shadowed to the ambient color stuff in shadow will go}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularExponent|type=float|default=100}}&lt;br /&gt;
&lt;br /&gt;
== water ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   water = {&lt;br /&gt;
      damage =  0.0,&lt;br /&gt;
&lt;br /&gt;
      repeatX = 0.0,&lt;br /&gt;
      repeatY = 0.0,&lt;br /&gt;
&lt;br /&gt;
      absorb    = {0.0, 0.0, 0.0},&lt;br /&gt;
      baseColor = {0.0, 0.0, 0.0},&lt;br /&gt;
      minColor  = {0.0, 0.0, 0.0},&lt;br /&gt;
&lt;br /&gt;
      ambientFactor  = 1.0,&lt;br /&gt;
      diffuseFactor  = 1.0,&lt;br /&gt;
      specularFactor = 1.0,&lt;br /&gt;
      specularPower  = 20.0,&lt;br /&gt;
&lt;br /&gt;
      planeColor = {0.0, 0.4, 0.0},&lt;br /&gt;
&lt;br /&gt;
      surfaceColor  = {0.75, 0.8, 0.85},&lt;br /&gt;
      surfaceAlpha  = 0.55,&lt;br /&gt;
      diffuseColor  = {1.0, 1.0, 1.0},&lt;br /&gt;
      specularColor = {0.5, 0.5, 0.5},&lt;br /&gt;
&lt;br /&gt;
      fresnelMin   = 0.2,&lt;br /&gt;
      fresnelMax   = 0.8,&lt;br /&gt;
      fresnelPower = 4.0,&lt;br /&gt;
&lt;br /&gt;
      reflectionDistortion = 1.0,&lt;br /&gt;
&lt;br /&gt;
      blurBase      = 2.0,&lt;br /&gt;
      blurExponent = 1.5,&lt;br /&gt;
&lt;br /&gt;
      perlinStartFreq  =  8.0,&lt;br /&gt;
      perlinLacunarity = 3.0,&lt;br /&gt;
      perlinAmplitude  =  0.9,&lt;br /&gt;
      windSpeed = 1.0, --// does nothing yet&lt;br /&gt;
&lt;br /&gt;
      shoreWaves = true,&lt;br /&gt;
      forceRendering = false,&lt;br /&gt;
&lt;br /&gt;
      --// undefined == load them from resources.lua!&lt;br /&gt;
      --texture =       &amp;quot;&amp;quot;,&lt;br /&gt;
      --foamTexture =   &amp;quot;&amp;quot;,&lt;br /&gt;
      --normalTexture = &amp;quot;&amp;quot;,&lt;br /&gt;
      --caustics = {&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --   &amp;quot;&amp;quot;,&lt;br /&gt;
      --},&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{tag|name=damage|type=float|default=0.0&lt;br /&gt;
|description=Number of hit points per game frame (30 frames per second) a unit will be damaged if it is in the water. As of 95.0 by default damage is also applied to hovercraft units. i wonder if this can be made to give life...?}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatX|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=repeatY|type=float|default=0.0&lt;br /&gt;
|description=effects the filing frequency of the watertexture}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=absorb|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=How fast different colors (RGB in order) are absorbed by the water. Can be used to make the water look murky at deeper sections and so on. How this works: the waterabsorb value for the color channel gets multiplied by the depth of the water at a point, and this product gets subtracted from WaterBaseColor, until WaterMinColor is reached. Example: WaterAbsorb is 0.01, for the red channel, and we want to know how much red will be left in the water at a Spring elevation of -100, since 0.01*100= 1 , at this depth, there will be no more red component in the water, unless WaterMinColor is higher than 0 on the red channel}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=baseColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The color of the water just beneath the surface plane. This is the starting color from which deeper waters will absorb more color. The values are in the order Red, Green, Blue}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=minColor|type=rgb|default={0.0, 0.0, 0.0}&lt;br /&gt;
|description=The smallest values the water will go down to due to WaterAbsorb}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=ambientFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularFactor|type=float|default=1.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularPower|type=float|default=20.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=planeColor|type=rgb|default={0.0, 0.4, 0.0}&lt;br /&gt;
|description=This sets the color of the groundplane under the water outside the map boundaries}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceColor|type=rgb|default={0.75, 0.8, 0.85}&lt;br /&gt;
|description=The color of the water surface. Mostly affects the colors of the reflections off the top of the water. Has no effect on bump mapped water!}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=surfaceAlpha|type=float|default=0.55&lt;br /&gt;
|description= Transparency of the water surface. 0 meaning almost fully transparent water plane(low amount of reflections visible), and 1 being nearly opaque (massive amount of reflections)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=diffuseColor|type=rgb|default=value&lt;br /&gt;
|description=This specifies the diffuse color of the water body. WARNING: use of this tag disables the effect of WaterAbsorb , in fact, this tag does nothing but disable WaterAbsorb. Avoid}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=specularColor|type=rgb|default=lighting.groundDiffuseColor}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMin|type=float|default=0.2}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelMax|type=float|default=0.8}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=fresnelPower|type=float|default=4.0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=reflectionDistortion|type=float|default=1.0&lt;br /&gt;
|description=How much the surface should distort reflections that are cause by waves not being level: ergo it adds more choppyness to your reflections sensible from 0 to 20}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurBase|type=float|default=2.0&lt;br /&gt;
|description=Something to do with blur, but it just seems to cause banding with values under 2 and corruption with values above 10}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=blurExponent|type=float|default=1.5&lt;br /&gt;
|description=How much reflections on water surface should be blurred together with the water surface, lower values meaning clearer reflections, (0.2-5) Warning: above 5 seems to cause water corruption}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinStartFreq|type=float|default=8.0&lt;br /&gt;
|description=Wave sizes, smaller = big waves, sensible: [1,20] (influence the wave sizes)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinLacunarity|type=float|default=3.0&lt;br /&gt;
|description=Defines the size of the perlin waves, small values being big waves ([0.2,5] is sensible)}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=perlinAmplitude|type=float|default=0.9&lt;br /&gt;
|description=Base stillness of water surface, 0 is dead still, 1 is &#039;windy&#039; .This doesnt affect the bump texture depth, besides the fact that this disables the bump texture when set to 0}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=windSpeed|type=float|default=1.0&lt;br /&gt;
|description=does nothing yet}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=shoreWaves|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=forceRendering|type=bool|default=true}}&lt;br /&gt;
&lt;br /&gt;
will have to ask about those undefined tags&lt;br /&gt;
&lt;br /&gt;
== teams ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   teams = {&lt;br /&gt;
      [0] = {startPos = {x = 2033, z = 852}},&lt;br /&gt;
      [1] = {startPos = {x = 10134, z = 852}},&lt;br /&gt;
      [2] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      [3] = {startPos = {x = 0, z = 0}},&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start positions&lt;br /&gt;
&lt;br /&gt;
== terrainTypes ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   terrainTypes = {&lt;br /&gt;
      [0] = {&lt;br /&gt;
         name = &amp;quot;Default&amp;quot;,&lt;br /&gt;
         hardness = 1.0,&lt;br /&gt;
         receiveTracks = true,&lt;br /&gt;
         moveSpeeds = {&lt;br /&gt;
            tank  = 1.0,&lt;br /&gt;
            kbot  = 1.0,&lt;br /&gt;
            hover = 1.0,&lt;br /&gt;
            ship  = 1.0,&lt;br /&gt;
         },&lt;br /&gt;
      },&lt;br /&gt;
      [1]  = { &lt;br /&gt;
         ...&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Holds an array of start types where each element contains:&lt;br /&gt;
&lt;br /&gt;
{{tag|name=name|type=string&lt;br /&gt;
|description=A label for the terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=hardness|type=float|range=[0.001-max]|default=1.0&lt;br /&gt;
|description=Used as a multiplier against the mapinfo.mapHardness value. Can be used to make a particular terrain type softer or harder. A value of &#039;1&#039; will make it as hard as MapHardness, and 0.5 will make it half as hard}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=receiveTracks|type=bool|default=true&lt;br /&gt;
|description= Effects whether track decals will be placed on the ground from moving vehicles}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.tank|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for tanks when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.kbot|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for kbots when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.hover|type=float|range=[0.0-max]|default=1.0&lt;br /&gt;
|description= Speed multiplier for hovercraft when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
{{tag|name=moveSpeeds.ship|type=float|range=[0.0-max]|default=1&lt;br /&gt;
|description= Speed multiplier for ships when travelling on the parent terrain type. A value of &#039;1.0&#039; is normal speed, 0.5 will make them travel at half speed on the parent terrain type}}&lt;br /&gt;
&lt;br /&gt;
== custom ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   custom = {&lt;br /&gt;
      fog = {&lt;br /&gt;
         color    = {0.26, 0.30, 0.41},&lt;br /&gt;
         height   = &amp;quot;80%&amp;quot;, --// allows either absolue sizes or in percent of map&#039;s MaxHeight&lt;br /&gt;
         fogatten = 0.003,&lt;br /&gt;
      },&lt;br /&gt;
      precipitation = {&lt;br /&gt;
         density   = 30000,&lt;br /&gt;
         size      = 1.5,&lt;br /&gt;
         speed     = 50,&lt;br /&gt;
         windscale = 1.2,&lt;br /&gt;
         texture   = &#039;LuaGaia/effects/snowflake.png&#039;,&lt;br /&gt;
      },&lt;br /&gt;
&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Map Dev]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14032</id>
		<title>Mapdev:splatdetailnormals</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14032"/>
		<updated>2016-02-10T12:03:26Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Detail Normal Textures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Detail Normal Texture Splatting (DNTS) =&lt;br /&gt;
&lt;br /&gt;
This extends the existing functionality of SSMF splatted detail textures [[Mapdev:splatdetail]], with the option of specifying 4 different (normal map + greyscale diffuse map) detail textures.&lt;br /&gt;
&lt;br /&gt;
Splatted detail textures only allowed grayscale textures to be overlayed on the map, while DNTS also allows normal maps as well.&lt;br /&gt;
&lt;br /&gt;
Instead of creating a combined detail texture of 4 different single-channel diffuse detail textures stored in a single RGBA image, it uses four separate normal textures. &lt;br /&gt;
&lt;br /&gt;
The textures must contain the normal maps in the RGB channel (standard normal maps), with a diffuse luminance in the alpha channel.&lt;br /&gt;
&lt;br /&gt;
The system uses the same splatDistributionTexture as regular SSMF.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You cannot specify these options in .smd files, only .lua!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example result:&lt;br /&gt;
&lt;br /&gt;
[[File:dnts_example.jpg|960px]]&lt;br /&gt;
== Distribution Image ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, DDS&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGBA&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be stretched over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RGBA Channels are individual greyscale distribution maps which define which detail textures to splat onto the ground. The intensity of the splatted textures is multipled by the pixel values for the corresponding channels.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Example&lt;br /&gt;
| [[File:Mapdev-ddist.gif]] || [[File:Mapdev-ddist.png]]&lt;br /&gt;
|-&lt;br /&gt;
! Detail Distribution maps !! Combined Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Detail Normal Textures ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, DDS &lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB for normal maps only, RGBA for normal map + diffuse map in alpha channel. The Y (green) channel of normal maps should be inverted.&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be tiled over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Detail Normal Texture Example&lt;br /&gt;
| [[File:Mapdev-dnts-normal.jpg|400px]] || [[File:Mapdev-dnts-diffuse-alpha.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Normal texture in RGB channel !! greyscale diffuse in ALPHA channel&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalTex1 .. splatDetailNormalTex4 in the MAP resources section. splatDetailTex will be unused if and of splatDetailNormalTex[1-4] are present. &lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalDiffuseAlpha=1 to enable diffuse textures stored in alpha channels.&lt;br /&gt;
&lt;br /&gt;
splatDetailNormalDiffuseAlpha=0 is the default value, and will ignore all and any alpha channels in the splatDetailNormalTex&#039;s, resulting in a purely normal mapped surface, with no extra diffuse texturing. &lt;br /&gt;
&lt;br /&gt;
texScales and texMults work identically to [[Mapdev:splatdetail]]&lt;br /&gt;
&lt;br /&gt;
== mapinfo.lua ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
      splatDistrTex = &amp;quot;splatDistributionTex.tga&amp;quot;,&lt;br /&gt;
      splatDetailNormalDiffuseAlpha = 1,&lt;br /&gt;
      splatDetailNormalTex = {&lt;br /&gt;
         &amp;quot;sandpebbles_NORM.tga&amp;quot;,&lt;br /&gt;
         &amp;quot;crystal_245_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;grass_91_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;pebbles_250_dnts_u8888.dds&amp;quot;,&lt;br /&gt;
          alpha = true,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14031</id>
		<title>Mapdev:splatdetailnormals</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14031"/>
		<updated>2016-02-10T10:45:41Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Detail Normal Texture Splatting (DNTS) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Detail Normal Texture Splatting (DNTS) =&lt;br /&gt;
&lt;br /&gt;
This extends the existing functionality of SSMF splatted detail textures [[Mapdev:splatdetail]], with the option of specifying 4 different (normal map + greyscale diffuse map) detail textures.&lt;br /&gt;
&lt;br /&gt;
Splatted detail textures only allowed grayscale textures to be overlayed on the map, while DNTS also allows normal maps as well.&lt;br /&gt;
&lt;br /&gt;
Instead of creating a combined detail texture of 4 different single-channel diffuse detail textures stored in a single RGBA image, it uses four separate normal textures. &lt;br /&gt;
&lt;br /&gt;
The textures must contain the normal maps in the RGB channel (standard normal maps), with a diffuse luminance in the alpha channel.&lt;br /&gt;
&lt;br /&gt;
The system uses the same splatDistributionTexture as regular SSMF.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You cannot specify these options in .smd files, only .lua!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Example result:&lt;br /&gt;
&lt;br /&gt;
[[File:dnts_example.jpg|960px]]&lt;br /&gt;
== Distribution Image ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, DDS&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGBA&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be stretched over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RGBA Channels are individual greyscale distribution maps which define which detail textures to splat onto the ground. The intensity of the splatted textures is multipled by the pixel values for the corresponding channels.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Example&lt;br /&gt;
| [[File:Mapdev-ddist.gif]] || [[File:Mapdev-ddist.png]]&lt;br /&gt;
|-&lt;br /&gt;
! Detail Distribution maps !! Combined Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Detail Normal Textures ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, [DDS is supported but not fully recommended because it does not have support for anisotropic filtering] &lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB for normal maps only, RGBA for normal map + diffuse map in alpha channel&lt;br /&gt;
| The Y (green) channel of normal maps should be inverted.&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be tiled over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Detail Normal Texture Example&lt;br /&gt;
| [[File:Mapdev-dnts-normal.jpg|400px]] || [[File:Mapdev-dnts-diffuse-alpha.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Normal texture in RGB channel !! greyscale diffuse in ALPHA channel&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalTex1 .. splatDetailNormalTex4 in the MAP resources section. splatDetailTex will be unused if and of splatDetailNormalTex[1-4] are present. &lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalDiffuseAlpha=1 to enable diffuse textures stored in alpha channels.&lt;br /&gt;
&lt;br /&gt;
splatDetailNormalDiffuseAlpha=0 is the default value, and will ignore all and any alpha channels in the splatDetailNormalTex&#039;s, resulting in a purely normal mapped surface, with no extra diffuse texturing. &lt;br /&gt;
&lt;br /&gt;
texScales and texMults work identically to [[Mapdev:splatdetail]]&lt;br /&gt;
&lt;br /&gt;
== mapinfo.lua ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
      splatDistrTex = &amp;quot;splatDistributionTex.tga&amp;quot;,&lt;br /&gt;
      splatDetailNormalDiffuseAlpha = 1,&lt;br /&gt;
      splatDetailNormalTex = {&lt;br /&gt;
         &amp;quot;sandpebbles_NORM.tga&amp;quot;,&lt;br /&gt;
         &amp;quot;crystal_245_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;grass_91_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;pebbles_250_dnts_u8888.dds&amp;quot;,&lt;br /&gt;
          alpha = true,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14030</id>
		<title>Mapdev:splatdetailnormals</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Mapdev:splatdetailnormals&amp;diff=14030"/>
		<updated>2016-02-10T10:15:05Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Detail Normal Textures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Detail Normal Texture Splatting (DNTS) =&lt;br /&gt;
&lt;br /&gt;
This extends the existing functionality of SSMF splatted detail textures [[Mapdev:splatdetail]], with the option of specifying 4 different (normal map + greyscale diffuse map) detail textures.&lt;br /&gt;
&lt;br /&gt;
Splatted detail textures only allowed grayscale textures to be overlayed on the map, while DNTS also allows normal maps as well.&lt;br /&gt;
&lt;br /&gt;
Instead of creating a combined detail texture of 4 different single-channel diffuse detail textures stored in a single RGBA image, it uses four separate normal textures. &lt;br /&gt;
&lt;br /&gt;
The textures must contain the normal maps in the RGB channel (standard normal maps), with a diffuse luminance in the alpha channel.&lt;br /&gt;
&lt;br /&gt;
The system uses the same splatDistributionTexture as regular SSMF.&lt;br /&gt;
&lt;br /&gt;
Example result:&lt;br /&gt;
&lt;br /&gt;
[[File:dnts_example.jpg|960px]]&lt;br /&gt;
== Distribution Image ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, DDS&lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGBA&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be stretched over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The RGBA Channels are individual greyscale distribution maps which define which detail textures to splat onto the ground. The intensity of the splatted textures is multipled by the pixel values for the corresponding channels.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Example&lt;br /&gt;
| [[File:Mapdev-ddist.gif]] || [[File:Mapdev-ddist.png]]&lt;br /&gt;
|-&lt;br /&gt;
! Detail Distribution maps !! Combined Result&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Detail Normal Textures ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;100%&amp;quot;&lt;br /&gt;
! width=&amp;quot;15%&amp;quot; | File Location&lt;br /&gt;
| ./maps/&lt;br /&gt;
|-&lt;br /&gt;
! File Format&lt;br /&gt;
| PNG, TGA, [DDS is supported but not fully recommended because it does not have support for anisotropic filtering] &lt;br /&gt;
|-&lt;br /&gt;
! Colour Depth&lt;br /&gt;
| 8bpp&lt;br /&gt;
|-&lt;br /&gt;
! Channels&lt;br /&gt;
| RGB for normal maps only, RGBA for normal map + diffuse map in alpha channel&lt;br /&gt;
| The Y (green) channel of normal maps should be inverted.&lt;br /&gt;
|-&lt;br /&gt;
! Resolution&lt;br /&gt;
| Any, recommended powers of two, will be tiled over the terrain.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Detail Normal Texture Example&lt;br /&gt;
| [[File:Mapdev-dnts-normal.jpg|400px]] || [[File:Mapdev-dnts-diffuse-alpha.jpg|400px]]&lt;br /&gt;
|-&lt;br /&gt;
! Normal texture in RGB channel !! greyscale diffuse in ALPHA channel&lt;br /&gt;
|}&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalTex1 .. splatDetailNormalTex4 in the MAP resources section. splatDetailTex will be unused if and of splatDetailNormalTex[1-4] are present. &lt;br /&gt;
&lt;br /&gt;
Specify splatDetailNormalDiffuseAlpha=1 to enable diffuse textures stored in alpha channels.&lt;br /&gt;
&lt;br /&gt;
splatDetailNormalDiffuseAlpha=0 is the default value, and will ignore all and any alpha channels in the splatDetailNormalTex&#039;s, resulting in a purely normal mapped surface, with no extra diffuse texturing. &lt;br /&gt;
&lt;br /&gt;
texScales and texMults work identically to [[Mapdev:splatdetail]]&lt;br /&gt;
&lt;br /&gt;
== mapinfo.lua ==&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
local mapinfo = {&lt;br /&gt;
   ...&lt;br /&gt;
   resources = {&lt;br /&gt;
      ...&lt;br /&gt;
      splatDistrTex = &amp;quot;splatDistributionTex.tga&amp;quot;,&lt;br /&gt;
      splatDetailNormalDiffuseAlpha = 1,&lt;br /&gt;
      splatDetailNormalTex = {&lt;br /&gt;
         &amp;quot;sandpebbles_NORM.tga&amp;quot;,&lt;br /&gt;
         &amp;quot;crystal_245_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;grass_91_dnts.dds&amp;quot;,&lt;br /&gt;
         &amp;quot;pebbles_250_dnts_u8888.dds&amp;quot;,&lt;br /&gt;
          alpha = true,&lt;br /&gt;
      },&lt;br /&gt;
      ...&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
   splats = {&lt;br /&gt;
      texScales = {0.02, 0.02, 0.02, 0.02},&lt;br /&gt;
      texMults = {1.0, 1.0, 1.0, 1.0},&lt;br /&gt;
   },&lt;br /&gt;
   ...&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
	<entry>
		<id>https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-CobCallins&amp;diff=1918</id>
		<title>Animation-CobCallins</title>
		<link rel="alternate" type="text/html" href="https://springrts-wiki.p2004a.com/mediawiki/index.php?title=Animation-CobCallins&amp;diff=1918"/>
		<updated>2016-02-03T10:10:12Z</updated>

		<summary type="html">&lt;p&gt;Beherith: /* Weapons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Source==&lt;br /&gt;
&lt;br /&gt;
Some (but not all) are listed near the end of this file: {{sourcelink|file=rts/Sim/Units/Scripts/CobInstance.cpp}}&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
Callins have two purposes:&lt;br /&gt;
&lt;br /&gt;
First, they allow a script to be notified when an event happens, such as the unit being created or destroyed.&lt;br /&gt;
&lt;br /&gt;
Second, they allow the engine to get information from the script. Sometimes this is accomplished through a return value, but usually this is done by setting one of the arguments to a function to the requested value.&lt;br /&gt;
&lt;br /&gt;
==Callins==&lt;br /&gt;
&lt;br /&gt;
===General===&lt;br /&gt;
&lt;br /&gt;
*Create(): Called when the unit is created. &amp;quot;Created&amp;quot; means when the unit&#039;s nanoframe is created; if you want to wait until the unit is actually finished, you&#039;ll have to use something like &lt;br /&gt;
&lt;br /&gt;
 while(GET BUILD_PERCENT_LEFT) sleep 250; &lt;br /&gt;
&lt;br /&gt;
*Activate()/Deactivate(): Called when the unit is turned on/off.&lt;br /&gt;
*Killed(severity, corpsetype): Called when the unit is killed. Severity indicates how many percent of the unit&#039;s hit points were dealt by the final blow. Corpsetype basically indicates the number of times the unit and its corpses are destroyed; for example, corpsetype = 3 acts as if the unit is destroyed, the corpse is destroyed, and the corpse&#039;s corpse is destroyed. If it runs out of corpses nothing is left behind. Set corpsetype to the desired value.&lt;br /&gt;
&lt;br /&gt;
===Movement===&lt;br /&gt;
&lt;br /&gt;
*StartMoving()/StopMoving(): Called when the unit starts/stops moving. This includes rotation, so don&#039;t be surprised if StartMoving() sometimes gets called when a unit starts aiming at a target.&lt;br /&gt;
*SetSFXOccupy(terraintype): Supposedly called when the unit changes terrain type, although it didn&#039;t work last time I tried it? Maybe I was using it wrong. terraintype: 0 = transported, 1 = sea, 2 = deep sea (greater than 5 water depth and unit is upright), 4 = land.&lt;br /&gt;
*MoveRate[0...3](): Appears to be the aircraft equivalent of SetSFXOccupy. MoveRate3 doesn&#039;t appear to actually be used. MoveRate1 is called when the aircraft takes off or lands. If the aircraft is not taking off or landing, MoveRate0 is called when the aircraft drops below 1/3 maximum speed, MoveRate2 is called when the aircraft exceeds 2/3 maximum speed, and MoveRate1 is called when the aircraft enters within 1/3-2/3 maximum speed. I don&#039;t know if this actually works.&lt;br /&gt;
*SetDirection(heading): Used only for wind generators. Gives the direction of the wind.&lt;br /&gt;
*SetSpeed(speed): Used for wind generators, tidals, and mexes. Basically more resources = higher speed.&lt;br /&gt;
&lt;br /&gt;
Comments:&lt;br /&gt;
* MoveRate0 ... Moverate3 only work with gunship type of aircraft: &lt;br /&gt;
[http://springrts.com/phpbb/viewtopic.php?f=14&amp;amp;t=26890&amp;amp;hilit=Moverate0 Forum thread]&lt;br /&gt;
* SetSFXOccupy(terraintype) for aircraft: terraintype = 4 when flying over land and 1 when flying over water. (I used &amp;quot;get IN_WATER&amp;quot; to find out when unit is submerged).&lt;br /&gt;
&lt;br /&gt;
===Weapons===&lt;br /&gt;
&lt;br /&gt;
For weapons, X means either the number of the weapon, or &amp;quot;Primary&amp;quot;, &amp;quot;Secondary&amp;quot;, or &amp;quot;Tertiary&amp;quot; (don&#039;t put &amp;quot;Weapon&amp;quot; for these). I recommend using numbers, since it&#039;s cleaner and you can use more than three weapons that way.&lt;br /&gt;
&lt;br /&gt;
*AimWeaponX(heading, pitch): Called every ~0.5s when the unit is aiming the weapon at a target. This is used to turn a unit&#039;s turrets toward the target. Return 1 when the weapon is ready to fire. Alternately, return 0 if you don&#039;t want the weapon to fire (you can use this to disable weapons).&lt;br /&gt;
*AimFromWeaponX(piecenum): You should set piecenum to a piece of the model; LOS is traced from the here to the target to see if the weapon can fire.&lt;br /&gt;
*FireWeaponX(): Called whenever the trigger is pulled on a weapon. This occurs before the &#039;&#039;first&#039;&#039; shot in a burst/projectile salvo (only).&lt;br /&gt;
*ShotX(zero): Called before every shot a weapon fires. This includes burst and projectile tags. This happens after FireWeaponX(), even for the first shot. There&#039;s one input argument which is 0, because of a typo in the source.&lt;br /&gt;
*QueryWeaponX(piecenum): You should set piecenum to a piece of the model. The shot starts from this piece of the model; this is called for this purpose after FireWeaponX() and ShotX(). LOS is also traced from here to the target to see if a weapon can fire. Make sure this is a piece on the weapon&#039;s turret. Not doing this right can cause headaches; example: http://trac.caspring.org/wiki/GunsJammingOnShips&lt;br /&gt;
*EndBurstX(): Called after the last shot in a burst.&lt;br /&gt;
*BlockShotX(in unitID, out block, in usertarget)&lt;br /&gt;
*TargetWeightX(unitID, weightMod)&lt;br /&gt;
*RockUnit(anglex, anglez): Called when the unit fires. Use it to rock the unit on firing, although there are other ways to do this. The angles returned are in unit space, and are multiplied by 500.  &lt;br /&gt;
*HitByWeapon(anglex, anglez): Called when the unit is hit by a weapon. Angles are in unit space and multiplied by 500.&lt;br /&gt;
*HitByWeaponID(anglex, anglez, weapondefid, damage): Called when the unit is hit by a weapon. Angles are in unit space and multiplied by 500.&lt;br /&gt;
*SetMaxReloadTime(time): Called on unit creation. time is the time in ms that it takes the slowest-firing weapon to reload.&lt;br /&gt;
&lt;br /&gt;
===Construction===&lt;br /&gt;
&lt;br /&gt;
*StartBuilding(): Called when the unit starts building.&lt;br /&gt;
*StopBuilding(): Called when the unit stops building.&lt;br /&gt;
*QueryNanoPiece(piecenum): You should set piecenum to the piece you want the nanospray to come from.&lt;br /&gt;
*QueryBuildInfo(piecenum): For factories. You should set piecenum to the piece you want the unit to be built on.&lt;br /&gt;
&lt;br /&gt;
===Transportation===&lt;br /&gt;
*Falling(): Used for airdropping units?&lt;br /&gt;
*Landed(): Used for airdropping units?&lt;br /&gt;
*QueryTransport(piecenum): You should set piecenum to the piece you want the transported unit to be attached to.&lt;br /&gt;
*BeginTransport(): Called when an air transport picks up a unit.&lt;br /&gt;
*EndTransport(): Called when an air transport becomes empty.&lt;br /&gt;
*TransportPickup(): Called when a land transport picks up a unit.&lt;br /&gt;
*TransportDrop(): Called when a land transport becomes empty.&lt;br /&gt;
*StartUnload(): Called when the transport starts the unloading process.&lt;br /&gt;
&lt;br /&gt;
===Landing Pads===&lt;br /&gt;
*QueryLandingPadCount(count): You should set count to the number of landing pads. However, it doesn&#039;t seem to be actually necessary to do this unless you want more than 16 pads.&lt;br /&gt;
*QueryLandingPad(piecenum1, piecenum2, piecenum3...): Set each piecenum to a different landing pad piece.&lt;br /&gt;
&lt;br /&gt;
[[Category:Animation]]&lt;/div&gt;</summary>
		<author><name>Beherith</name></author>
	</entry>
</feed>